From 9279e21b84c73a799593adba944535fc7ddfb0d7 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Thu, 29 May 2025 01:21:45 -0500 Subject: [PATCH] moth now filters events to the correct space --- examples/chess/main.js | 20 ++----------- scripts/core/_sdl_video.js | 4 --- scripts/core/engine.js | 24 +++++++++------- scripts/modules/dull.js | 52 ---------------------------------- scripts/modules/ext/camera.js | 1 - scripts/modules/ext/emitter.js | 1 - scripts/modules/graphics.js | 10 +++---- scripts/modules/sdl_gpu.js | 1 - scripts/moth.js | 42 +++++++++++++++++++++++++-- source/jsffi.c | 5 ---- source/prosperon.c | 6 ++-- source/qjs_blob.c | 1 - 12 files changed, 62 insertions(+), 105 deletions(-) delete mode 100644 scripts/modules/dull.js diff --git a/examples/chess/main.js b/examples/chess/main.js index 762601be..8cb3d20c 100644 --- a/examples/chess/main.js +++ b/examples/chess/main.js @@ -1,23 +1,10 @@ /* main.js – runs the demo with your prototype-based grid */ var json = use('json') -var os = use('os') var draw2d = use('draw2d') var blob = use('blob') -var myblob = new blob -myblob.write_bit(1) -myblob.write_bit(0) -myblob.__proto__.toString = function() { - return `[${this.length} bit blob]` -} -log.console(myblob.toString(), myblob, myblob.length) - -var input = use('input') - -input.watch($_) - /*──── import our pieces + systems ───────────────────────────────────*/ var Grid = use('examples/chess/grid'); // your new ctor var MovementSystem = use('examples/chess/movement').MovementSystem; @@ -339,8 +326,6 @@ function joinServer() { }); } -var os = use('os') - $_.receiver(e => { if (e.kind == 'update') send(e, update(e.dt)) @@ -348,7 +333,6 @@ $_.receiver(e => { send(e, draw()) else if (e.type === 'game_start' || e.type === 'move' || e.type === 'greet') log.console("Receiver got message:", e.type, e); - if (e.type === 'quit') os.exit() if (e.type === 'greet') { log.console("Server received greet from client"); @@ -410,4 +394,6 @@ $_.receiver(e => { } else if (e.type === 'key_down') { handleKeyDown(e) } -}) \ No newline at end of file +}) + +var parseq = use('parseq', $_.delay) diff --git a/scripts/core/_sdl_video.js b/scripts/core/_sdl_video.js index b710e082..bb509da3 100644 --- a/scripts/core/_sdl_video.js +++ b/scripts/core/_sdl_video.js @@ -436,12 +436,8 @@ function handle_renderer(msg) { var tex; // Direct surface data - log.console(json.encode(msg.data)) var surf = new surface(msg.data) - log.console("GOT DATA") - log.console(json.encode(msg.data)) - if (!surf) throw new Error("Must provide surface_id or surface data") diff --git a/scripts/core/engine.js b/scripts/core/engine.js index e8faec99..5b3078e8 100644 --- a/scripts/core/engine.js +++ b/scripts/core/engine.js @@ -39,19 +39,21 @@ logs.console = function(msg) console_mod.print(console_rec(caller.line, caller.file, msg)) } -logs.error = function(e) +logs.error = function(msg) { - if (!e) - e = new Error() + var caller = caller_data(4) - if (e instanceof Error) - pprint(`${e.name} : ${e.message} -${e.stack}`, 4) + var err + + if (!msg || !(msg instanceof Error)) + err = new Error() else { - var stack = new Error() - pprint(`${e} -${stack.stack}`,4) + err = msg + msg = undefined } + + console_mod.print(console_rec(caller.line,caller.file,`${msg} +${err.stack}`)) } logs.panic = function(msg) @@ -65,6 +67,8 @@ globalThis.log = new Proxy(logs, { get(target,prop,receiver) { if (target[prop]) return (...args) => args.forEach(arg => target[prop](arg)) + + return noop } }) @@ -588,7 +592,7 @@ if (typeof prosperon.args.program !== 'string') actor_mod.setname(prosperon.args.program) function destroyself() { - log.console(`Got the message to destroy self.`) + log.spam(`Got the message to destroy self.`) dying = true for (var i of underlings) $_.stop(create_actor({id:i})) diff --git a/scripts/modules/dull.js b/scripts/modules/dull.js deleted file mode 100644 index 66798f90..00000000 --- a/scripts/modules/dull.js +++ /dev/null @@ -1,52 +0,0 @@ -/* - the "dull" game engine - - This sets up a lot of different modules to be used altogether -*/ - -var render = use('render') -var layout = use('clay') -var input = use('input') -var emitter = use('emitter') -var os = use('os') -var imgui = use('imgui') -var tracy = use('tracy') - -var last_frame_time = 0 -var timescale = 1 - -last_frame_time = os.now() - -function step() { - var now = os.now() - var dt = now - last_frame_time - last_frame_time = now - - layout.newframe() - - prosperon.appupdate(dt) - input.procdown() - emitter.update(dt * timescale) - prosperon.update(dt * timescale) - - render.setup_draw() - render.setup_hud() - - if (imgui) imgui.prosperon_menu(); - - // Now do the GPU present (calls gpupresent in render.js) - render.present() - - tracy.end_frame() -} - -function start() -{ - -} - -// Return or export them so you can call from a main script -return { - start, - step -} diff --git a/scripts/modules/ext/camera.js b/scripts/modules/ext/camera.js index 4a4a9f5c..a18f0ad7 100644 --- a/scripts/modules/ext/camera.js +++ b/scripts/modules/ext/camera.js @@ -1,6 +1,5 @@ var cam = {} -var os = use('os') var transform = use('transform') var basecam = {} diff --git a/scripts/modules/ext/emitter.js b/scripts/modules/ext/emitter.js index 91032e39..e08a9267 100644 --- a/scripts/modules/ext/emitter.js +++ b/scripts/modules/ext/emitter.js @@ -1,5 +1,4 @@ var color = use('color') -var os = use('os') var graphics = use('graphics') var transform = use('transform') diff --git a/scripts/modules/graphics.js b/scripts/modules/graphics.js index 185e59a1..746d7979 100644 --- a/scripts/modules/graphics.js +++ b/scripts/modules/graphics.js @@ -10,7 +10,7 @@ var renderer_actor = arg[0] var renderer_id = arg[1] var io = use('io') -var os = use('os') +var time = use('time') var res = use('resources') var json = use('json') @@ -27,7 +27,7 @@ graphics.Image = function(surfaceData) { this[CPU] = surfaceData || undefined; this[GPU] = undefined; this[LOADING] = false; - this[LASTUSE] = os.now(); + this[LASTUSE] = time.now(); this.rect = {x:0, y:0, width:1, height:1}; } @@ -35,20 +35,18 @@ graphics.Image = function(surfaceData) { Object.defineProperties(graphics.Image.prototype, { gpu: { get: function() { - this[LASTUSE] = os.now(); + this[LASTUSE] = time.now(); if (!this[GPU] && !this[LOADING]) { this[LOADING] = true; var self = this; // Send message to load texture - log.console("LOADING") send(renderer_actor, { kind: "renderer", id: renderer_id, op: "loadTexture", data: this[CPU] }, function(response) { - log.console("GOT MSG") if (response.error) { log.error("Failed to load texture:") log.error(response.error) @@ -71,7 +69,7 @@ Object.defineProperties(graphics.Image.prototype, { cpu: { get: function() { - this[LASTUSE] = os.now(); + this[LASTUSE] = time.now(); // Note: Reading texture back from GPU requires async operation // For now, return the CPU data if available return this[CPU] diff --git a/scripts/modules/sdl_gpu.js b/scripts/modules/sdl_gpu.js index d83843a0..9b524eae 100644 --- a/scripts/modules/sdl_gpu.js +++ b/scripts/modules/sdl_gpu.js @@ -1,7 +1,6 @@ var render = {} var io = use('io') -var os = use('os') var controller = use('controller') var tracy = use('tracy') var graphics = use('graphics') diff --git a/scripts/moth.js b/scripts/moth.js index 7ba4bcb6..dc9728e6 100644 --- a/scripts/moth.js +++ b/scripts/moth.js @@ -8,6 +8,9 @@ var io = use('io'); var transform = use('transform'); var rasterize = use('rasterize'); var video_actor = use('sdl_video') +var input = use('input') + +input.watch($_) var geometry = use('geometry') @@ -41,6 +44,26 @@ function worldToScreenPoint([wx, wy], camera, winW, winH) { return [ px, py ]; } +function screenToWorldPoint([px, py], camera, winW, winH) { + // 1) undo pixel→NDC within the camera’s viewport + const ndcX = (px - camera.viewport.x * winW) + / (camera.viewport.width * winW) + const ndcY = 1 - (py - camera.viewport.y * winH) + / (camera.viewport.height * winH) + + // 2) compute the world‐window origin (bottom‐left) + const worldX0 = camera.pos[0] + - camera.size[0] * camera.anchor[0] + const worldY0 = camera.pos[1] + - camera.size[1] * camera.anchor[1] + + // 3) map NDC back to world coords + return [ + ndcX * camera.size[0] + worldX0, + ndcY * camera.size[1] + worldY0 + ] +} + var camera = { size: [500,500],//{width:500,height:500}, // pixel size the camera "sees", like its resolution pos: [250,250],//{x:0,y:0}, // where it is @@ -68,7 +91,7 @@ var dir = args[0] if (!io.exists(args[0] + '/main.js')) throw Error(`No main.js found in ${args[0]}`) -log.console('starting game in ' + dir) +log.spam('Starting game in ' + dir) io.mount(dir) @@ -106,8 +129,6 @@ send(video_actor, { render = e.id graphics = use('graphics', video_actor, e.id) - - log.console(`Created window and renderer id ${render}`) }) }) @@ -316,3 +337,18 @@ function loop() }) }) } + +$_.receiver(e => { + if (e.type === 'quit') + $_.stop() + + if (e.type.includes('mouse')) { + if (e.pos) + e.pos = screenToWorldPoint(e.pos, camera, 500, 500) + + if (e.d_pos) + e.d_pos.y *= -1 + } + + send(gameactor, e) +}) \ No newline at end of file diff --git a/source/jsffi.c b/source/jsffi.c index 2c91d0e1..fa6eb4b2 100644 --- a/source/jsffi.c +++ b/source/jsffi.c @@ -1019,8 +1019,6 @@ JSC_CCALL(os_make_texture, int pitch = width*4; size_t pixels_size = pitch * height; - printf("making surface from blob %p of %u bytes\n", raw, len); - // Create JS object with surface data JSValue obj = JS_NewObject(js); JS_SetPropertyStr(js, obj, "width", JS_NewInt32(js, width)); @@ -1576,9 +1574,6 @@ void ffi_load(JSContext *js) arrput(rt->module_registry, MISTLINE(sprite)); arrput(rt->module_registry, MISTLINE(transform)); -// arrput(rt->module_registry, MISTLINE(wota)); -// arrput(rt->module_registry, MISTLINE(nota)); - #ifndef NSTEAM arrput(rt->module_registry, MISTLINE(steam)); #endif diff --git a/source/prosperon.c b/source/prosperon.c index db412188..d4e8b4bb 100644 --- a/source/prosperon.c +++ b/source/prosperon.c @@ -1202,7 +1202,7 @@ static void event2wota_write(WotaBuffer *wb, const SDL_Event *e, int c) { wota_write_number(wb, (double)e->wheel.which); wota_write_text(wb, "scroll"); wota_write_vec2(wb, (double)e->wheel.x, (double)e->wheel.y); - wota_write_text(wb, "mouse"); + wota_write_text(wb, "pos"); wota_write_vec2(wb, (double)e->wheel.mouse_x, (double)e->wheel.mouse_y); break; case SDL_EVENT_MOUSE_BUTTON_UP: @@ -1217,7 +1217,7 @@ static void event2wota_write(WotaBuffer *wb, const SDL_Event *e, int c) { wota_write_text(wb, mouse_button_to_string(e->button.button)); wota_write_text(wb, "clicks"); wota_write_number(wb, (double)e->button.clicks); - wota_write_text(wb, "mouse"); + wota_write_text(wb, "pos"); wota_write_vec2(wb, (double)e->button.x, (double)e->button.y); break; case SDL_EVENT_SENSOR_UPDATE: @@ -1536,8 +1536,6 @@ int main(int argc, char **argv) actor_argv[0] = argv[0]; // Keep the program name create_actor(actor_argc, actor_argv, NULL); - cores = 1; - /* Start the thread that pumps ready actors, one per logical core. */ for (int i = 0; i < cores; i++) { char threadname[128]; diff --git a/source/qjs_blob.c b/source/qjs_blob.c index b57157d5..9f5c24a2 100644 --- a/source/qjs_blob.c +++ b/source/qjs_blob.c @@ -602,7 +602,6 @@ JSValue js_blob_use(JSContext *js) { JSValue js_new_blob_stoned_copy(JSContext *js, void *data, size_t bytes) { - printf("Making blob from %p with %u bytes\n", data, bytes); blob *b = blob_new(bytes*8); memcpy(b->data, data, bytes); b->bit_length = bytes * 8; // Set the actual length in bits