This commit is contained in:
2025-01-16 21:02:14 -06:00
parent 545e7ccd6c
commit bae3a94fa1
8 changed files with 113 additions and 56 deletions

View File

@@ -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);

View File

@@ -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};

View File

@@ -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();

View File

@@ -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];

View File

@@ -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();
}

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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;
}