From 4843981527210aafcd400394a455c967757d0d7c Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Mon, 11 Mar 2024 22:23:02 -0500 Subject: [PATCH] Move input handling to script only --- Makefile | 2 +- scripts/components.js | 12 +- scripts/editor.js | 46 +++--- scripts/engine.js | 46 ++---- scripts/gui.js | 2 +- scripts/input.js | 187 ++++++++++++++++++++---- source/engine/3d/model.c | 5 + source/engine/input.c | 300 +------------------------------------- source/engine/input.h | 21 --- source/engine/jsffi.c | 66 +-------- source/engine/render.c | 7 +- source/engine/resources.c | 2 +- source/engine/script.c | 38 +---- source/engine/script.h | 18 --- source/engine/window.c | 7 +- source/engine/yugine.c | 36 +++-- 16 files changed, 246 insertions(+), 549 deletions(-) diff --git a/Makefile b/Makefile index 37a468f..280615a 100755 --- a/Makefile +++ b/Makefile @@ -180,7 +180,7 @@ ifdef STEAM # BIN += /steam endif -WARNING_FLAGS = -Wno-incompatible-function-pointer-types +WARNING_FLAGS = -Wno-incompatible-function-pointer-types -Wno-incompatible-pointer-types NAME = primum$(EXT) SEM = 0.3.0 diff --git a/scripts/components.js b/scripts/components.js index 4e6765c..637dfe5 100644 --- a/scripts/components.js +++ b/scripts/components.js @@ -442,14 +442,14 @@ polygon2d.inputs.f10 = function() { polygon2d.inputs.f10.doc = "Sort all points to be CCW order."; polygon2d.inputs['C-lm'] = function() { - this.points.push(this.gameobject.world2this(Mouse.worldpos)); + this.points.push(this.gameobject.world2this(Mouse.worldpos())); }; polygon2d.inputs['C-lm'].doc = "Add a point to location of mouse."; polygon2d.inputs.lm = function(){}; polygon2d.inputs.lm.released = function(){}; polygon2d.inputs['C-M-lm'] = function() { - var idx = Math.grab_from_points(Mouse.worldpos, this.points.map(p => this.gameobject.this2world(p)), 25); + var idx = Math.grab_from_points(Mouse.worldpos(), this.points.map(p => this.gameobject.this2world(p)), 25); if (idx === -1) return; this.points.splice(idx, 1); }; @@ -753,7 +753,7 @@ bucket.inputs['C-o'].doc = "Set spline to linear."; bucket.inputs['C-M-lm'] = function() { if (Spline.is_catmull(this.type)) { - var idx = Math.grab_from_points(Mouse.worldpos, this.points.map(p => this.gameobject.this2world(p)), 25); + var idx = Math.grab_from_points(Mouse.worldpos(), this.points.map(p => this.gameobject.this2world(p)), 25); if (idx === -1) return; } else { @@ -763,16 +763,16 @@ bucket.inputs['C-M-lm'] = function() { }; bucket.inputs['C-M-lm'].doc = "Select the given point as the '0' of this spline."; -bucket.inputs['C-lm'] = function() { this.add_node(Mouse.worldpos); } +bucket.inputs['C-lm'] = function() { this.add_node(Mouse.worldpos()); } bucket.inputs['C-lm'].doc = "Add a point to the spline at the mouse position."; bucket.inputs['C-M-lm'] = function() { var idx = -1; if (Spline.is_catmull(this.type)) - idx = Math.grab_from_points(Mouse.worldpos, this.points.map(p => this.gameobject.this2world(p)), 25); + idx = Math.grab_from_points(Mouse.worldpos(), this.points.map(p => this.gameobject.this2world(p)), 25); else { var nodes = Spline.bezier_nodes(this.points); - idx = Math.grab_from_points(Mouse.worldpos, nodes.map(p => this.gameobject.this2world(p)), 25); + idx = Math.grab_from_points(Mouse.worldpos(), nodes.map(p => this.gameobject.this2world(p)), 25); idx *= 3; } diff --git a/scripts/editor.js b/scripts/editor.js index 6024598..0009e97 100644 --- a/scripts/editor.js +++ b/scripts/editor.js @@ -25,7 +25,7 @@ var editor = { desktop: undefined, /* The editor desktop, where all editing objects live */ working_layer: 0, get cursor() { - if (this.selectlist.length === 0 ) return Mouse.worldpos; + if (this.selectlist.length === 0 ) return Mouse.worldpos(); return physics.com(this.selectlist.map(x => x.pos)); }, edit_mode: "basic", @@ -35,7 +35,7 @@ var editor = { get_that() { return this.selectlist.length === 1 ? this.selectlist[0] : this.get_this(); }, try_select() { /* nullify true if it should set selected to null if it doesn't find an object */ - var go = physics.pos_query(Mouse.worldpos); + var go = physics.pos_query(Mouse.worldpos()); return this.do_select(go); }, @@ -382,7 +382,7 @@ var editor = { /* Draw selection box */ if (this.sel_start) { - var endpos = Mouse.worldpos; + var endpos = Mouse.worldpos(); var c = []; c[0] = (endpos[0] - this.sel_start[0]) / 2; c[0] += this.sel_start[0]; @@ -462,7 +462,7 @@ var editor = { render.circle(x[1].screenpos(),10,Color.blue.alpha(0.3)); }); - var mg = physics.pos_query(Mouse.worldpos,10); + var mg = physics.pos_query(Mouse.worldpos(),10); if (mg) { var p = mg.path_from(thiso); @@ -530,7 +530,7 @@ var editor = { load(urstr) { var obj = editor.edit_level.spawn(urstr); - obj.set_worldpos(Mouse.worldpos); + obj.set_worldpos(Mouse.worldpos()); this.selectlist = [obj]; }, @@ -611,7 +611,7 @@ var editor = { editor.new_object = function() { var obj = editor.edit_level.spawn(); - obj.set_worldpos(Mouse.worldpos); + obj.set_worldpos(Mouse.worldpos()); this.selectlist = [obj]; return obj; } @@ -657,7 +657,7 @@ editor.inputs.drop = function(str) { return; } - var mg = physics.pos_query(Mouse.worldpos,10); + var mg = physics.pos_query(Mouse.worldpos(),10); if (!mg) return; var img = mg.get_comp_by_name('sprite'); if (!img) return; @@ -804,7 +804,7 @@ editor.inputs['C-r'].doc = "Negate the selected's angle."; editor.inputs.r = function() { if (editor.sel_comp && 'angle' in editor.sel_comp) { - var relpos = Mouse.worldpos.sub(editor.sel_comp.gameobject.worldpos()); + var relpos = Mouse.worldpos().sub(editor.sel_comp.gameobject.worldpos()); editor.startoffset = Math.atan2(relpos.y, relpos.x); editor.startrot = editor.sel_comp.angle; @@ -813,7 +813,7 @@ editor.inputs.r = function() { editor.rotlist = []; editor.selectlist.forEach(function(x) { - var relpos = Mouse.worldpos.sub(editor.cursor); + var relpos = Mouse.worldpos().sub(editor.cursor); editor.rotlist.push({ obj: x, angle: x.angle, @@ -1026,7 +1026,7 @@ editor.inputs.f3 = function() { this.openpanel(componentexplorer); }; -editor.inputs.lm = function() { editor.sel_start = Mouse.worldpos; }; +editor.inputs.lm = function() { editor.sel_start = Mouse.worldpos(); }; editor.inputs.lm.doc = "Selection box."; editor.inputs.lm.released = function() { @@ -1043,11 +1043,11 @@ editor.inputs.lm.released = function() { var selects = []; /* TODO: selects somehow gets undefined objects in here */ - if (Vector.equal(Mouse.worldpos, editor.sel_start, 5)) { + if (Vector.equal(Mouse.worldpos(), editor.sel_start, 5)) { var sel = editor.try_select(); if (sel) selects.push(sel); } else { - var box = bbox.frompoints([editor.sel_start, Mouse.worldpos]); + var box = bbox.frompoints([editor.sel_start, Mouse.worldpos()]); var hits = physics.box_query(bbox.tocwh(box)); @@ -1104,7 +1104,7 @@ editor.try_pick = function() editor.grabselect = []; if (editor.sel_comp && 'pick' in editor.sel_comp) - return editor.sel_comp.pick(Mouse.worldpos); + return editor.sel_comp.pick(Mouse.worldpos()); return editor.try_select(); } @@ -1112,7 +1112,7 @@ editor.try_pick = function() editor.inputs.mm = function() { if (editor.brush_obj) { editor.selectlist = editor.dup_objects([editor.brush_obj]); - editor.selectlist[0].pos = Mouse.worldpos; + editor.selectlist[0].pos = Mouse.worldpos(); editor.grabselect = editor.selectlist[0]; return; } @@ -1126,18 +1126,18 @@ editor.inputs['C-mm'] = editor.inputs.mm; editor.inputs['C-M-lm'] = function() { - var go = physics.pos_query(Mouse.worldpos); + var go = physics.pos_query(Mouse.worldpos()); if (!go) return; editor.edit_level = go.master; } editor.inputs['C-M-mm'] = function() { - editor.mousejoy = Mouse.pos; + editor.mousejoy = Mouse.screenpos(); editor.joystart = editor.camera.pos; }; editor.inputs['C-M-rm'] = function() { - editor.mousejoy = Mouse.pos; + editor.mousejoy = Mouse.screenpos(); editor.z_start = editor.camera.zoom; Mouse.disabled(); }; @@ -1170,7 +1170,7 @@ editor.inputs.mouse.move = function(pos, dpos) x.sync(); }); - var relpos = Mouse.worldpos.sub(editor.cursor); + var relpos = Mouse.worldpos().sub(editor.cursor); var dist = Vector.length(relpos); editor.scalelist?.forEach(function(x) { @@ -1205,7 +1205,7 @@ editor.inputs.mouse['C-scroll'] = function(scroll) editor.camera.zoom += scroll.y/100; } -editor.inputs['C-M-S-lm'] = function() { editor.selectlist[0].set_center(Mouse.worldpos); }; +editor.inputs['C-M-S-lm'] = function() { editor.selectlist[0].set_center(Mouse.worldpos()); }; editor.inputs['C-M-S-lm'].doc = "Set world center to mouse position."; editor.inputs.delete = function() { @@ -1242,7 +1242,7 @@ editor.inputs.g = function() { if (editor.sel_comp) { if ('pick' in editor.sel_comp) { - editor.grabselect = [editor.sel_comp.pick(Mouse.worldpos)]; + editor.grabselect = [editor.sel_comp.pick(Mouse.worldpos())]; return; } @@ -1259,7 +1259,7 @@ editor.inputs.g = function() { } if (editor.sel_comp && 'pick' in editor.sel_comp) { - var o = editor.sel_comp.pick(Mouse.worldpos); + var o = editor.sel_comp.pick(Mouse.worldpos()); if (o) editor.grabselect = [o]; return; } @@ -1386,7 +1386,7 @@ compmode.inputs['C-x'] = function() {}; editor.scalelist = []; editor.inputs.s = function() { - var scaleoffset = Vector.length(Mouse.worldpos.sub(editor.cursor)); + var scaleoffset = Vector.length(Mouse.worldpos().sub(editor.cursor)); editor.scalelist = []; if (editor.sel_comp) { @@ -1593,7 +1593,7 @@ replpanel.inputs = Object.create(inputpanel.inputs); replpanel.inputs.block = true; replpanel.inputs.lm = function() { - var mg = physics.pos_query(Mouse.worldpos); + var mg = physics.pos_query(Mouse.worldpos()); if (!mg) return; var p = mg.path_from(editor.get_this()); this.value = p; diff --git a/scripts/engine.js b/scripts/engine.js index 4935a35..d571935 100644 --- a/scripts/engine.js +++ b/scripts/engine.js @@ -57,10 +57,8 @@ global.check_registers = function(obj) var signal = k.fromfirst("on_"); Event.observe(signal, obj, obj[k]); }; - } - eval_env.dov = `Counterpart to /load_env/, but with a string.`; function feval_env(file, env) @@ -88,6 +86,7 @@ global.mixin("scripts/render.js"); global.Game = { engine_start(fn) { + console.warn("engine starting."); cmd(257, fn); }, @@ -163,16 +162,7 @@ Game.doc.dt = "Current frame dt."; Game.doc.view_camera = "Set the camera for the current view."; Game.doc.camera = "Current camera."; -global.mixin("scripts/input.js"); -global.mixin("scripts/std.js"); - -global.mixin("scripts/diff.js"); - -console.level = 1; - -global.mixin("scripts/color.js"); - -var prosperon = {}; +global.prosperon = {}; prosperon.version = cmd(255); prosperon.revision = cmd(256); @@ -225,7 +215,11 @@ Range is given by a semantic versioning number, prefixed with nothing, a ~, or a ~ means that MAJOR and MINOR must match exactly, but any PATCH greater or equal is valid. ^ means that MAJOR must match exactly, but any MINOR and PATCH greater or equal is valid.`; - +global.mixin("scripts/input.js"); +global.mixin("scripts/std.js"); +console.level = 1; +global.mixin("scripts/diff.js"); +global.mixin("scripts/color.js"); global.mixin("scripts/gui.js"); var timer = { @@ -253,10 +247,7 @@ var timer = { }; global.mixin("scripts/tween.js"); - global.mixin("scripts/physics.js"); - - global.mixin("scripts/ai.js"); global.mixin("scripts/geometry.js"); @@ -315,7 +306,7 @@ var Register = { registries: [], - add_cb(idx, name) { + add_cb(name) { var n = {}; var fns = []; @@ -326,11 +317,9 @@ var Register = { fns.push(fn); return function() { fns.remove(fn); }; } - n.broadcast = function(...args) { fns.forEach(x => x(...args)); } + prosperon[name] = function(...args) { fns.forEach(x => x(...args)); } n.clear = function() { fns = []; } - register(idx, n.broadcast, n); - Register[name] = n; Register.registries.push(n); @@ -338,16 +327,13 @@ var Register = { }, }; -Register.add_cb(0, "update").doc = "Called once per frame."; -Register.add_cb(11, "appupdate"); -Register.add_cb(1, "physupdate"); -Register.add_cb(2, "gui"); -Register.add_cb(6, "debug"); -register(7, Register.kbm_input, Register); -Register.add_cb(8, "gamepad_input"); -Register.add_cb(10, "draw"); - -register(9, console.stack, this); +Register.add_cb("update").doc = "Called once per frame."; +Register.add_cb("appupdate"); +Register.add_cb("physupdate"); +Register.add_cb("gui"); +Register.add_cb("debug"); +Register.add_cb("gamepad_input"); +Register.add_cb("draw"); Register.gamepad_playermap[0] = Player.players[0]; diff --git a/scripts/gui.js b/scripts/gui.js index 467d9e9..037d49b 100644 --- a/scripts/gui.js +++ b/scripts/gui.js @@ -84,7 +84,7 @@ GUI.controls.set_mum = function(mum) } GUI.controls.check_bb = function(mum) { - if (bbox.pointin(mum.bb, Mouse.pos)) + if (bbox.pointin(mum.bb, Mouse.screenpos())) GUI.controls.set_mum(mum); } GUI.controls.inputs = {}; diff --git a/scripts/input.js b/scripts/input.js index 6c4f2fa..63705f6 100644 --- a/scripts/input.js +++ b/scripts/input.js @@ -1,7 +1,130 @@ +var keycodes = { + 0x00E: "back", + 0x00F: "tab", + 0x01C: "enter", + 0x001: "esc", + 0x039: "space", + 0x149: "pgup", + 0x151: "pgdown", + 0x14F: "end", + 0x147: "home", + 0x14B: "left", + 0x148: "up", + 0x14D: "right", + 0x150: "down", + 0x152: "insert", + 0x153: "delete", + 45: "minus", +}; + +var mod = { + shift: 0, + ctrl: 0, + alt: 0, + super: 0 +}; + +/* +released +rep +pressed +pressrep +down +*/ + +function keyname_extd(key) +{ + if (key > 289 && key < 302) { + var num = key-289; + return `f${num}`; + } + + if (key >= 320 && key <= 329) { + var num = key-320; + return `kp${num}`; + } + + if (keycodes[key]) return keycodes[key]; + if (key >= 32 && key <= 126) return String.fromCharCode(key).lc(); + + return undefined; +} + +prosperon.keys = []; + +function modstr() +{ + var s = ""; + if (mod.ctrl) s += "C-"; + if (mod.alt) s += "M-"; + if (mod.super) s += "S-"; + return s; +} + +prosperon.keydown = function(key, repeat) +{ + prosperon.keys[key] = true; + + if (key == 341 || key == 345) + mod.ctrl = 1; + else if (key == 342 || key == 346) + mod.alt = 1; + else if (key == 343 || key == 347) + mod.super = 1; + else if (key == 340 || key == 344) + mod.shift = 1; + else { + var emacs = modstr() + keyname_extd(key); + player[0].raw_input(emacs, "pressrep"); + if (repeat) + player[0].raw_input(emacs, "rep"); + else + player[0].raw_input(emacs, "pressed"); + } +} + +prosperon.keyup = function(key) +{ + prosperon.keys[key] = false; + if (key == 341 || key == 345) + mod.ctrl = 0; + else if (key == 342 || key == 346) + mod.alt = 0; + else if (key == 343 || key == 347) + mod.super = 0; + else if (key == 340 || key == 344) + mod.shift = 0; + else { + var emacs = modstr() + keyname_extd(key); + player[0].raw_input(emacs, "released"); + } +} + +prosperon.droppedfile = function(path) +{ + player[0].raw_input("drop", "pressed", path); +} + +var mousepos = [0,0]; + +prosperon.textinput = function(){}; +prosperon.mousemove = function(pos, dx){ + mousepos = pos; + player[0].mouse_input(modstr() + "move", pos, dx); +}; +prosperon.mousescroll = function(dx){ + player[0].mouse_input(modstr() + "scroll", dx); +}; +prosperon.mousedown = function(b){ + player[0].raw_input(modstr() + Mouse.button[b], "pressed"); +}; +prosperon.mouseup = function(b){ + player[0].raw_input(modstr() + Mouse.button[b], "released"); +}; + var Mouse = { - get pos() { return cmd(45); }, - screenpos() { return cmd(45); }, - get worldpos() { return Window.screen2world(cmd(45)); }, + screenpos() { return mousepos.slice(); }, + worldpos() { return Window.screen2world(mousepos); }, disabled() { cmd(46, 1); }, normal() { cmd(46, 0);}, @@ -21,6 +144,12 @@ var Mouse = { Mouse.custom[mode] = img; } }, + + button: { /* left, right, middle mouse */ + 0: "lm", + 1: "rm", + 2: "mm" + }, custom:[], cursor: { default: 0, @@ -44,10 +173,9 @@ Mouse.disabled.doc = "Set the mouse to hidden. This locks it to the game and hid Mouse.normal.doc = "Set the mouse to show again after hiding."; var Keys = { - shift() { return cmd(50, 340); }, - ctrl() { return cmd(50, 341); }, - alt() { return cmd(50, 342); }, - super() { return cmd(50, 343); }, + down(code) { + return prosperon.keys[code]; + }, }; var input = {}; @@ -115,9 +243,9 @@ var Player = { for (var pawn of this.pawns.reversed()) { if (typeof pawn.inputs?.mouse?.[type] === 'function') { pawn.inputs.mouse[type].call(pawn,...args); - pawn.inputs.post?.call(pawn); - if (!pawn.inputs.fallthru) - return; + pawn.inputs.post?.call(pawn); + if (!pawn.inputs.fallthru) + return; } } }, @@ -126,9 +254,9 @@ var Player = { for (var pawn of this.pawns.reversed()) { if (typeof pawn.inputs?.char === 'function') { pawn.inputs.char.call(pawn, c); - pawn.inputs.post?.call(pawn); - if (!pawn.inputs.fallthru) - return; + pawn.inputs.post?.call(pawn); + if (!pawn.inputs.fallthru) + return; } }; }, @@ -137,40 +265,41 @@ var Player = { for (var pawn of this.pawns.reversed()) { if (typeof pawn.inputs?.any === 'function') { pawn.inputs.any(cmd); - if (!pawn.inputs.fallthru) + + if (!pawn.inputs.fallthru) return; } if (!pawn.inputs?.[cmd]) { if (pawn.inputs?.block) return; - continue; + continue; } - var fn = null; + var fn = null; switch (state) { case 'pressed': - fn = pawn.inputs[cmd]; - break; - case 'rep': - fn = pawn.inputs[cmd].rep ? pawn.inputs[cmd] : null; - break; - case 'released': - fn = pawn.inputs[cmd].released; - break; - case 'down': - fn = pawn.inputs[cmd].down; + fn = pawn.inputs[cmd]; + break; + case 'rep': + fn = pawn.inputs[cmd].rep ? pawn.inputs[cmd] : null; + break; + case 'released': + fn = pawn.inputs[cmd].released; + break; + case 'down': + fn = pawn.inputs[cmd].down; } if (typeof fn === 'function') { fn.call(pawn, ... args); - pawn.inputs.post?.call(pawn); + pawn.inputs.post?.call(pawn); } switch (state) { case 'released': - pawn.inputs.release_post?.call(pawn); - break; + pawn.inputs.release_post?.call(pawn); + break; } if (!pawn.inputs.fallthru) return; diff --git a/source/engine/3d/model.c b/source/engine/3d/model.c index 06eb1c4..0e8b317 100644 --- a/source/engine/3d/model.c +++ b/source/engine/3d/model.c @@ -259,6 +259,11 @@ void mesh_add_primitive(mesh *mesh, cgltf_primitive *prim) case cgltf_attribute_type_invalid: YughWarn("Invalid type."); break; + + case cgltf_attribute_type_custom: + break; + case cgltf_attribute_type_max_enum: + break; } } /* diff --git a/source/engine/input.c b/source/engine/input.c index 5e03b08..ac27c25 100644 --- a/source/engine/input.c +++ b/source/engine/input.c @@ -10,199 +10,12 @@ #include "resources.h" #include "jsffi.h" -static int mouse_states[3] = {INPUT_UP}; -static int key_states[512] = {INPUT_UP}; - -HMM_Vec2 mousewheel = {0,0}; -HMM_Vec2 mouse_pos = {0, 0}; -HMM_Vec2 mouse_delta = {0, 0}; - -struct joystick { - int id; -}; - -static int *downkeys = NULL; -static struct joystick *joysticks = NULL; - -static int mquit = 0; - static struct callee pawn_callee; static struct callee gamepad_callee; -void add_downkey(int key) { - for (int i = 0; i < arrlen(downkeys); i++) - if (downkeys[i] == key) return; - - arrput(downkeys, key); -} - -void rm_downkey(int key) { - for (int i = 0; i < arrlen(downkeys); i++) - if (downkeys[i] == key) { - arrdelswap(downkeys, i); - return; - } -} - -char *mb2str(int btn) -{ - switch(btn) { - case 0: - return "lm"; - break; - case 1: - return "rm"; - break; - case 2: - return "mm"; - break; - } - return "NULLMOUSE"; -} - -JSValue input2js(int state) -{ - switch(state) { - case INPUT_UP: return jstr("released"); - case INPUT_REPEAT: return jstr("rep"); - case INPUT_DOWN: return jstr("pressed"); - case 3: return jstr("pressrep"); - case 4: return jstr("down"); - } - return JS_UNDEFINED; -} - -void input_mouse(int btn, int state, uint32_t mod) -{ - char out[16] = {0}; - snprintf(out, 16, "%s%s%s%s", - mod & SAPP_MODIFIER_CTRL ? "C-" : "", - mod & SAPP_MODIFIER_ALT ? "M-" : "", - mod & SAPP_MODIFIER_SUPER ? "S-" : "", - mb2str(btn) - ); - - JSValue argv[3]; - argv[0] = jstr("emacs"); - argv[1] = jstr(out); - argv[2] = input2js(state); - script_callee(pawn_callee, 3, argv); -} - -void input_mouse_move(float x, float y, float dx, float dy, uint32_t mod) -{ - mouse_pos.x = x; - mouse_pos.y = mainwin.height - y; - mouse_delta.x = dx; - mouse_delta.y = -dy; - - JSValue argv[4]; - argv[0] = jstr("mouse"); - argv[1] = jstr("move"); - argv[2] = vec2js(mouse_pos); - argv[3] = vec2js(mouse_delta); - script_callee(pawn_callee, 4, argv); - JS_FreeValue(js, argv[2]); - JS_FreeValue(js, argv[3]); -} - -void input_mouse_scroll(float x, float y, uint32_t mod) -{ - mousewheel.x = x; - mousewheel.y = y; - - JSValue argv[4]; - argv[0] = jstr("mouse"); - char out[16] = {0}; - snprintf(out, 16, "%s%s%sscroll", - mod & SAPP_MODIFIER_CTRL ? "C-" : "", - mod & SAPP_MODIFIER_ALT ? "M-" : "", - mod & SAPP_MODIFIER_SUPER ? "S-" : "" - ); - argv[1] = jstr(out); - argv[2] = vec2js(mousewheel); - script_callee(pawn_callee, 3, argv); - JS_FreeValue(js, argv[2]); -} - -void input_btn(int btn, int state, uint32_t mod) -{ - char keystr[16] = {0}; - strncat(keystr,keyname_extd(btn),16); - - if (strlen(keystr) == 1 && mod & SAPP_MODIFIER_SHIFT) - keystr[0] = toupper(keystr[0]); - - char out[16] = {0}; - snprintf(out, 16, "%s%s%s%s", - mod & SAPP_MODIFIER_CTRL ? "C-" : "", - mod & SAPP_MODIFIER_ALT ? "M-" : "", - mod & SAPP_MODIFIER_SUPER ? "S-" : "", - keystr - ); - - JSValue argv[3]; - argv[1] = jstr(out); - argv[2] = input2js(state); - - argv[0] = jstr("emacs"); - script_callee(pawn_callee, 3, argv); - - argv[0] = jstr("action"); - script_callee(pawn_callee, 3, argv); - - if (state == INPUT_DOWN) { - key_states[btn] = INPUT_DOWN; - add_downkey(btn); - } - else if (state == INPUT_UP) { - key_states[btn] = INPUT_UP; - rm_downkey(btn); - } -} - -static const uint32_t UNCHAR_FLAGS = SAPP_MODIFIER_CTRL | SAPP_MODIFIER_ALT | SAPP_MODIFIER_SUPER; - -void input_key(uint32_t key, uint32_t mod) -{ - if (mod & UNCHAR_FLAGS) return; - if (key <= 31 || key >= 127) return; - - JSValue argv[2]; - char s[2] = {key, '\0'}; - argv[0] = jstr("char"); - argv[1] = jstr(s); - script_callee(pawn_callee, 2, argv); -} - -void register_pawn(struct callee c) { - pawn_callee = c; -} - -void register_gamepad(struct callee c) { - gamepad_callee = c; -} - void input_dropped_files(int n) { - JSValue argv[4]; - argv[0] = jstr("emacs"); - argv[1] = jstr("drop"); - argv[2] = jstr("pressed"); - argv[3] = str2js(sapp_get_dropped_file_path(0)); - script_callee(pawn_callee, 4, argv); - JS_FreeValue(js,argv[3]); -} - -static void pawn_call_keydown(int key) { - JSValue argv[4]; - argv[0] = jstr("input"); - argv[1] = jstr("num"); - argv[2] = input2js(INPUT_DOWN); - /* TODO: Could cache */ - argv[3] = JS_NewInt32(js, key); - script_callee(pawn_callee, 4, argv); - JS_FreeValue(js, argv[3]); + script_evalf("prosperon.droppedfile('%s');", sapp_get_dropped_file_path(0)); } /* @@ -211,114 +24,6 @@ static void pawn_call_keydown(int key) { */ void set_mouse_mode(int mousemode) { sapp_lock_mouse(mousemode); } -void input_init() { - for (int i = 0; i < 512; i++) - key_states[i] = INPUT_UP; - - for (int i = 0; i < 3; i++) - mouse_states[i] = INPUT_UP; -} - -#define KEYBUFLEN 50 -char keybuf[KEYBUFLEN]; - -const char *keyname_extd(int key) { - - if (key > 289 && key < 302) { - int num = key - 289; - snprintf(keybuf, KEYBUFLEN, "f%d", num); - return keybuf; - } - - if (key >= 320 && key <= 329) { - int num = key - 320; - snprintf(keybuf, KEYBUFLEN, "kp%d", num); - return keybuf; - } - - switch (key) { - case SAPP_KEYCODE_ENTER: - return "enter"; - case SAPP_KEYCODE_ESCAPE: - return "escape"; - case SAPP_KEYCODE_DELETE: - return "delete"; - case SAPP_KEYCODE_INSERT: - return "insert"; - case SAPP_KEYCODE_TAB: - return "tab"; - case SAPP_KEYCODE_RIGHT: - return "right"; - case SAPP_KEYCODE_LEFT: - return "left"; - case SAPP_KEYCODE_UP: - return "up"; - case SAPP_KEYCODE_DOWN: - return "down"; - case SAPP_KEYCODE_LEFT_SHIFT: - return "lshift"; - case SAPP_KEYCODE_RIGHT_SHIFT: - return "rshift"; - case SAPP_KEYCODE_LEFT_CONTROL: - return "lctrl"; - case SAPP_KEYCODE_LEFT_ALT: - return "lalt"; - case SAPP_KEYCODE_RIGHT_CONTROL: - return "rctrl"; - case SAPP_KEYCODE_RIGHT_ALT: - return "ralt"; - case SAPP_KEYCODE_SPACE: - return "space"; - case SAPP_KEYCODE_KP_ADD: - return "plus"; - case '=': - return "plus"; - case '-': - return "minus"; - case SAPP_KEYCODE_KP_SUBTRACT: - return "minus"; - case SAPP_KEYCODE_GRAVE_ACCENT: - return "`"; - case SAPP_KEYCODE_LEFT_BRACKET: - return "lbracket"; - case SAPP_KEYCODE_RIGHT_BRACKET: - return "rbracket"; - case SAPP_KEYCODE_BACKSPACE: - return "backspace"; - case SAPP_KEYCODE_PAGE_UP: - return "pgup"; - case SAPP_KEYCODE_PAGE_DOWN: - return "pgdown"; - } - - if (key >= 32 && key <=90) { - keybuf[0] = tolower(key); - keybuf[1] = '\0'; - - return keybuf; - } - - return "NULL"; -} - -void call_input_down(int *key) { - JSValue argv[3]; - argv[0] = jstr("emacs"); - argv[1] = jstr(keyname_extd(*key)); - argv[2] = input2js(4); - script_callee(pawn_callee, 3, argv); -} - -/* This is called once every frame - or more if we want it more! */ -void input_poll(double wait) { - for (int i = 0; i < arrlen(downkeys); i++) - call_input_down(&downkeys[i]); -} - -int key_is_num(int key) { - return key <= 57 && key >= 48; -} - void cursor_hide() { sapp_show_mouse(0); } void cursor_show() { sapp_show_mouse(1); } @@ -330,6 +35,3 @@ void cursor_img(const char *path) [custom set]; */ } - -int action_down(int key) { return key_states[key] == INPUT_DOWN; } -int action_up(int key) { return key_states[key] == INPUT_UP; } diff --git a/source/engine/input.h b/source/engine/input.h index dacb802..361ad9b 100644 --- a/source/engine/input.h +++ b/source/engine/input.h @@ -5,35 +5,14 @@ #include #include "HandmadeMath.h" -extern HMM_Vec2 mousewheel; -extern HMM_Vec2 mouse_pos; -extern HMM_Vec2 mouse_delta; - -#define INPUT_DOWN 0 -#define INPUT_UP 1 -#define INPUT_REPEAT 2 - -void input_init(); -void input_poll(double wait); - void cursor_hide(); void cursor_show(); void cursor_img(const char *path); void set_mouse_mode(int mousemode); -void input_mouse(int btn, int state, uint32_t mod); -void input_mouse_move(float x, float y, float dx, float dy, uint32_t mod); -void input_mouse_scroll(float x, float y, uint32_t mod); -void input_btn(int btn, int state, uint32_t mod); -void input_key(uint32_t key, uint32_t mod); - void input_dropped_files(int n); const char *keyname_extd(int key); -int action_down(int key); - -void register_pawn(struct callee c); -void register_gamepad(struct callee c); void quit(); diff --git a/source/engine/jsffi.c b/source/engine/jsffi.c index aaad214..3fe48db 100644 --- a/source/engine/jsffi.c +++ b/source/engine/jsffi.c @@ -343,18 +343,20 @@ char *js_nota_encode(JSValue v, char *nota) for (int i = 0; i < plen; i++) { val = JS_GetProperty(js,v,ptab[i].atom); str = JS_AtomToCString(js, ptab[i].atom); - JS_FreeAtom(js, ptab[i].atom); + JS_FreeAtom(js, ptab[i].atom); nota = nota_write_text(str, nota); - JS_FreeCString(js, str); + JS_FreeCString(js, str); nota = js_nota_encode(val, nota); - JS_FreeValue(js,val); + JS_FreeValue(js,val); } - js_free(js, ptab); return nota; + default: + return nota; } + return nota; } struct rgba js2color(JSValue v) { @@ -852,10 +854,6 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) ret = go ? JS_DupValue(js,go->ref) : JS_UNDEFINED; break; - case 45: - ret = vec2js(mouse_pos); - break; - case 46: set_mouse_mode(js2int(argv[1])); break; @@ -872,10 +870,6 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) ret = JS_NewInt64(js, mainwin.rheight); break; - case 50: - ret = JS_NewBool(js, action_down(js2int(argv[1]))); - break; - case 51: draw_cppoint(js2vec2(argv[1]), js2number(argv[2]), js2color(argv[3])); break; @@ -1458,7 +1452,6 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) break; case 264: aspect_mode = js2int(argv[1]); - window_resize(0,0); break; case 265: ret = vec2js((HMM_Vec2){mainwin.width, mainwin.height}); @@ -1481,52 +1474,6 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) return JS_UNDEFINED; } -JSValue duk_register(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) { - int cmd = js2int(argv[0]); - - struct callee c; - c.fn = argv[1]; - c.obj = argv[2]; - - switch (cmd) { - case 0: - register_update(c); - break; - - case 1: - register_physics(c); - break; - - case 2: - register_gui(c); - break; - - case 3: - register_nk_gui(c); - break; - case 6: - register_debug(c); - break; - case 7: - register_pawn(c); - break; - - case 8: - register_gamepad(c); - break; - - case 9: - stacktrace_callee = c; - break; - - case 10: - register_draw(c); - break; - } - - return JS_UNDEFINED; -} - void gameobject_add_shape_collider(gameobject *go, JSValue fn, struct phys2d_shape *shape) { struct shape_cb shapecb; shapecb.shape = shape; @@ -2300,7 +2247,6 @@ void ffi_load() { DUK_FUNC(make_model,2); DUK_FUNC(cmd_points, 5); DUK_FUNC(cmd, 6) - DUK_FUNC(register, 3) DUK_FUNC(register_collide, 6) DUK_FUNC(ui_text, 8) diff --git a/source/engine/render.c b/source/engine/render.c index f4db3af..67a9f5f 100644 --- a/source/engine/render.c +++ b/source/engine/render.c @@ -452,14 +452,13 @@ void full_2d_pass(struct window *window) sprite_draw_all(); model_draw_all(); - call_draw(); - + script_evalf("prosperon.draw();"); emitters_draw(); //// DEBUG if (debugDrawPhysics) { gameobject_draw_debugs(); - call_debugs(); + script_evalf("prosperon.debug();"); } debug_flush(&projection); @@ -467,7 +466,7 @@ void full_2d_pass(struct window *window) ////// TEXT && GUI debug_nextpass(); - call_gui(); + script_evalf("prosperon.gui();"); debug_flush(&hudproj); text_flush(&hudproj); sprite_flush(); diff --git a/source/engine/resources.c b/source/engine/resources.c index 144c46f..3a0c300 100644 --- a/source/engine/resources.c +++ b/source/engine/resources.c @@ -43,7 +43,7 @@ char pathbuf[MAXPATH + 1]; static struct cdb corecdb; static struct cdb game_cdb; -extern int LOADED_GAME = 0; +int LOADED_GAME = 0; uint8_t *gamebuf; static void response_cb(const sfetch_response_t *r) diff --git a/source/engine/script.c b/source/engine/script.c index 8bd6b53..a52672e 100644 --- a/source/engine/script.c +++ b/source/engine/script.c @@ -154,7 +154,7 @@ JSValue script_run_bytecode(uint8_t *code, size_t len) JSValue ret = JS_EvalFunction(js, b); js_print_exception(ret); JS_FreeValue(js,b); - JS_FreeValue(js,ret); + return ret; } struct callee stacktrace_callee; @@ -167,7 +167,7 @@ time_t file_mod_secs(const char *file) { void js_stacktrace() { #ifndef NDEBUG - call_callee(&stacktrace_callee); + script_evalf("console.stack();"); #endif } @@ -238,7 +238,7 @@ JSValue file_eval_env(const char *file, JSValue env) JSValue v = JS_EvalThis(js, env, script, len, file, JS_EVAL_FLAGS); free(script); js_print_exception(v); - JS_FreeValue(js,v); + return v; } void script_call_sym(JSValue sym) { @@ -325,35 +325,3 @@ void send_signal(const char *signal, int argc, JSValue *argv) JS_FreeValue(js, sig); JS_FreeValue(js, fn); } - -static struct callee update_callee; -void register_update(struct callee c) { - update_callee = c; -} - -void call_updates(double dt) { - callee_dbl(update_callee, dt); -} - -static struct callee gui_callee; -void register_gui(struct callee c) { gui_callee = c; } -void call_gui() { js_callee_exec(&gui_callee, 0, NULL); } - -static struct callee nk_gui_callee; -void register_nk_gui(struct callee c) { nk_gui_callee = c; } -void call_nk_gui() { js_callee_exec(&nk_gui_callee, 0, NULL); } - -static struct callee physupdate_callee; -void register_physics(struct callee c) { physupdate_callee = c; } -void call_physics(double dt) { - callee_dbl(physupdate_callee, dt); -} - -struct callee debug_callee; -void register_debug(struct callee c) { debug_callee = c; } -void call_debugs() { call_callee(&debug_callee); } - -static struct callee draw_callee; -void register_draw(struct callee c) { draw_callee = c; } - -void call_draw() { call_callee(&draw_callee); } diff --git a/source/engine/script.h b/source/engine/script.h index cfd8f6e..74269f9 100644 --- a/source/engine/script.h +++ b/source/engine/script.h @@ -52,27 +52,9 @@ JSValue file_eval_env(const char *file, JSValue env); time_t file_mod_secs(const char *file); -void register_update(struct callee c); -void call_updates(double dt); -void call_debugs(); - -void unregister_gui(struct callee c); -void register_gui(struct callee c); -void register_debug(struct callee c); -void register_nk_gui(struct callee c); -void call_gui(); -void call_nk_gui(); -void unregister_obj(JSValue obj); - void send_signal(const char *signal, int argc, JSValue *argv); void script_gc(); -void register_physics(struct callee c); -void call_physics(double dt); - -void register_draw(struct callee c); -void call_draw(); - JSValue script_run_bytecode(uint8_t *code, size_t len); uint8_t *script_compile(const char *file, size_t *len); diff --git a/source/engine/window.c b/source/engine/window.c index 1bec395..9714526 100644 --- a/source/engine/window.c +++ b/source/engine/window.c @@ -23,12 +23,9 @@ struct Texture *icon = NULL; void window_resize(int width, int height) { - width = sapp_width(); - height = sapp_height(); mainwin.dpi = sapp_dpi_scale(); - mainwin.width = sapp_width(); - mainwin.height = sapp_height(); - + mainwin.width = width; + mainwin.height = height; float aspect = mainwin.width/mainwin.height; float raspect = mainwin.rwidth/mainwin.rheight; mainwin.pheight = mainwin.rheight; diff --git a/source/engine/yugine.c b/source/engine/yugine.c index 907b747..6e7730d 100644 --- a/source/engine/yugine.c +++ b/source/engine/yugine.c @@ -11,11 +11,12 @@ #include #include "particle.h" #include "simplex.h" +#include "wchar.h" +#include "locale.h" #include "datastream.h" #include "timer.h" - #include "quickjs/quickjs.h" #include "jsffi.h" @@ -96,7 +97,6 @@ static JSValue c_init_fn; void c_init() { SAPP_STARTED = 1; - input_init(); script_evalf("world_start();"); render_init(); window_set_icon("icons/moon.gif"); @@ -112,10 +112,9 @@ int frame_fps() { return 1.0/sapp_frame_duration(); } static void process_frame() { double elapsed = stm_sec(stm_laptime(&frame_t)); - script_evalf("Register.appupdate.broadcast(%g);", elapsed); - input_poll(0); - /* Timers all update every frame - once per monitor refresh */ - timer_update(elapsed, timescale); + script_evalf("prosperon.appupdate(%g);", elapsed); + /* Timers all update every frame - once per monitor refresh */ + timer_update(elapsed, timescale); emitters_step(elapsed); @@ -125,7 +124,7 @@ static void process_frame() updatelast = frame_t; // prof_start(&prof_update); - call_updates(dt * timescale); + script_evalf("prosperon.update(%g);", dt*timescale); // prof_lap(&prof_update); if (sim_play == SIM_STEP) @@ -138,7 +137,7 @@ static void process_frame() // prof_start(&prof_physics); phys_step = 1; phys2d_update(physMS * timescale); - call_physics(physMS * timescale); + script_evalf("prosperon.physupdate(%g);", physMS*timescale); phys_step = 0; // prof_lap(&prof_physics); } @@ -171,33 +170,37 @@ void c_clean() { void c_event(const sapp_event *e) { + char utf8str[6] = {0}; + wchar_t wcode; switch (e->type) { case SAPP_EVENTTYPE_MOUSE_MOVE: - input_mouse_move(e->mouse_x, e->mouse_y, e->mouse_dx, e->mouse_dy, e->modifiers); + script_evalf("prosperon.mousemove([%g, %g], [%g, %g]);", e->mouse_x, mainwin.height -e->mouse_y, e->mouse_dx, -e->mouse_dy); break; case SAPP_EVENTTYPE_MOUSE_SCROLL: - input_mouse_scroll(e->scroll_x, e->scroll_y, e->modifiers); + script_evalf("prosperon.mousescroll([%g, %g]);", e->scroll_x, e->scroll_y); break; case SAPP_EVENTTYPE_KEY_DOWN: - input_btn(e->key_code, e->key_repeat ? INPUT_REPEAT : INPUT_DOWN, e->modifiers); + script_evalf("prosperon.keydown(%d, %d);", e->key_code, e->key_repeat); break; case SAPP_EVENTTYPE_KEY_UP: - input_btn(e->key_code, INPUT_UP, e->modifiers); + script_evalf("prosperon.keyup(%d);", e->key_code); break; case SAPP_EVENTTYPE_MOUSE_UP: - input_mouse(e->mouse_button, INPUT_UP, e->modifiers); + script_evalf("prosperon.mouseup(%d);", e->mouse_button); break; case SAPP_EVENTTYPE_MOUSE_DOWN: - input_mouse(e->mouse_button, INPUT_DOWN, e->modifiers); + script_evalf("prosperon.mousedown(%d);", e->mouse_button); break; case SAPP_EVENTTYPE_CHAR: - input_key(e->char_code, e->modifiers); + if (e->char_code > 127) break; /* only dealing with ascii now */ + wctomb(utf8str, wcode); + script_evalf("prosperon.textinput(`%ls`);", utf8str); break; case SAPP_EVENTTYPE_RESIZED: @@ -229,7 +232,7 @@ void c_event(const sapp_event *e) break; case SAPP_EVENTTYPE_FILES_DROPPED: - input_mouse_move(e->mouse_x, e->mouse_y, e->mouse_dx, e->mouse_dy, e->modifiers); +// input_mouse_move(e->mouse_x, e->mouse_y, e->mouse_dx, e->mouse_dy, e->modifiers); input_dropped_files(sapp_get_num_dropped_files()); break; default: @@ -274,6 +277,7 @@ void app_name(const char *name) { } int main(int argc, char **argv) { + setlocale(LC_ALL, "en_US.utf8"); #ifndef NDEBUG log_init(); int logout = 0;