This commit is contained in:
2026-01-07 14:25:11 -06:00
parent 0522b967ca
commit 4ea9d43a94
9 changed files with 302 additions and 69 deletions

56
core.cm
View File

@@ -13,6 +13,7 @@
var video = use('sdl3/video')
var events = use('sdl3/input')
var time_mod = use('time')
var debug_imgui = use('debug_imgui')
var core = {}
@@ -48,7 +49,7 @@ core.start = function(config) {
_window = _backend.get_window()
if (config.imgui && imgui.init) {
if ((config.imgui || config.editor) && imgui.init) {
imgui.init(_window, _backend.get_device())
}
@@ -75,12 +76,19 @@ core.window_size = function() {
core.backend = function() {
return _backend
}
// FPS tracking
var _fps_samples = []
var _fps_sample_count = 60
var _current_fps = 0
var _frame_time_ms = 0
// Main loop
function _main_loop() {
var frame_start = time_mod.number()
if (!_running) return
var now = time_mod.number()
var now = frame_start
var dt = now - _last_time
_last_time = now
@@ -90,7 +98,7 @@ function _main_loop() {
var win_size = _backend.get_window_size()
for (var ev of evts) {
if (_config.imgui) {
if (_config.imgui || _config.editor) {
imgui.process_event(ev)
}
@@ -117,9 +125,12 @@ function _main_loop() {
_config.update(dt)
}
var imgui_mod = use('imgui')
var debug_imgui = use('debug_imgui')
// ImGui Frame
if (_config.imgui) {
imgui.newframe()
if (_config.imgui || _config.editor) {
imgui_mod.newframe()
}
// Render
@@ -133,12 +144,24 @@ function _main_loop() {
}
var dbg = _config.debug == 'cmd'
// Build stats for debug_imgui
var stats = {
fps: _current_fps,
frame_time_ms: _frame_time_ms
}
// Handle both compositor result ({commands: [...]}) and fx_graph (graph object)
if (render_result.commands) {
if (_config.imgui) {
if (_config.imgui || _config.editor) {
render_result.commands.push({
cmd: 'imgui',
draw: _config.imgui,
draw: function(ui) {
if (_config.imgui) _config.imgui(ui)
if (_config.editor) {
debug_imgui.render(ui, null, render_result.plan, stats)
_config.editor(ui)
}
},
target: 'screen'
})
}
@@ -156,9 +179,26 @@ function _main_loop() {
}
}
// Measure actual frame work time (excluding delay)
var frame_end = time_mod.number()
var actual_frame_time = frame_end - frame_start
// Track FPS based on actual work time
_frame_time_ms = actual_frame_time * 1000
_fps_samples.push(actual_frame_time)
if (_fps_samples.length > _fps_sample_count) {
_fps_samples.shift()
}
var avg_frame_time = 0
for (var i = 0; i < _fps_samples.length; i++) {
avg_frame_time += _fps_samples[i]
}
avg_frame_time = avg_frame_time / _fps_samples.length
_current_fps = avg_frame_time > 0 ? 1 / avg_frame_time : 0
// Schedule next frame
var frame_time = 1 / _framerate
var elapsed = time_mod.number() - now
var elapsed = frame_end - frame_start
var delay = frame_time - elapsed
if (delay < 0) delay = 0