From 0da4144b9d85030e775b1a5e8bd0975179bbdc66 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Wed, 10 Jun 2026 21:40:36 +0100 Subject: [PATCH] Optimise serialising --- .../render-pass/distance-render-pass.ts | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/graphics/rendering/render-pass/distance-render-pass.ts b/src/graphics/rendering/render-pass/distance-render-pass.ts index 864251a..ae3ad76 100644 --- a/src/graphics/rendering/render-pass/distance-render-pass.ts +++ b/src/graphics/rendering/render-pass/distance-render-pass.ts @@ -29,13 +29,24 @@ export class DistanceRenderPass extends RenderPass { const radiusInNDC = worldR * commonUniforms.scaleWorldLengthToNDC; const stepsInNDC = 2 * stepsInUV; + const maxMinDistance = radiusInNDC * (this.isWorldInverted ? -1 : 1); + + const serializedDrawables = this.drawables.map((drawable) => { + const drawableUniforms: { [name: string]: Array } = {}; + drawable.serializeToUniforms( + drawableUniforms, + commonUniforms.transformWorldToNDC, + commonUniforms.scaleWorldLengthToNDC + ); + return { drawable, drawableUniforms }; + }); let drawnDrawablesCount = 0; for (let x = -1; x < 1; x += stepsInNDC) { for (let y = -1; y < 1; y += stepsInNDC) { - const uniforms = { + const uniforms: any = { ...commonUniforms, - maxMinDistance: radiusInNDC * (this.isWorldInverted ? -1 : 1), + maxMinDistance, }; const uvBottomLeft = vec2.fromValues(x / 2 + 0.5, y / 2 + 0.5); @@ -55,19 +66,20 @@ export class DistanceRenderPass extends RenderPass { uniforms.uvToWorld ); - const drawablesNearTile = this.drawables.filter( - (d) => d.minDistance(tileCenterWorldCoordinates) < 2 * worldR - ); + for (const { drawable, drawableUniforms } of serializedDrawables) { + if (drawable.minDistance(tileCenterWorldCoordinates) >= 2 * worldR) { + continue; + } - drawnDrawablesCount += drawablesNearTile.length; + drawnDrawablesCount++; - drawablesNearTile.forEach((p) => - p.serializeToUniforms( - uniforms, - uniforms.transformWorldToNDC, - uniforms.scaleWorldLengthToNDC - ) - ); + for (const name in drawableUniforms) { + if (!Object.prototype.hasOwnProperty.call(uniforms, name)) { + uniforms[name] = []; + } + uniforms[name].push(...drawableUniforms[name]); + } + } this.program.draw(uniforms); }