From 03b4f9b52e115405a9e04c88b141ccd9788cadbb Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Thu, 7 Nov 2024 16:24:07 -0600 Subject: [PATCH] particles render without texture filter --- scripts/particle.js | 6 ++++-- scripts/render.js | 39 +++++++++++++++++++++------------------ shaders/baseparticle.cg | 1 + 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/scripts/particle.js b/scripts/particle.js index 21dea3c0..3cc85dbe 100644 --- a/scripts/particle.js +++ b/scripts/particle.js @@ -29,6 +29,8 @@ emitter.spawn = function (t) { var par = this.dead.shift(); if (par) { + par.transform.unit(); + par.transform.pos = t.pos; par.transform.scale = this.scale; this.particles.push(par); par.time = 0; @@ -65,6 +67,7 @@ emitter.step = function (dt) { // update all particles for (var p of this.particles) { p.time += dt; + p.transform.move(p.body.velocity.scale(dt)); this.step_hook?.(p); if (this.kill_hook?.(p) || p.time >= p.life) { @@ -98,7 +101,6 @@ function update_emitters(dt) { var arr = []; function draw_emitters() { - return; ssbo ??= render.make_textssbo(); render.use_shader("shaders/baseparticle.cg"); var buckets = {}; @@ -115,7 +117,7 @@ function draw_emitters() { arr.length = 0; var bucket = buckets[path]; bucket[0].baseinstance = base; - render.use_mat(bucket[0]); + render.use_mat({diffuse:bucket[0].diffuse.texture}); for (var e of bucket) { if (e.particles.length === 0) continue; for (var p of e.particles) arr.push(p); diff --git a/scripts/render.js b/scripts/render.js index 58bfd4b9..dac68e8f 100644 --- a/scripts/render.js +++ b/scripts/render.js @@ -380,7 +380,7 @@ function create_shader_obj(file) { var filez = inc.match(/#include <(.*)>/)[1]; var macro = io.slurp(filez); if (!macro) { - filez = `shaders/${filez}`; + filez = `${filez}`; macro = io.slurp(filez); } shader = shader.replace(inc, macro); @@ -471,8 +471,8 @@ function make_shader(shader, pipe) { var file = shader; shader = io.slurp(file); if (!shader) { - console.info(`not found! slurping shaders/${file}`); - shader = io.slurp(`shaders/${file}`); + console.info(`not found! slurping ${file}`); + shader = io.slurp(`${file}`); } var writejson = `.prosperon/${file.name()}.shader.json`; @@ -653,18 +653,18 @@ var polyssboshader; var sprite_ssbo; render.init = function () { - textshader = make_shader("shaders/text_base.cg"); - render.spriteshader = make_shader("shaders/sprite.cg"); - spritessboshader = make_shader("shaders/sprite_ssbo.cg"); + textshader = make_shader("text_base.cg"); + render.spriteshader = make_shader("sprite.cg"); + spritessboshader = make_shader("sprite_ssbo.cg"); var postpipe = Object.create(base_pipeline); postpipe.cull = cull_map.none; postpipe.primitive = primitive_map.triangle; - render.postshader = make_shader("shaders/simplepost.cg", postpipe); - slice9shader = make_shader("shaders/9slice.cg"); - circleshader = make_shader("shaders/circle.cg"); - polyshader = make_shader("shaders/poly.cg"); - parshader = make_shader("shaders/baseparticle.cg"); - polyssboshader = make_shader("shaders/poly_ssbo.cg"); + render.postshader = make_shader("simplepost.cg", postpipe); + slice9shader = make_shader("9slice.cg"); + circleshader = make_shader("circle.cg"); + polyshader = make_shader("poly.cg"); + parshader = make_shader("baseparticle.cg"); + polyssboshader = make_shader("poly_ssbo.cg"); poly_ssbo = render.make_textssbo(); sprite_ssbo = render.make_textssbo(); @@ -839,7 +839,7 @@ function flush_poly() { poly_idx = 0; } -render.line = function render_line(points, color = Color.white, thickness = 1) { +render.line = function render_line(points, color = Color.white, thickness = 1, shader = polyssboshader, pipe = base_pipeline) { for (var i = 0; i < points.length - 1; i++) { var a = points[i]; var b = points[i + 1]; @@ -850,6 +850,8 @@ render.line = function render_line(points, color = Color.white, thickness = 1) { poly.transform.scale = [dist, thickness, 1]; poly.color = color; } + queued_shader = shader; + queued_pipe = pipe; check_flush(flush_poly); }; @@ -882,7 +884,6 @@ render.coordinate = function render_coordinate(pos, size, color) { var queued_shader; var queued_pipe; render.rectangle = function render_rectangle(rect, color = Color.white, shader = polyssboshader, pipe = base_pipeline) { - var transform = os.make_transform(); var wh = [rect.width, rect.height]; var poly = poly_e(); var pos = [rect.x,rect.y].add([rect.width,rect.height].scale(0.5)); @@ -981,7 +982,7 @@ render.fillmask = function(ref) { render.forceflush(); var pipe = stencil_writer(ref); - render.use_shader('shaders/screenfill.cg', pipe); + render.use_shader('screenfill.cg', pipe); render.draw(shape.quad); } @@ -1006,7 +1007,7 @@ Object.assign(stencil_inverter, { render.invertmask = function() { render.forceflush(); - render.use_shader('shaders/screenfill.cg', stencil_inverter); + render.use_shader('screenfill.cg', stencil_inverter); render.draw(shape.quad); } @@ -1021,7 +1022,7 @@ render.mask = function mask(image, pos, scale, rotation = 0, ref = 1) else scale = vector.v3one; var pipe = stencil_writer(ref); - render.use_shader('shaders/sprite.cg', pipe); + render.use_shader('sprite.cg', pipe); var t = os.make_transform(); t.trs(pos, undefined,scale); set_model(t); @@ -1082,6 +1083,8 @@ render.slice9 = function (image, rect = [0,0], slice = 0, color = Color.white) { var tex = image.texture; var image_size = calc_image_size(image); var size = [rect.width ? rect.width : image_size.x, rect.height ? rect.height : image_size.y]; + + check_flush(); slice9_t.trs([rect.x,rect.y].sub(size.scale([rect.anchor_x, rect.anchor_y])), undefined, size); slice = clay.normalizeSpacing(slice); @@ -1394,8 +1397,8 @@ prosperon.render = function () { render.viewport(prosperon.camera.view(), false); if (render.draw_sprites) render.sprites(); - if (render.draw_particles) draw_emitters(); prosperon.draw(); + if (render.draw_particles) draw_emitters(); render.fillmask(0); render.forceflush(); diff --git a/shaders/baseparticle.cg b/shaders/baseparticle.cg index 2745cc2b..35fc28f8 100644 --- a/shaders/baseparticle.cg +++ b/shaders/baseparticle.cg @@ -35,6 +35,7 @@ in vec4 color0; out vec4 color; texture2D diffuse; +@sampler_type smp nonfiltering sampler smp; void main()