diff --git a/scripts/actor.js b/scripts/actor.js index 1dfdb0e7..87ec18d1 100644 --- a/scripts/actor.js +++ b/scripts/actor.js @@ -13,6 +13,19 @@ var script_fn = function script_fn(file) { return fn; }.hashify(); +globalThis.actor_use = function actor_use(script) +{ + var file = Resources.find_script(script); + if (!file) + return; + + var padawan = {}; + + script_fn(file).call(padawan); + + return padawan; +} + globalThis.class_use = function class_use(script, config, base, callback) { var file = Resources.find_script(script); diff --git a/scripts/components.js b/scripts/components.js index 9b0b4aa1..01e38547 100644 --- a/scripts/components.js +++ b/scripts/components.js @@ -92,7 +92,6 @@ var sprite = { }, tex_sync() { if (this.anim) this.stop(); - this.sync(); this.play(); this.transform.scale = [this.image.texture.width, this.image.texture.height]; this._sprite.set_image(this.image); @@ -138,13 +137,11 @@ var sprite = { this.del_anim?.(); this.anim = undefined; this.gameobject = undefined; - allsprites.remove(this); + sprite_qt.remove(this._sprite) }, anchor: [0, 0], - sync: function sync() { - this.layer = this.gameobject.drawlayer; - this._sprite.layer = this.layer; - }, + set layer(v) { this._sprite.layer = v; }, + get layer() { return this._sprite.layer; }, pick() { return this; }, @@ -155,14 +152,6 @@ var sprite = { return bbox.fromcwh(realpos, dim); }, }; -globalThis.allsprites = []; -var sprite_buckets = {}; - -component.sprite_buckets = function () { - return sprite_buckets; -}; - -component.dynamic_sprites = []; sprite.doc = { path: "Path to the texture.", @@ -243,8 +232,6 @@ component.sprite = function (obj) { sp.gameobject = obj; sp.transform = os.make_transform(); sp.transform.parent = obj.transform; - sp.guid = prosperon.guid(); - allsprites.push(msp); sp.transform.change_hook = function() { sprite_qt.remove(msp); msp.rect = sp.transform.torect(); @@ -259,6 +246,31 @@ component.sprite = function (obj) { return sp; }; +component.makesprite = function(obj = world, data) +{ + var sp = Object.create(sprite); + + var msp = os.make_sprite(); + sp._sprite = msp; + msp.color = Color.white; + + sp.gameobject = obj; + sp.transform = os.make_transform(); + sp.transform.parent = obj.transform; + sp.transform.change_hook = function() { + sprite_qt.remove(msp); + msp.rect = sp.transform.torect(); + msp.set_affine(sp.transform); + sprite_qt.insert(msp); + + /* sprite_qt.remove(sp) + sp.rect = sp.transform.torect() + sprite_qt.insert(sp) + */ + } + return sp; +} + sprite.shade = [1, 1, 1, 1]; return {component}; diff --git a/scripts/entity.js b/scripts/entity.js index 01a5aa6f..4acd1b35 100644 --- a/scripts/entity.js +++ b/scripts/entity.js @@ -165,7 +165,7 @@ var entity = { else if (Array.isArray(text)) for (var path of text) use(path,ent); */ - ent.reparent(this); +// ent.reparent(this); /* for (var [prop, p] of Object.entries(ent)) { if (!p) continue; @@ -192,7 +192,7 @@ var entity = { urdiff: {}, }; - Object.hide(ent, "ur", "components", "objects", "timers", "guid", "master", "guid", "_ed"); +// Object.hide(ent, "ur", "components", "objects", "timers", "guid", "master", "guid", "_ed"); ent.sync(); diff --git a/scripts/input.js b/scripts/input.js index ec53b2ce..308faeea 100644 --- a/scripts/input.js +++ b/scripts/input.js @@ -53,12 +53,14 @@ prosperon.mouse_wheel = function mousescroll(e) { prosperon.mouse_button_down = function(e) { - player[0].raw_input(modstr() + e.button, "pressed"); + player[0].mouse_input(modstr() + e.button, "pressed"); + input.mouse.buttons[e.button] = true } prosperon.mouse_button_up = function(e) { - player[0].raw_input(modstr() + e.button, "released"); + player[0].mouse_input(modstr() + e.button, "released"); + input.mouse.buttons[e.button] = false } input.mouse = {}; @@ -84,6 +86,11 @@ input.mouse.mode = function mouse_mode(m) { if (input.mouse.custom[m]) input.cursor_img(input.mouse.custom[m]); else input.mouse_cursor(m); }; +input.mouse.buttons = { + 0:false, + 1:false, + 2:false +} input.mouse.set_custom_cursor = function mouse_cursor(img, mode = input.mouse.cursor.default) { if (!img) delete input.mouse.custom[mode]; diff --git a/scripts/layout.js b/scripts/layout.js index 1bdf248b..db37fcd7 100644 --- a/scripts/layout.js +++ b/scripts/layout.js @@ -223,7 +223,7 @@ clay.button = function button(str, action, config = {}) var hovered = undefined; layout.newframe = function() { hovered = undefined; } // mousepos given in hud coordinates -layout.draw_commands = function draw_commands(cmds, pos = [0,0], mousepos) +layout.draw_commands = function draw_commands(cmds, pos = [0,0], mousepos = prosperon.camera.screen2hud(input.mouse.screenpos())) { for (var cmd of cmds) { var config = cmd.config; @@ -269,7 +269,8 @@ layout.draw_debug = function draw_debug(cmds, pos = [0,0]) } layout.inputs = {}; -layout.inputs.lm = function() +layout.inputs.mouse = {} +layout.inputs.mouse.left = function() { if (hovered && hovered.action) hovered.action(); } diff --git a/scripts/render.js b/scripts/render.js index c34d8b6f..ec940d7c 100644 --- a/scripts/render.js +++ b/scripts/render.js @@ -677,7 +677,7 @@ function gpupresent() { try{ var cmds = render._main.acquire_cmd_buffer(); - render_queue = sprites_to_queue(component.sprite_buckets()).concat(render_queue); + render_queue = sprites_to_queue().concat(render_queue); render_camera(cmds, prosperon.camera); } catch(e) { console.error(e); } finally { var swapchain_tex = cmds.acquire_swapchain(); @@ -756,7 +756,7 @@ function insertion_sort(arr, cmp) return arr } -function sprites_to_queue(sprites, ysort = false) +function sprites_to_queue(ysort = false) { var pos = prosperon.camera.transform.pos; var size = prosperon.camera.size; @@ -1050,29 +1050,41 @@ function tile(image, rect = [0,0], color = Color.white, repeat = {}) return; } -render.image = function image(image, rect = [0,0], rotation = 0, color = Color.white, pipeline = sprite_pipeline) { +var std_sprite_cmd = { + type: 'sprite', + pipeline: sprite_pipeline, + color: [1,1,1,1] +} + +render.image = function image(image, rect = [0,0], rotation = 0, color, pipeline) { if (!image) throw Error ('Need an image to render.') if (typeof image === "string") image = game.texture(image); rect.width ??= image.texture.width; rect.height ??= image.texture.height; - var T = os.make_transform(); - T.rect(rect); - current_queue.push({ - type: 'sprite', - transform: T, - image, - pipeline, - color - }); + var cmd = Object.create(std_sprite_cmd); + cmd.image = image; + cmd.rect = rect; + if (pipeline) cmd.pipeline = pipeline; + if (color) cmd.color = color; + current_queue.push(cmd) }; -render.images = function images(image, rects) +render.images = function images(image, rects, config) { if (!image) throw Error ('Need an image to render.'); if (typeof image === "string") image = game.texture(image); - for (var rect of rects) render.image(image,rect); + var bb = []; + bb.width = image.texture.width; + bb.height = image.texture.height; + for (var rect of rects) { + rect.__proto__ = bb; + var cmd = Object.create(std_sprite_cmd); + cmd.rect = rect; + cmd.image = image; + current_queue.push(cmd); + } } var tile_def = {repeat_x:true, repeat_y:true}; @@ -1352,13 +1364,9 @@ var fpses = []; prosperon.process = function process() { var now = profile.now(); var dt = now - last_frame_time; - fpses.push(dt); - if (fpses.length > 300) fpses.shift(); - console.log(1/(vector.sum(fpses)/fpses.length)) if (dt < waittime) os.sleep(waittime-dt); last_frame_time = profile.now(); - layout.newframe(); // check for hot reloading if (dmon) dmon.poll(dmon_cb); var dt = last_frame_time - frame_t; @@ -1371,6 +1379,8 @@ try { }); } catch(e) { console.error(e); } + layout.newframe(); + try { prosperon.appupdate(dt); } catch(e) { console.error(e) } input.procdown(); try { diff --git a/source/jsffi.c b/source/jsffi.c index 268f4552..ec83a64f 100644 --- a/source/jsffi.c +++ b/source/jsffi.c @@ -2197,7 +2197,7 @@ JSC_CCALL(vector_from_to, to = HMM_SubV2(to,HMM_MulV2F(dir, to_offset)); float length = HMM_DistV2(from, to); int steps = floor(length/space); - int stepsize = length/(steps+1); + float stepsize = length/(steps+1.0); ret = JS_NewArray(js); JS_SetPropertyUint32(js,ret,0,vec22js(js,from)); @@ -3372,7 +3372,6 @@ JSC_CCALL(renderer_make_sprite_mesh, // Calculate the base index for the current quad size_t base = i * 4; - // HMM_Mat3 trmat = transform2mat3_global(tr); @@ -4229,9 +4228,18 @@ JSC_CCALL(gpu_make_sprite_mesh, JS_FreeValue(js,sub); size_t base = i*4; - HMM_Mat3 trmat = transform2mat3(tr); - for (int j = 0; j < 4; j++) - posdata[base+j] = HMM_MulM3V3(trmat, base_quad[j]).xy; + if (tr) { + HMM_Mat3 trmat = transform2mat3(tr); + for (int j = 0; j < 4; j++) + posdata[base+j] = HMM_MulM3V3(trmat, base_quad[j]).xy; + } else { + rect dst; + JS_GETATOM(js,dst,sub,rect_atom,rect); + posdata[base+0] = (HMM_Vec2){dst.x,dst.y}; + posdata[base + 1] = (HMM_Vec2){ dst.x+dst.w, dst.y }; + posdata[base + 2] = (HMM_Vec2){ dst.x, dst.y+dst.h }; + posdata[base + 3] = (HMM_Vec2){ dst.x+dst.w, dst.y+dst.h }; + } uvdata[base+0] = (HMM_Vec2){src.x, src.y+src.h}; uvdata[base+1] = (HMM_Vec2){src.x+src.w, src.y+src.h}; @@ -4517,7 +4525,6 @@ JSC_CCALL(gpu_upload, memcpy(mapped_data + current_offset, items[i].data, items[i].size); current_offset += items[i].size; } - printf("copy and unmap took %u\n", SDL_GetTicksNS()-sy); SDL_UnmapGPUTransferBuffer(gpu, transfer); @@ -4542,8 +4549,6 @@ JSC_CCALL(gpu_upload, SDL_EndGPUCopyPass(copy_pass); free(items); - - printf("UPLOAD TOOK %u ns\n", SDL_GetTicksNS()-ss); ) JSC_CCALL(gpu_wait_for_fences, @@ -7334,18 +7339,19 @@ JSC_CCALL(rtree_query, max[0] = r.x+r.w; max[1] = r.y+r.h; -/* struct rtree_iter_data data = {0}; + struct rtree_iter_data data = {0}; data.js = js; data.arr = JS_NewArray(js); data.n = 0; rtree_search(tree, min, max, rtree_iter, &data); ret = data.arr; -*/ +/* sprite *arr = NULL; rtree_search(tree, min, max, rtree_array_iter, &arr); ret = JS_NewArrayBufferCopy(js,arr,arrlen(arr)*sizeof(*arr)); arrfree(arr); +*/ ) JSC_CCALL(rtree_count, diff --git a/source/transform.c b/source/transform.c index c4e5d979..9f581ef2 100644 --- a/source/transform.c +++ b/source/transform.c @@ -5,14 +5,22 @@ #include "stb_ds.h" +static transform model = { + .pos = {0,0,0}, + .scale = {1,1,1}, + .rotation = {0,0,0,1}, + .cache = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, + .gcache = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, + .dirty = 0, + .jsparent = JS_UNDEFINED, + .change_hook = JS_UNDEFINED +}; + + transform *make_transform() { - transform *t = calloc(sizeof(transform),1); - - t->scale = (HMM_Vec3){1,1,1}; - t->rotation = (HMM_Quat){0,0,0,1}; - transform_apply(t); - t->change_hook = JS_UNDEFINED; + transform *t = malloc(sizeof(transform)); + *t = model; return t; }