Files
prosperon/core.cm
2025-12-22 16:21:21 -06:00

140 lines
2.6 KiB
Plaintext

// core.cm - Minimal entry point for prosperon rendering
//
// Usage:
// var core = use('prosperon/core')
// core.start({
// width: 1280,
// height: 720,
// title: "My Game",
// update: function(dt) { ... },
// render: function() { return graph }
// })
var video = use('sdl3/video')
var events = use('sdl3/events')
var time_mod = use('time')
var core = {}
// Private state
var _running = false
var _config = null
var _backend = null
var _window = null
var _last_time = 0
var _framerate = 60
// Start the application
core.start = function(config) {
_config = config
_framerate = config.framerate || 60
// Initialize SDL GPU backend
var sdl_gpu = use('sdl_gpu')
_backend = sdl_gpu
var init_result = _backend.init({
width: config.width || 1280,
height: config.height || 720,
title: config.title || "Prosperon"
})
if (!init_result) {
log.console("core: Failed to initialize backend")
return false
}
_window = _backend.get_window()
_running = true
_last_time = time_mod.number()
// Start main loop
_main_loop()
return true
}
// Stop the application
core.stop = function() {
_running = false
}
// Get window size
core.window_size = function() {
return _backend.get_window_size()
}
// Get backend for direct access
core.backend = function() {
return _backend
}
// Main loop
function _main_loop() {
if (!_running) return
var now = time_mod.number()
var dt = now - _last_time
_last_time = now
// Process events
var evts = []
var ev
while ((ev = events.poll()) != null) {
evts.push(ev)
}
var win_size = _backend.get_window_size()
for (var ev of evts) {
if (ev.type == 'quit') {
_running = false
$stop()
return
}
if (ev.type == 'window_pixel_size_changed') {
win_size.width = ev.data1
win_size.height = ev.data2
if (_backend.set_window_size) {
_backend.set_window_size(ev.width, ev.height)
}
}
if (_config.input) {
_config.input(ev)
}
}
// Update
if (_config.update) {
_config.update(dt)
}
// Render
if (_config.render) {
var graph = _config.render()
if (graph) {
if (_config.debug== 'graph') {
log.console(graph)
$stop()
return
}
var dbg = _config.debug == 'cmd'
_backend.execute_graph(graph, win_size, dbg)
if (dbg) {
$stop()
return
}
}
}
// Schedule next frame
var frame_time = 1 / _framerate
var elapsed = time_mod.number() - now
var delay = frame_time - elapsed
if (delay < 0) delay = 0
$delay(_main_loop, delay)
}
return core