From 7563cb5d38a889cf3e4502d32b673ffbe3cd7a08 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Thu, 7 Nov 2024 03:22:43 -0600 Subject: [PATCH] restore y axis sprite sort --- scripts/components.js | 7 +++++-- scripts/entity.js | 1 + scripts/render.js | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/scripts/components.js b/scripts/components.js index f54645b1..c5f31c02 100644 --- a/scripts/components.js +++ b/scripts/components.js @@ -14,7 +14,7 @@ var make_point_obj = function (o, p) { var sprite_addbucket = function (sprite) { if (!sprite.image) return; - var layer = 1000000 + sprite.gameobject.drawlayer * 1000 - sprite.gameobject.pos.y; + var layer = sprite.z_value(); sprite_buckets[layer] ??= {}; sprite_buckets[layer][sprite.image.texture.path] ??= []; sprite_buckets[layer][sprite.image.texture.path].push(sprite); @@ -40,6 +40,9 @@ var sprite = { image: undefined, get diffuse() { return this.image.texture; }, set diffuse(x) {}, + z_value() { + return 100000 + this.gameobject.drawlayer * 1000 - this.gameobject.pos.y; + }, anim_speed: 1, play(str, loop = true, reverse = false) { if (!this.animset) { @@ -148,7 +151,7 @@ var sprite = { }, anchor: [0, 0], sync() { - var layer = 1000000 + this.gameobject.drawlayer * 1000 - this.gameobject.pos.y; + var layer = this.z_value(); if (layer === this._oldlayer && this.path === this._oldpath) return; sprite_rmbucket(this); diff --git a/scripts/entity.js b/scripts/entity.js index 49173d39..8d9a6185 100644 --- a/scripts/entity.js +++ b/scripts/entity.js @@ -72,6 +72,7 @@ var entity = { }, set pos(x) { this.transform.pos = x; + this.sync(); }, get angle() { return this.transform.angle; diff --git a/scripts/render.js b/scripts/render.js index 7ad7b294..07056400 100644 --- a/scripts/render.js +++ b/scripts/render.js @@ -709,6 +709,38 @@ render.draw_gui = true; render.draw_gizmos = true; render.sprites = function render_sprites() { + // bucket & draw +/* var sorted = allsprites.sort((a,b) => { + if (a.gameobject.drawlayer !== b.gameobject.drawlayer) return a.gameobject.drawlayer - b.gameobject.drawlayer; + if (a.image.texture !== b.image.texture) return a.image.texture.path.localeCompare(b.image.texture.path); + return a.gameobject.transform.pos.y - b.gameobject.transform.pos.y; + }); + + if (sorted.length === 0) return; + + var tex = undefined; + var buckets = []; + var group = [sorted[0]]; + + for (var i = 1; i < sorted.length; i++) { + if (sorted[i].image.texture !== sorted[i-1].image.texture) { + buckets.push(group); + group = []; + } + group.push(sorted[i]); + } + if (group.length>0) buckets.push(group); + render.use_shader(spritessboshader); + for (var img of buckets) { + var sparray = img; + if (sparray.length === 0) continue; + var ss = sparray[0]; + ss.baseinstance = render.make_sprite_ssbo(sparray,sprite_ssbo); + render.use_mat(ss); + render.draw(shape.quad,sprite_ssbo,sparray.length); + } +*/ + profile.report("sprites"); profile.report("drawing"); render.use_shader(spritessboshader);