From e84d3b60af80954f7fd63117cdba657d8f5c93f2 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Thu, 21 Dec 2023 16:49:44 +0000 Subject: [PATCH] spline fixes --- scripts/components.js | 28 +++++++++++++++++----------- scripts/editor.js | 21 ++++++++++++++++++++- scripts/engine.js | 6 ++++++ source/engine/3d/model.c | 9 ++------- source/engine/jsffi.c | 10 ++++------ source/engine/render.c | 2 +- source/shaders/unlit.sglsl | 3 +-- 7 files changed, 51 insertions(+), 28 deletions(-) diff --git a/scripts/components.js b/scripts/components.js index c29273a..9ae24ae 100644 --- a/scripts/components.js +++ b/scripts/components.js @@ -710,18 +710,20 @@ component.edge2d = Object.copy(collider2d, { if (Spline.is_bezier(this.type)) { idx = cmd(59, pos, Spline.bezier_nodes(this.cpoints),400); - idx *= 3; - if (idx < 0) return; - var adds; - - if (idx === this.cpoints.length) - adds = [this.cpoints.at(-1).add([100,0]), pos.add([-100,0]), pos.slice()]; - else if (idx === 0) - adds = [pos.slice(), pos.add([100,0]), this.cpoints[0].add([-100,0])]; - else - adds = [pos.add([-100,0]), pos.slice(), pos.add([100,0])]; - this.cpoints.splice(idx+1, 0, ...adds); + if (idx < 0) return; + + if (idx === 0) { + this.cpoints.unshift(pos.slice(), pos.add([-100,0]), Vector.reflect_point(this.cpoints[1], this.cpoints[0])); + return; + } + if (idx === Spline.bezier_node_count(this.cpoints)) { + this.cpoints.push(Vector.reflect_point(this.cpoints.at(-2), this.cpoints.at(-1)), pos.add([-100,0]), pos.slice()); + return; + } + idx = 2 + (idx-1)*3; + var adds = [pos.add([100,0]), pos.slice(), pos.add([-100,0])]; + this.cpoints.splice(idx, 0, ...adds); } }, @@ -897,6 +899,10 @@ component.circle2d.impl = Object.mix({ set offset(x) { cmd_circle2d(1,this.id,x); }, get offset() { return cmd_circle2d(3,this.id); }, + + get pos() { return this.offset; }, + set pos(x) { this.offset = x; }, + }, collider2d.impl);; /* ASSETS */ diff --git a/scripts/editor.js b/scripts/editor.js index be4ad97..9040a9a 100644 --- a/scripts/editor.js +++ b/scripts/editor.js @@ -458,7 +458,7 @@ var editor = { var p = x[1].namestr(); GUI.text(p, x[1].screenpos().add([0,16]),1,editor.color_depths[depth]); Shape.circle(x[1].screenpos(),10,Color.blue.alpha(0.3)); - Shape.arrow(x[1].screenpos(), x[1].screenpos().add(x[1].up().scale(15)), Color.red, 10); +// Shape.arrow(x[1].screenpos(), x[1].screenpos().add(x[1].up().scale(15)), Color.red, 10); }); var mg = physics.pos_query(Mouse.worldpos,10); @@ -614,6 +614,7 @@ editor.inputs.drop = function(str) { console.warn("NOT AN IMAGE"); return; } + if (this.sel_comp?.comp === 'sprite') { this.sel_comp.path = str; return; @@ -1196,6 +1197,24 @@ editor.inputs.g = function() { if (!o) return; editor.selectlist = [o]; } + + if (editor.sel_comp) { + if ('pick' in editor.sel_comp) { + editor.grabselect = [editor.sel_comp.pick(Mouse.worldpos)]; + return; + } + + if ('pos' in editor.sel_comp) { + var comp = editor.sel_comp; + var o = { + pos: editor.sel_comp.pos, + move(d) { comp.pos = comp.pos.add(d); }, + sync: comp.sync.bind(comp), + }; + editor.grabselect = [o]; + return; + } + } if (editor.sel_comp && 'pick' in editor.sel_comp) { var o = editor.sel_comp.pick(Mouse.worldpos); diff --git a/scripts/engine.js b/scripts/engine.js index 6a30820..356e316 100644 --- a/scripts/engine.js +++ b/scripts/engine.js @@ -324,6 +324,12 @@ Spline.bezier_loop = function(cp) return cp; } +Spline.bezier_node_count = function(cp) +{ + if (cp.length === 4) return 2; + return 2 + (cp.length-4)/3; +} + Spline.is_bezier = function(t) { return t === Spline.type.bezier; } Spline.is_catmull = function(t) { return t === Spline.type.catmull; } diff --git a/source/engine/3d/model.c b/source/engine/3d/model.c index 6d9a994..cd0fe11 100644 --- a/source/engine/3d/model.c +++ b/source/engine/3d/model.c @@ -365,21 +365,16 @@ struct model *MakeModel(const char *path) HMM_Vec3 eye = {0,0,100}; void draw_model(struct model *model, HMM_Mat4 amodel) { - HMM_Mat4 proj = projection;//HMM_Perspective_RH_ZO(45, (float)mainwin.width / mainwin.height, 0.1, 10000); + HMM_Mat4 proj = projection; HMM_Vec3 center = {0.f, 0.f, 0.f}; - HMM_Vec3 up = {0.f, 1.f, 0.f}; HMM_Mat4 view = HMM_LookAt_RH(eye, center, vUP); - HMM_Mat4 vp = HMM_MulM4(proj, view); - HMM_Mat4 mvp = HMM_MulM4(vp, amodel); - HMM_Vec3 lp = {1, 1, 1}; HMM_Vec3 dir_dir = HMM_NormV3(HMM_SubV3(center, dirl_pos)); vs_p_t vs_p; - memcpy(vs_p.vp, view.Elements, sizeof(float)*16); + memcpy(vs_p.vp, vp.Elements, sizeof(float)*16); memcpy(vs_p.model, amodel.Elements, sizeof(float)*16); - memcpy(vs_p.proj, proj.Elements, sizeof(float)*16); sg_apply_pipeline(model_pipe); sg_apply_uniforms(SG_SHADERSTAGE_VS, SLOT_vs_p, SG_RANGE_REF(vs_p)); diff --git a/source/engine/jsffi.c b/source/engine/jsffi.c index 48dac28..3b1659f 100644 --- a/source/engine/jsffi.c +++ b/source/engine/jsffi.c @@ -74,9 +74,9 @@ void js_setprop_str(JSValue obj, const char *prop, JSValue v) { JS_SetPropertySt JSValue jstzone() { time_t t = time(NULL); - struct tm lt = {0}; - localtime_r(&t, <); - return num2js(lt.tm_gmtoff); + time_t local_t = mktime(localtime(&t)); + double diff = difftime(t, local_t); + return num2js(diff/3600); } int js2bool(JSValue v) { return JS_ToBool(js, v); } @@ -86,9 +86,7 @@ JSValue bool2js(int b) { return JS_NewBool(js,b); } JSValue jsdst() { time_t t = time(NULL); - struct tm lt = {}; - localtime_r(&t,<); - return bool2js(lt.tm_isdst); + return bool2js(localtime(&t)->tm_isdst); } JSValue jscurtime() diff --git a/source/engine/render.c b/source/engine/render.c index 43aec43..839c6b6 100644 --- a/source/engine/render.c +++ b/source/engine/render.c @@ -504,7 +504,7 @@ void full_2d_pass(struct window *window) pos.x - zoom * window->rwidth / 2, pos.x + zoom * window->rwidth / 2, pos.y - zoom * window->rheight / 2, - pos.y + zoom * window->rheight / 2, -1000.f, 1000.f); + pos.y + zoom * window->rheight / 2, -10000.f, 10000.f); hudproj = HMM_Orthographic_LH_ZO(0, window->rwidth, 0, window->rheight, -1.f, 1.f); diff --git a/source/shaders/unlit.sglsl b/source/shaders/unlit.sglsl index cea5024..e7536b2 100644 --- a/source/shaders/unlit.sglsl +++ b/source/shaders/unlit.sglsl @@ -7,11 +7,10 @@ out vec2 tex_coords; uniform vs_p { uniform mat4 vp; uniform mat4 model; -uniform mat4 proj; }; void main() { - gl_Position = proj * vp * vec4(vec3(model * vec4(a_pos,1.0)), 1.0); + gl_Position = vp * vec4(vec3(model * vec4(a_pos,1.0)), 1.0); tex_coords = a_tex_coords; } @end