sprite render faster
This commit is contained in:
parent
4756955c1a
commit
f47be2d30c
|
@ -247,7 +247,6 @@ var entity = {
|
|||
delete ent.objects;
|
||||
ent.objects = {};
|
||||
for (var i in o) {
|
||||
console.info(`creating ${i} on ${ent.toString()}`);
|
||||
var newur = o[i].ur;
|
||||
delete o[i].ur;
|
||||
var n = ent.spawn(ur[newur], o[i]);
|
||||
|
@ -431,7 +430,7 @@ var entity = {
|
|||
|
||||
rename_obj(name, newname) {
|
||||
if (!this.objects[name]) {
|
||||
console.warn(`No object with name ${name}. Could not rename to ${newname}.`);
|
||||
// console.warn(`No object with name ${name}. Could not rename to ${newname}.`);
|
||||
return;
|
||||
}
|
||||
if (name === newname) {
|
||||
|
|
|
@ -5,13 +5,16 @@ render.doc = {
|
|||
};
|
||||
|
||||
var cur = {};
|
||||
cur.images = [];
|
||||
|
||||
// When changing a shader, everything must wipe
|
||||
render.use_shader = function use_shader(shader) {
|
||||
if (typeof shader === "string") shader = make_shader(shader);
|
||||
if (cur.shader === shader) return;
|
||||
cur.shader = shader;
|
||||
cur.bind = undefined;
|
||||
cur.mesh = undefined;
|
||||
cur.ssbo = undefined;
|
||||
render.setpipeline(shader.pipe);
|
||||
shader_globals(cur.shader);
|
||||
};
|
||||
|
@ -24,7 +27,7 @@ render.use_mat = function use_mat(mat) {
|
|||
|
||||
cur.mat = mat;
|
||||
|
||||
cur.images = [];
|
||||
cur.images.length = 0;
|
||||
if (!cur.shader.fs.images) return;
|
||||
for (var img of cur.shader.fs.images)
|
||||
if (mat[img.name]) cur.images.push(mat[img.name]);
|
||||
|
@ -372,10 +375,32 @@ function shader_apply_material(shader, material = {}, old = {}) {
|
|||
if ("diffuse_size" in shader.vs.unimap) render.setuniv2(0, shader.vs.unimap.diffuse_size.slot, [material.diffuse.width, material.diffuse.height]);
|
||||
}
|
||||
|
||||
// Creates a binding object for a given mesh and shader
|
||||
var bindcache = {};
|
||||
var bcache = new WeakMap();
|
||||
function sg_bind(mesh, ssbo) {
|
||||
cur.mesh = mesh;
|
||||
|
||||
if (cur.mesh === mesh && cur.ssbo === ssbo) {
|
||||
cur.bind.ssbo = [ssbo];
|
||||
cur.bind.images = cur.images;
|
||||
render.setbind(cur.bind);
|
||||
return;
|
||||
}
|
||||
// var sid = os.value_id(cur.shader);
|
||||
// var mid = os.value_id(mesh);
|
||||
if (bcache.has(cur.shader) && bcache.get(cur.shader).has(mesh)) {
|
||||
cur.bind = bcache.get(cur.shader).get(mesh);
|
||||
cur.bind.images = cur.images;
|
||||
if (ssbo)
|
||||
cur.bind.ssbo = [ssbo];
|
||||
render.setbind(cur.bind);
|
||||
return;
|
||||
}
|
||||
var bind = {};
|
||||
if (!bcache.has(cur.shader)) bcache.set(cur.shader, new WeakMap());
|
||||
if (!bcache.get(cur.shader).has(mesh)) bcache.get(cur.shader).set(mesh, bind);
|
||||
cur.mesh = mesh;
|
||||
cur.ssbo = ssbo;
|
||||
cur.bind = bind;
|
||||
bind.attrib = [];
|
||||
if (cur.shader.vs.inputs)
|
||||
for (var a of cur.shader.vs.inputs) {
|
||||
|
@ -393,11 +418,8 @@ function sg_bind(mesh, ssbo) {
|
|||
bind.ssbo = [];
|
||||
if (cur.shader.vs.storage_buffers) for (var b of cur.shader.vs.storage_buffers) bind.ssbo.push(ssbo);
|
||||
|
||||
bind.inst = 1;
|
||||
bind.images = cur.images;
|
||||
|
||||
cur.bind = bind;
|
||||
|
||||
render.setbind(cur.bind);
|
||||
|
||||
return bind;
|
||||
|
@ -501,11 +523,7 @@ render.draw_gui = true;
|
|||
render.draw_gizmos = true;
|
||||
|
||||
render.buckets = [];
|
||||
render.sprites = function render_sprites(gridsize = 1) {
|
||||
// When y sorting, draw layer is firstly important followed by the gameobject position
|
||||
//for (var sprite of allsprites)
|
||||
// sprite.sync();
|
||||
|
||||
render.sprites = function render_sprites() {
|
||||
profile.frame("drawing");
|
||||
render.use_shader(spritessboshader);
|
||||
var buckets = component.sprite_buckets();
|
||||
|
@ -515,7 +533,8 @@ render.sprites = function render_sprites(gridsize = 1) {
|
|||
var sparray = layer[img];
|
||||
if (sparray.length === 0) continue;
|
||||
var ss = sparray[0];
|
||||
render.use_mat(ss);
|
||||
// render.use_mat(ss);
|
||||
cur.images = [ss.diffuse];
|
||||
render.make_sprite_ssbo(sparray, sprite_ssbo);
|
||||
render.draw(shape.quad, sprite_ssbo, sparray.length);
|
||||
if (debug.sprite_nums) render.text(ss.diffuse.getid(), ss.transform.pos);
|
||||
|
@ -722,11 +741,11 @@ function img_e() {
|
|||
}
|
||||
|
||||
render.image = function image(tex, pos, scale, rotation = 0, color = Color.white) {
|
||||
if (typeof tex === "string") {
|
||||
if (typeof tex === "string")
|
||||
tex = game.texture(tex);
|
||||
scale.x ??= tex.width;
|
||||
scale.y ??= tex.height;
|
||||
}
|
||||
|
||||
scale ??= [tex.width,tex.height];
|
||||
|
||||
if (!tex) return;
|
||||
|
||||
if (!lasttex) {
|
||||
|
@ -740,7 +759,7 @@ render.image = function image(tex, pos, scale, rotation = 0, color = Color.white
|
|||
}
|
||||
|
||||
var e = img_e();
|
||||
e.transform.trs(pos, undefined, scale ? scale.div([tex.width, tex.height]) : undefined);
|
||||
e.transform.trs(pos, undefined, scale);
|
||||
e.shade = color;
|
||||
|
||||
return;
|
||||
|
|
|
@ -21,17 +21,14 @@ readonly buffer ssbo {
|
|||
sprite sprites[];
|
||||
};
|
||||
|
||||
uniform mat4 projection;
|
||||
uniform mat4 view;
|
||||
uniform mat4 vp;
|
||||
uniform vec2 diffuse_size;
|
||||
|
||||
void main()
|
||||
{
|
||||
sprite s = sprites[gl_InstanceIndex];
|
||||
pos = a_pos;
|
||||
uv = a_uv;
|
||||
pos *= vec3(diffuse_size * s.rect.zw,1);
|
||||
pos *= vec3(s.rect.zw,1);
|
||||
uv = (uv*s.rect.zw)+s.rect.xy;
|
||||
gl_Position = vp * s.model * vec4(pos, 1.0);
|
||||
shade = s.shade;
|
||||
|
|
|
@ -715,9 +715,8 @@ sg_bindings js2bind(JSValue v)
|
|||
sg_bindings bind = {0};
|
||||
JSValue attrib = js_getpropstr(v, "attrib");
|
||||
|
||||
for (int i = 0; i < js_arrlen(attrib); i++) {
|
||||
for (int i = 0; i < js_arrlen(attrib); i++)
|
||||
bind.vertex_buffers[i] = *js2sg_buffer(js_getpropidx(attrib,i));
|
||||
}
|
||||
|
||||
JSValue index = js_getpropstr(v, "index");
|
||||
if (!JS_IsUndefined(index))
|
||||
|
@ -1107,7 +1106,16 @@ JSC_CCALL(render_make_sprite_ssbo,
|
|||
|
||||
for (int i = 0; i < js_arrlen(array); i++) {
|
||||
JSValue sub = js_getpropidx(array,i);
|
||||
|
||||
ms[i].model = transform2mat(js2transform(js_getpropstr(sub, "transform")));
|
||||
texture *t = js2texture(js_getpropstr(sub, "texture"));
|
||||
if (t) {
|
||||
HMM_Vec3 tscale;
|
||||
tscale.x = t->width;
|
||||
tscale.y = t->height;
|
||||
tscale.z = 1;
|
||||
ms[i].model = HMM_MulM4(ms[i].model, HMM_Scale(tscale));
|
||||
}
|
||||
ms[i].rect = js2vec4(js_getpropstr(sub,"rect"));
|
||||
ms[i].shade = js2vec4(js_getpropstr(sub,"shade"));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue