This commit is contained in:
John Alanbrook 2024-09-30 04:36:53 -05:00
parent 6b94349a64
commit a476562a9e
9 changed files with 52 additions and 78 deletions

View file

@ -134,10 +134,11 @@ actor.kill.doc = `Remove this actor and all its padawans from existence.`;
actor.delay = function (fn, seconds) { actor.delay = function (fn, seconds) {
var timers = this.timers; var timers = this.timers;
var stop = function () { var stop = function () {
timers.remove(stop); timers.remove(stop);
stop.timer = undefined;
stop = undefined; stop = undefined;
rm();
}; };
function execute() { function execute() {
@ -152,14 +153,8 @@ actor.delay = function (fn, seconds) {
return 1 - stop.remain / stop.seconds; return 1 - stop.remain / stop.seconds;
}; };
function update(dt) { stop.timer = os.make_timer(execute);
profile.frame("timer"); stop.timer.remain = seconds;
stop.remain -= dt;
if (stop.remain <= 0) execute();
profile.endframe();
}
var rm = Register.appupdate.register(update);
timers.push(stop); timers.push(stop);
return stop; return stop;

View file

@ -1,28 +1,3 @@
/* It is EMCA6 but without a lot of builtin objects and various functions. There are no:
* Promises and so on (Generators, async)
* WeakMaps and so on (weakset, weakref)
* Typed arrays
* Proxys
* Modules
* Symbols (use closures)
In addition to the removal of a bunch of stuff as seen here.
Access prototypes through __proto__ instead of the long-winded Object.getProtoTypeOf.
*/
/*
Object.getPrototypeOf = undefined;
Object.setPrototypeOf = undefined;
Reflect = undefined
Symbol = undefined;
URIError = undefined;
Proxy = undefined;
Map = undefined;
WeakMap = undefined;
Promise = undefined;
Set = undefined;
WeakSet = undefined;
*/
Number.roman = { Number.roman = {
M: 1000, M: 1000,
D: 500, D: 500,

View file

@ -75,10 +75,8 @@ var entity = {
var stop = function () { var stop = function () {
timers.remove(stop); timers.remove(stop);
execute = undefined; execute = undefined;
stop.timer = undefined;
stop = undefined; stop = undefined;
rm?.();
rm = undefined;
update = undefined;
}; };
function execute() { function execute() {
@ -92,17 +90,9 @@ var entity = {
return 1 - stop.remain / stop.seconds; return 1 - stop.remain / stop.seconds;
}; };
function update(dt) { stop.timer = os.make_timer(execute);
profile.frame("timer"); stop.timer.remain = seconds;
if (stop) {
// TODO: This seems broken
stop.remain -= dt;
if (stop.remain <= 0) execute();
}
profile.endframe();
}
var rm = Register.update.register(update);
timers.push(stop); timers.push(stop);
return stop; return stop;
}, },
@ -247,6 +237,7 @@ var entity = {
delete ent.objects; delete ent.objects;
ent.objects = {}; ent.objects = {};
for (var i in o) { for (var i in o) {
console.info(`creating ${i} on ${ent.toString()}`);
var newur = o[i].ur; var newur = o[i].ur;
delete o[i].ur; delete o[i].ur;
var n = ent.spawn(ur[newur], o[i]); var n = ent.spawn(ur[newur], o[i]);
@ -430,7 +421,7 @@ var entity = {
rename_obj(name, newname) { rename_obj(name, newname) {
if (!this.objects[name]) { if (!this.objects[name]) {
// console.warn(`No object with name ${name}. Could not rename to ${newname}.`); console.warn(`No object with name ${name}. Could not rename to ${newname}.`);
return; return;
} }
if (name === newname) { if (name === newname) {

View file

@ -331,8 +331,7 @@ profile.data = {};
profile.curframe = 0; profile.curframe = 0;
profile.snapshot = {}; profile.snapshot = {};
var fps = [];
var frame_lead = 240;
var classes = ["gameobject", "transform", "dsp_node", "texture", "font", "warp_gravity", "warp_damp", "sg_buffer", "datastream", "cpShape", "cpConstraint", "timer", "skin"]; var classes = ["gameobject", "transform", "dsp_node", "texture", "font", "warp_gravity", "warp_damp", "sg_buffer", "datastream", "cpShape", "cpConstraint", "timer", "skin"];
var get_snapshot = function() var get_snapshot = function()
@ -361,11 +360,15 @@ var get_snapshot = function()
} }
} }
var fps = [];
var frame_lead = 1;
var fps_t = 0;
profile.report_frame = function (t) { profile.report_frame = function (t) {
fps.push(t); fps.push(t);
if (fps.length > frame_lead) { if (profile.secs(profile.now() - fps_t) > frame_lead) {
profile.snapshot.fps = Math.mean(fps); profile.snapshot.fps = Math.mean(fps);
fps.length = 0; fps.length = 0;
fps_t = profile.now();
get_snapshot(); get_snapshot();
} }
}; };

View file

@ -1130,6 +1130,7 @@ prosperon.process = function process() {
profile.frame("update"); profile.frame("update");
prosperon.update(dt * game.timescale); prosperon.update(dt * game.timescale);
update_emitters(dt * game.timescale); update_emitters(dt * game.timescale);
os.update_timers(dt * game.timescale);
profile.endframe(); profile.endframe();
if (sim.mode === "step") sim.pause(); if (sim.mode === "step") sim.pause();
} }

View file

@ -40,7 +40,6 @@
#include "gui.h" #include "gui.h"
#include "timer.h" #include "timer.h"
#include <sys/resource.h> #include <sys/resource.h>
#include <malloc.h>
#if (defined(_WIN32) || defined(__WIN32__)) #if (defined(_WIN32) || defined(__WIN32__))
#include <direct.h> #include <direct.h>
@ -2666,7 +2665,10 @@ static const JSCFunctionListEntry js_texture_funcs[] = {
MIST_FUNC_DEF(texture, inram, 0), MIST_FUNC_DEF(texture, inram, 0),
}; };
JSC_GETSET(timer, remain, number)
static const JSCFunctionListEntry js_timer_funcs[] = { static const JSCFunctionListEntry js_timer_funcs[] = {
CGETSET_ADD(timer, remain),
}; };
JSC_GETSET(font, linegap, number) JSC_GETSET(font, linegap, number)
@ -2828,7 +2830,8 @@ JSC_CCALL(os_memstate,
) )
JSC_CCALL(os_mallinfo, JSC_CCALL(os_mallinfo,
struct mallinfo jsmem = mallinfo(); ret = JS_UNDEFINED;
/*struct mallinfo jsmem = mallinfo();
ret = JS_NewObject(js); ret = JS_NewObject(js);
JSJMEMRET(arena); JSJMEMRET(arena);
JSJMEMRET(ordblks); JSJMEMRET(ordblks);
@ -2838,7 +2841,7 @@ JSC_CCALL(os_mallinfo,
JSJMEMRET(usmblks); JSJMEMRET(usmblks);
JSJMEMRET(uordblks); JSJMEMRET(uordblks);
JSJMEMRET(fordblks); JSJMEMRET(fordblks);
JSJMEMRET(keepcost); JSJMEMRET(keepcost);*/
) )
JSC_CCALL(os_rusage, JSC_CCALL(os_rusage,
@ -3053,7 +3056,7 @@ JSC_CCALL(os_make_circle2d,
return ret; return ret;
) )
JSC_CCALL(os_make_timer, return timer2js(timer_make())) JSC_CCALL(os_make_timer, return timer2js(timer_make(argv[0])))
JSC_CCALL(os_update_timers, timer_update(js2number(argv[0]))) JSC_CCALL(os_update_timers, timer_update(js2number(argv[0])))
JSC_CCALL(os_obj_size, JSC_CCALL(os_obj_size,
@ -3388,7 +3391,7 @@ static const JSCFunctionListEntry js_os_funcs[] = {
MIST_FUNC_DEF(os, make_hemisphere, 2), MIST_FUNC_DEF(os, make_hemisphere, 2),
MIST_FUNC_DEF(os, make_plane, 2), MIST_FUNC_DEF(os, make_plane, 2),
MIST_FUNC_DEF(os, make_video, 1), MIST_FUNC_DEF(os, make_video, 1),
MIST_FUNC_DEF(os, make_timer, 0), MIST_FUNC_DEF(os, make_timer, 1),
MIST_FUNC_DEF(os, update_timers, 1), MIST_FUNC_DEF(os, update_timers, 1),
MIST_FUNC_DEF(os, mem, 1), MIST_FUNC_DEF(os, mem, 1),
MIST_FUNC_DEF(os, mem_limit, 1), MIST_FUNC_DEF(os, mem_limit, 1),

View file

@ -52,15 +52,15 @@ extern JSValue cpShape2js(cpShape *s);
return ret; \ return ret; \
} \ } \
#define JSC_DCALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(); } #define JSC_DCALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(); return JS_UNDEFINED; }
#define JSC_1CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0])); } #define JSC_1CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0])); return JS_UNDEFINED; }
#define JSC_2CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1])); } #define JSC_2CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1])); return JS_UNDEFINED; }
#define JSC_3CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1]), js2number(argv[2])); } #define JSC_3CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1]), js2number(argv[2])); return JS_UNDEFINED; }
#define JSC_4CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1]), js2number(argv[2]), js2number(argv[3])); } #define JSC_4CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1]), js2number(argv[2]), js2number(argv[3])); return JS_UNDEFINED; }
#define JSC_5CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1]), js2number(argv[2]), js2number(argv[3]), js2number(argv[4])); } #define JSC_5CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1]), js2number(argv[2]), js2number(argv[3]), js2number(argv[4])); return JS_UNDEFINED; }
#define JSC_6CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1]), js2number(argv[2]), js2number(argv[3]), js2number(argv[4]), js2number(argv[5])); } #define JSC_6CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1]), js2number(argv[2]), js2number(argv[3]), js2number(argv[4]), js2number(argv[5])); return JS_UNDEFINED; }
#define JSC_7CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1]), js2number(argv[2]), js2number(argv[3]), js2number(argv[4]), js2number(argv[5]), js2number(argv[6])); } #define JSC_7CALL(FN) JSValue js_##FN (JSContext *js, JSValue self, int argc, JSValue *argv) { FN(js2number(argv[0]), js2number(argv[1]), js2number(argv[2]), js2number(argv[3]), js2number(argv[4]), js2number(argv[5]), js2number(argv[6])); return JS_UNDEFINED; }
#define GETSETPAIR(ID, ENTRY, TYPE, FN) \ #define GETSETPAIR(ID, ENTRY, TYPE, FN) \
JSValue js_##ID##_set_##ENTRY (JS_SETSIG) { \ JSValue js_##ID##_set_##ENTRY (JS_SETSIG) { \

View file

@ -4,9 +4,10 @@
timer **timers; timer **timers;
timer *timer_make() timer *timer_make(JSValue fn)
{ {
timer *t = calloc(sizeof(*t),1); timer *t = calloc(sizeof(*t),1);
t->fn = JS_DupValue(js,fn);
arrput(timers, t); arrput(timers, t);
return t; return t;
} }
@ -20,17 +21,21 @@ void timer_free(timer *t)
} }
} }
JS_FreeValue(js, t->fn);
free(t); free(t);
} }
void timer_update(double dt) void timer_update(double dt)
{ {
for (int i = 0; i < arrlen(timers); i++) { for (int i = 0; i < arrlen(timers); i++) {
if (timers[i]->remain <= 0) continue;
timers[i]->remain -= dt; timers[i]->remain -= dt;
if (timers[i]->remain <= 0) {
timers[i]->remain = 0;
JSValue fn = JS_DupValue(js, timers[i]->fn);
script_call_sym(timers[i]->fn, 0, NULL);
JS_FreeValue(js, fn);
} }
} }
void timer_stop(timer *t)
{
} }

View file

@ -1,13 +1,14 @@
#ifndef TIMER_H #ifndef TIMER_H
#include "script.h"
typedef struct timer { typedef struct timer {
double start;
double remain; double remain;
JSValue fn;
} timer; } timer;
timer *timer_make(); timer *timer_make(JSValue fn);
void timer_free(timer *t); void timer_free(timer *t);
void timer_update(double dt); void timer_update(double dt);
void timer_stop(timer *t);
#endif #endif