From acecf2fde9fd5f6f5b4cbb4e3ba3e9828a95b4d1 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Wed, 6 Sep 2023 22:48:08 +0000 Subject: [PATCH] Fix grid drawing; add energy efficient editing; add input down detection --- Makefile | 10 +++----- source/engine/debug/debug.c | 4 +++ source/engine/debug/debugdraw.c | 17 +++++++++---- source/engine/debug/debugdraw.h | 2 +- source/engine/ffi.c | 10 +++++--- source/engine/input.c | 14 ++++++----- source/engine/yugine.c | 43 ++++++++++++--------------------- source/engine/yugine.h | 1 + source/scripts/debug.js | 1 + source/scripts/editor.js | 5 +++- source/scripts/engine.js | 18 ++++++++++++-- source/shaders/gridvert.glsl | 5 ++-- 12 files changed, 77 insertions(+), 53 deletions(-) diff --git a/Makefile b/Makefile index 9677afb9..336f1fb0 100755 --- a/Makefile +++ b/Makefile @@ -22,12 +22,11 @@ endif ifeq ($(DBG),1) CFLAGS += -g - INFO += dbg + INFO += _dbg LDFLAGS += -g else CFLAGS += -DNDEBUG LDFLAGS += -s - INFO += rel endif ifeq ($(OPT),small) @@ -80,13 +79,13 @@ else ifeq ($(UNAME), Linux) LDFLAGS += -pthread -rdynamic LDLIBS += GL pthread c m dl X11 Xi Xcursor EGL asound - PLAT = linux-$(ARCH) + PLAT = linux-$(ARCH)$(INFO) endif ifeq ($(UNAME), Darwin) ifeq ($(PLATFORM), macosx) LDLIBS += Coca QuartzCore OpenGL - PLAT = mac-$(ARCH) + PLAT = mac-$(ARCH)$(INFO) else ifeq ($(PLATFORM), iphoneos) LDLIBS += Foundation UIKit OpenGLES GLKit endif @@ -133,7 +132,6 @@ DESTDIR ?= ~/.bin install: $(DISTDIR)/$(DIST) @echo Unpacking $(DIST) in $(DESTDIR) -# @unzip $(DISTDIR)/$(DIST) -d $(DESTDIR) @$(UNZIP) $(BIN)/$(NAME): $(BIN)/libengine.a $(BIN)/libquickjs.a @@ -146,7 +144,7 @@ $(DISTDIR)/$(DIST): $(BIN)/$(NAME) source/shaders/* $(SCRIPTS) assets/* @mkdir -p $(DISTDIR) @cp -rf assets/* $(BIN) @cp -rf source/shaders $(BIN) - @cp -r source/scripts $(BIN) + @cp -rf source/scripts $(BIN) @$(PKGCMD) $(BIN)/libengine.a: $(OBJS) diff --git a/source/engine/debug/debug.c b/source/engine/debug/debug.c index c7734a78..c3846fb3 100644 --- a/source/engine/debug/debug.c +++ b/source/engine/debug/debug.c @@ -8,13 +8,17 @@ unsigned long long triCount = 0; void prof_start(struct d_prof *prof) { +#ifndef NDEBUG prof->lap = stm_now(); +#endif } void prof(struct d_prof *prof) { +#ifndef NDEBUG uint64_t t = stm_since(prof->lap); arrput(prof->ms, stm_sec(t)); +#endif } void resetTriangles() diff --git a/source/engine/debug/debugdraw.c b/source/engine/debug/debugdraw.c index ec97fb8f..98dd7869 100644 --- a/source/engine/debug/debugdraw.c +++ b/source/engine/debug/debugdraw.c @@ -278,8 +278,9 @@ void debugdraw_init() grid_shader = sg_compile_shader("shaders/gridvert.glsl", "shaders/gridfrag.glsl", &(sg_shader_desc){ .vs.uniform_blocks[0] = projection_ubo, .vs.uniform_blocks[1] = { - .size = sizeof(float)*2, - .uniforms = { [0] = { .name = "offset", .type = SG_UNIFORMTYPE_FLOAT2 } } }, + .size = sizeof(float)*4, + .uniforms = { [0] = { .name = "offset", .type = SG_UNIFORMTYPE_FLOAT2 }, + [1] = { .name = "dimen", .type = SG_UNIFORMTYPE_FLOAT2 } } }, .fs.uniform_blocks[0] = { .size = sizeof(float)*6, .uniforms = { @@ -566,24 +567,30 @@ void draw_arrow(struct cpVect start, struct cpVect end, struct rgba color, int c draw_cppoint(end, capsize, color); } -void draw_grid(int width, int span, struct rgba color) +void draw_grid(float width, float span, struct rgba color) { cpVect offset = cam_pos(); offset.x -= mainwin.width/2; offset.y -= mainwin.height/2; offset = cpvmult(offset, 1/cam_zoom()); + float ubo[4]; + ubo[0] = offset.x; + ubo[1] = offset.y; + ubo[2] = mainwin.width; + ubo[3] = mainwin.height; + sg_apply_pipeline(grid_pipe); sg_apply_bindings(&grid_bind); float col[4] = { color.r/255.0 ,color.g/255.0 ,color.b/255.0 ,color.a/255.0 }; float fubo[6]; - fubo[0] = 1; + fubo[0] = (float)width; fubo[1] = span; memcpy(&fubo[2], col, sizeof(float)*4); sg_apply_uniforms(SG_SHADERSTAGE_VS, 0, SG_RANGE_REF(projection)); - sg_apply_uniforms(SG_SHADERSTAGE_VS, 1, SG_RANGE_REF(offset)); + sg_apply_uniforms(SG_SHADERSTAGE_VS, 1, SG_RANGE_REF(ubo)); sg_apply_uniforms(SG_SHADERSTAGE_FS, 0, SG_RANGE_REF(fubo)); sg_draw(0,4,1); } diff --git a/source/engine/debug/debugdraw.h b/source/engine/debug/debugdraw.h index d1c46c38..0904e9c4 100644 --- a/source/engine/debug/debugdraw.h +++ b/source/engine/debug/debugdraw.h @@ -18,7 +18,7 @@ void draw_circle(cpVect c, float radius, float pixels, struct rgba color, float void draw_box(cpVect c, cpVect wh, struct rgba color); void draw_poly(cpVect *points, int n, struct rgba color); -void draw_grid(int width, int span, struct rgba color); +void draw_grid(float width, float span, struct rgba color); void debug_flush(HMM_Mat4 *view); void debug_newframe(); diff --git a/source/engine/ffi.c b/source/engine/ffi.c index 2f21db81..e33a4866 100644 --- a/source/engine/ffi.c +++ b/source/engine/ffi.c @@ -600,11 +600,11 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) break; case 5: - renderMS = js2number(argv[1]); +// renderMS = js2number(argv[1]); break; case 6: - updateMS = js2number(argv[1]); +// updateMS = js2number(argv[1]); break; case 7: @@ -770,7 +770,7 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) return JS_NULL; case 47: - draw_grid(js2int(argv[1]), js2int(argv[2]), js2color(argv[3])); + draw_grid(js2number(argv[1]), js2number(argv[2]), js2color(argv[3])); return JS_NULL; case 48: @@ -1214,6 +1214,10 @@ JSValue duk_sys_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *ar case 9: /* Clear the level out */ new_level(); break; + + case 10: + render_dirty = 1; + break; } return JS_NULL; diff --git a/source/engine/input.c b/source/engine/input.c index 67a2a505..9937eaa0 100644 --- a/source/engine/input.c +++ b/source/engine/input.c @@ -342,10 +342,12 @@ const char *keyname_extd(int key) { } void call_input_down(int *key) { - JSValue argv[2]; - argv[0] = input2js(keyname_extd(*key)); - argv[1] = jsinputstate[4]; - script_callee(pawn_callee, 2, argv); + JSValue argv[3]; + argv[0] = JS_NewString(js, "emacs"); + argv[1] = input2js(keyname_extd(*key)); + argv[2] = jsinputstate[4]; + script_callee(pawn_callee, 3, argv); + JS_FreeValue(js, argv[0]); } /* This is called once every frame - or more if we want it more! */ @@ -354,8 +356,8 @@ void input_poll(double wait) { mouseWheelX = 0; mouseWheelY = 0; -// for (int i = 0; i < arrlen(downkeys); i++) -// call_input_down(&downkeys[i]); + for (int i = 0; i < arrlen(downkeys); i++) + call_input_down(&downkeys[i]); } int key_is_num(int key) { diff --git a/source/engine/yugine.c b/source/engine/yugine.c index ce5d6210..a901795d 100644 --- a/source/engine/yugine.c +++ b/source/engine/yugine.c @@ -65,15 +65,10 @@ static struct d_prof prof_update; static struct d_prof prof_input; static struct d_prof prof_physics; -int physOn = 0; - -double renderlag = 0; double physlag = 0; -double updatelag = 0; +int render_dirty = 0; -double renderMS = 1 / 165.f; -double physMS = 1 / 165.f; -double updateMS = 1 / 165.f; +double physMS = 1 / 60.f; static int phys_step = 0; @@ -87,7 +82,6 @@ static float timescale = 1.f; static int sim_play = SIM_PLAY; - #ifdef __TINYC__ int backtrace(void **buffer, int size) { extern uint64_t *__libc_stack_end; @@ -149,8 +143,6 @@ void c_init() { render_init(); script_evalf("initialize();"); - - } int frame_fps() { @@ -162,7 +154,7 @@ void c_frame() double elapsed = sapp_frame_duration(); appTime += elapsed; - input_poll(fmax(0, renderMS-elapsed)); + input_poll(0); if (sim_play == SIM_PLAY || sim_play == SIM_STEP) { prof_start(&prof_update); @@ -181,29 +173,29 @@ void c_frame() phys_step = 0; prof(&prof_physics); } + + if (sim_play == SIM_STEP) { + sim_pause(); + render_dirty = 1; + } } - renderlag += elapsed; - -// if (renderlag >= renderMS) { -// renderlag -= renderMS; + if (sim_play == SIM_PLAY || render_dirty) { prof_start(&prof_draw); window_render(&mainwin); prof(&prof_draw); -// } - - gameobjects_cleanup(); - + render_dirty = 0; + } + gameobjects_cleanup(); } -void c_clean() -{ +void c_clean() {}; -} void c_event(const sapp_event *e) { + render_dirty = 1; switch (e->type) { case SAPP_EVENTTYPE_MOUSE_MOVE: input_mouse_move(e->mouse_x, e->mouse_y, e->mouse_dx, e->mouse_dy); @@ -277,10 +269,7 @@ void sim_pause() { int phys_stepping() { return sim_play == SIM_STEP; } void sim_step() { - if (sim_paused()) { - YughInfo("Step"); - sim_play = SIM_STEP; - } + sim_play = SIM_STEP; } void set_timescale(float val) { @@ -349,7 +338,7 @@ sapp_desc sokol_main(int argc, char **argv) { script_dofile("scripts/engine.js"); int argsize = 0; - for (int i = 1; i < argc; i++) { + for (int i = 0; i < argc; i++) { argsize += strlen(argv[i]); if (argc > i+1) argsize++; } diff --git a/source/engine/yugine.h b/source/engine/yugine.h index c61f9280..201de422 100644 --- a/source/engine/yugine.h +++ b/source/engine/yugine.h @@ -20,5 +20,6 @@ extern double appTime; extern double renderMS; extern double physMS; extern double updateMS; +extern int render_dirty; #endif diff --git a/source/scripts/debug.js b/source/scripts/debug.js index 848720df..bf744fb0 100644 --- a/source/scripts/debug.js +++ b/source/scripts/debug.js @@ -66,6 +66,7 @@ var Debug = { line(points, color, type, thickness) { thickness ??= 1; + if (!type) type = 0; diff --git a/source/scripts/editor.js b/source/scripts/editor.js index fc305364..c47f15f1 100644 --- a/source/scripts/editor.js +++ b/source/scripts/editor.js @@ -895,7 +895,7 @@ var editor = { gui_img("icons/icons8-lock-16.png", world2screen(obj.pos)); }); - Debug.draw_grid(1, editor_config.grid_size/editor_camera.zoom, editor_config.grid_color); + Debug.draw_grid(2, editor_config.grid_size/editor_camera.zoom, editor_config.grid_color); var startgrid = screen2world([-20,Window.height]).map(function(x) { return Math.snap(x, editor_config.grid_size); }, this); var endgrid = screen2world([Window.width, 0]); @@ -2542,3 +2542,6 @@ Debug.register_call(editor.ed_debug, editor); if (IO.exists("editor.config")) load_configs("editor.config"); editor.edit_level = Level.create(); + +Game.stop(); +Game.render(); diff --git a/source/scripts/engine.js b/source/scripts/engine.js index 918fd927..2acca913 100644 --- a/source/scripts/engine.js +++ b/source/scripts/engine.js @@ -962,6 +962,8 @@ var Player = { case 'released': fn = pawn.inputs[cmd].released; break; + case 'down': + fn = pawn.inputs[cmd].down; } if (typeof fn === 'function') @@ -1046,7 +1048,7 @@ var Register = { unregister_obj(obj) { Register.registries.forEach(function(x) { - x.clear(); + x.unregister_obj(obj); }); Player.uncontrol(obj); }, @@ -1071,11 +1073,19 @@ var Register = { var entries = []; var n = {}; n.register = function(fn, obj) { + if (!obj) { + Log.warn("Refusing to register a function without a destroying object."); + return; + } entries.push([fn, obj ? obj : null]); } n.unregister = function(fn) { - entries = entries.filter(function(f) { return fn === f; }); + entries = entries.filter(function(f) { return fn !== f; }); + } + + n.unregister_obj = function(obj) { + entries = entries.filter(function(o) { return o !== obj; }); } n.broadcast = function(...args) { @@ -1322,6 +1332,8 @@ var Game = { sys_cmd(4); }, + render() { sys_cmd(10); }, + playing() { return sys_cmd(5); }, paused() { return sys_cmd(6); }, stepping() { @@ -1547,6 +1559,8 @@ var Level = { Game.register_obj(newobj); newobj.setup?.(); newobj.start?.(); + if (newobj.update) + Register.update.register(newobj.update, newobj); return newobj; }, diff --git a/source/shaders/gridvert.glsl b/source/shaders/gridvert.glsl index d617e91d..3e2dfe66 100644 --- a/source/shaders/gridvert.glsl +++ b/source/shaders/gridvert.glsl @@ -8,12 +8,13 @@ layout (std140) uniform Projection { }; uniform vec2 offset; +uniform vec2 dimen; void main() { // vec4 ipos = inverse(projection) * vec4(pos, 0.f, 1.f); - apos = pos * vec2(600, 360); - apos += offset; + apos = pos * dimen; +// apos += offset; // apos = pos + offset;