restore y axis sprite sort

This commit is contained in:
2024-11-07 03:22:43 -06:00
parent 6faa05fc62
commit 7563cb5d38
3 changed files with 38 additions and 2 deletions

View File

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

View File

@@ -72,6 +72,7 @@ var entity = {
},
set pos(x) {
this.transform.pos = x;
this.sync();
},
get angle() {
return this.transform.angle;

View File

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