140 lines
2.6 KiB
Plaintext
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
|