diff --git a/source/engine/ffi.c b/source/engine/ffi.c index 1c16d4fe..9094e026 100644 --- a/source/engine/ffi.c +++ b/source/engine/ffi.c @@ -153,14 +153,19 @@ duk_ret_t duk_sys_cmd(duk_context *duk) { duk_ret_t duk_register(duk_context *duk) { int cmd = duk_to_int(duk, 0); - void *obj = duk_get_pointer(duk, 1); - void *fn = duk_get_pointer(duk, 2); + void *obj = duk_get_heapptr(duk, 1); + void *fn = duk_get_heapptr(duk, 2); + switch (cmd) { + case 0: + register_update(obj, fn); + break; + + case 1: + register_physics(obj, fn); + break; + } - /* Test a call ... */ - duk_push_pointer(duk, fn); - duk_push_pointer(duk, obj); - duk_call_method(duk, 0); return 0; } diff --git a/source/engine/script.c b/source/engine/script.c index 608e8d8c..ff094421 100644 --- a/source/engine/script.c +++ b/source/engine/script.c @@ -111,39 +111,27 @@ void script_call_sym_args(void *sym, void *args) //s7_call(s7, sym, s7_cons(s7, args, s7_nil(s7))); } - -void **updates; -void **guis; -void **physics; - struct obupdate { void *obj; void *sym; }; -struct obupdate *obupdates = NULL; +struct obupdate *updates = NULL; +struct obupdate *physics = NULL; +void **guis = NULL; -void register_update(void *sym) { - arrput(updates, sym); -} - -void register_obupdate(void *obj, void *sym) { +void register_update(void *obj, void *sym) { struct obupdate ob = {obj, sym}; - arrput(obupdates, ob); + arrput(updates, ob); } void call_updates(double dt) { for (int i = 0; i < arrlen(updates); i++) { - duk_push_heapptr(duk, updates[i]); + duk_push_heapptr(duk, updates[i].obj); + duk_push_heapptr(duk, updates[i].sym); duk_push_number(duk, dt); - duk_call(duk, 1); - } - - for (int i = 0; i < arrlen(obupdates); i++) { - duk_push_heapptr(duk, obupdates[i].sym); - duk_push_heapptr(duk, obupdates[i].obj); - duk_push_number(duk, dt); - duk_call_method(duk, 1); + duk_call_prop(duk, -3, 1); + duk_pop_2(duk); } } @@ -156,14 +144,17 @@ void call_gui() { script_call_sym(guis[i]); } -void register_physics(void *sym) { - arrput(physics, sym); +void register_physics(void *obj, void *sym) { + struct obupdate ob = {obj, sym}; + arrput(physics, ob); } void call_physics(double dt) { for (int i = 0; i < arrlen(physics); i++) { - duk_push_pointer(duk, physics[i]); + duk_push_heapptr(duk, physics[i].obj); + duk_push_heapptr(duk, physics[i].sym); duk_push_number(duk, dt); - duk_call(duk, 1); + duk_call_prop(duk, -3, 1); + duk_pop_2(duk); } } diff --git a/source/engine/script.h b/source/engine/script.h index bdcad6cd..13bac608 100644 --- a/source/engine/script.h +++ b/source/engine/script.h @@ -18,14 +18,13 @@ void script_call_sym_args(void *sym, void *args); int script_has_sym(void *sym); void script_eval_w_env(const char *s, void *env); -void register_update(void *sym); -void register_obupdate(void *obj, void *sym); +void register_update(void *obj, void *sym); void call_updates(double dt); void register_gui(void *sym); void call_gui(); -void register_physics(void *sym); +void register_physics(void *obj, void *sym); void call_physics(double dt); duk_idx_t vec2duk(cpVect v);