From f65e00b94f6c7fa8f5b08d655e388bd2a88ec7f2 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 7 Apr 2026 07:13:51 +0200 Subject: [PATCH] Optimize water reflection rendering with time-based updates --- src/viewport-three/viewport-host.ts | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/viewport-three/viewport-host.ts b/src/viewport-three/viewport-host.ts index a9201ca8..7fb13046 100644 --- a/src/viewport-three/viewport-host.ts +++ b/src/viewport-three/viewport-host.ts @@ -3055,6 +3055,7 @@ export class ViewportHost { } const reflectionMode = this.getWaterReflectionMode(); + const now = performance.now(); for (const binding of this.viewportWaterSurfaceBindings) { if ( @@ -3085,6 +3086,11 @@ export class ViewportHost { continue; } + if (binding.reflectionTextureUniform.value !== null && now - binding.lastReflectionUpdateTime < WATER_REFLECTION_UPDATE_INTERVAL_MS) { + binding.reflectionEnabledUniform.value = 0.36; + continue; + } + const hiddenObjects: Array<{ object: Object3D; visible: boolean }> = []; const hideObject = (object: Object3D | null | undefined) => { if (object === null || object === undefined) { @@ -3131,19 +3137,23 @@ export class ViewportHost { const previousAutoClear = this.renderer.autoClear; const previousRenderTarget = this.renderer.getRenderTarget(); - this.renderer.autoClear = true; - this.renderer.setRenderTarget(binding.reflectionRenderTarget); - this.renderer.clear(); - this.renderer.render(this.scene, this.waterReflectionCamera); - this.renderer.setRenderTarget(previousRenderTarget); - this.renderer.autoClear = previousAutoClear; + try { + this.renderer.autoClear = true; + this.renderer.setRenderTarget(binding.reflectionRenderTarget); + this.renderer.clear(); + this.renderer.render(this.scene, this.waterReflectionCamera); + } finally { + this.renderer.setRenderTarget(previousRenderTarget); + this.renderer.autoClear = previousAutoClear; - for (const hiddenObject of hiddenObjects) { - hiddenObject.object.visible = hiddenObject.visible; + for (const hiddenObject of hiddenObjects) { + hiddenObject.object.visible = hiddenObject.visible; + } } binding.reflectionTextureUniform.value = binding.reflectionRenderTarget.texture; binding.reflectionEnabledUniform.value = 0.36; + binding.lastReflectionUpdateTime = now; } }