From fe3430000d1c5eb03a03fb54f17e96b61c044d8d Mon Sep 17 00:00:00 2001 From: Noeri Huisman <8823461+mrxz@users.noreply.github.com> Date: Tue, 1 Jul 2025 07:26:17 +0200 Subject: [PATCH] Use RenderTarget properties to reduce manual render state tracking (#80) --- src/PackedSplats.ts | 23 ++++++++--------------- src/Readback.ts | 20 ++++++-------------- 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/src/PackedSplats.ts b/src/PackedSplats.ts index ee93abe..456738a 100644 --- a/src/PackedSplats.ts +++ b/src/PackedSplats.ts @@ -357,6 +357,7 @@ export class PackedSplats { this.target.texture.format = THREE.RGBAIntegerFormat; this.target.texture.type = THREE.UnsignedIntType; this.target.texture.internalFormat = "RGBA32UI"; + this.target.scissorTest = true; return true; } @@ -503,27 +504,21 @@ export class PackedSplats { private saveRenderState(renderer: THREE.WebGLRenderer) { return { - xrPresenting: renderer.xr.isPresenting, + xrEnabled: renderer.xr.enabled, autoClear: renderer.autoClear, - scissorTest: renderer.getScissorTest(), - pixelRatio: renderer.getPixelRatio(), }; } private resetRenderState( renderer: THREE.WebGLRenderer, state: { - xrPresenting: boolean; + xrEnabled: boolean; autoClear: boolean; - scissorTest: boolean; - pixelRatio: number; }, ) { renderer.setRenderTarget(null); - renderer.setPixelRatio(state.pixelRatio); - renderer.xr.isPresenting = state.xrPresenting; + renderer.xr.enabled = state.xrEnabled; renderer.autoClear = state.autoClear; - renderer.setScissorTest(state.scissorTest); } // Executes a dyno program specified by generator which is any DynoBlock that @@ -575,17 +570,15 @@ export class PackedSplats { ); // Render the desired portion of the layer - renderer.setPixelRatio(1); - renderer.setRenderTarget(this.target, layer); - renderer.xr.isPresenting = false; - renderer.autoClear = false; - renderer.setScissorTest(true); - renderer.setScissor( + this.target.scissor.set( 0, layerYStart, SPLAT_TEX_WIDTH, layerYEnd - layerYStart, ); + renderer.setRenderTarget(this.target, layer); + renderer.xr.enabled = false; + renderer.autoClear = false; renderer.render(PackedSplats.scene, PackedSplats.camera); base += SPLAT_TEX_WIDTH * (layerYEnd - layerYStart); diff --git a/src/Readback.ts b/src/Readback.ts index 67000a9..d56c21c 100644 --- a/src/Readback.ts +++ b/src/Readback.ts @@ -84,6 +84,7 @@ export class Readback { this.target.texture.format = THREE.RGBAFormat; this.target.texture.type = THREE.UnsignedByteType; this.target.texture.internalFormat = "RGBA8"; + this.target.scissorTest = true; } } @@ -129,27 +130,21 @@ export class Readback { private saveRenderState(renderer: THREE.WebGLRenderer) { return { - xrPresenting: renderer.xr.isPresenting, + xrEnabled: renderer.xr.enabled, autoClear: renderer.autoClear, - scissorTest: renderer.getScissorTest(), - pixelRatio: renderer.getPixelRatio(), }; } private resetRenderState( renderer: THREE.WebGLRenderer, state: { - xrPresenting: boolean; + xrEnabled: boolean; autoClear: boolean; - scissorTest: boolean; - pixelRatio: number; }, ) { renderer.setRenderTarget(null); - renderer.setPixelRatio(state.pixelRatio); - renderer.xr.isPresenting = state.xrPresenting; + renderer.xr.enabled = state.xrEnabled; renderer.autoClear = state.autoClear; - renderer.setScissorTest(state.scissorTest); } private process({ @@ -182,12 +177,10 @@ export class Readback { material.uniforms.targetLayer.value = layer; // Render the desired portion of the layer - renderer.setPixelRatio(1); + this.target.scissor.set(0, 0, SPLAT_TEX_WIDTH, layerYEnd); renderer.setRenderTarget(this.target, layer); - renderer.xr.isPresenting = false; + renderer.xr.enabled = false; renderer.autoClear = false; - renderer.setScissorTest(true); - renderer.setScissor(0, 0, SPLAT_TEX_WIDTH, layerYEnd); renderer.render(Readback.scene, Readback.camera); baseIndex += SPLAT_TEX_WIDTH * layerYEnd; @@ -234,7 +227,6 @@ export class Readback { Math.ceil((this.count - layerBase) / SPLAT_TEX_WIDTH), ); - renderer.setPixelRatio(1); renderer.setRenderTarget(this.target, layer); // Compute the subarray that this layer of readback corresponds to