From 282f874e08d6e558b90c344851000b2a49703983 Mon Sep 17 00:00:00 2001 From: Cam Pedersen Date: Sun, 3 May 2026 10:36:33 -0400 Subject: [PATCH] fix(xr): disable post-processing while presenting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EffectComposer (N8AO + Vignette) renders to an offscreen target and blits to the canvas — that path doesn't write into the XR layer's framebuffer, so during a WebXR session the scene goes black and only objects rendered directly by WebXRManager (hands, controllers) show. That's the "all black except your hands" symptom in immersive-vr. Skip the EffectComposer when `xrPresenting` is true. Outside XR the post-processing is unchanged. --- packages/app/src/components/ViewportContent.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/app/src/components/ViewportContent.tsx b/packages/app/src/components/ViewportContent.tsx index b7f0a3fa..dae984a6 100644 --- a/packages/app/src/components/ViewportContent.tsx +++ b/packages/app/src/components/ViewportContent.tsx @@ -1785,8 +1785,12 @@ export function ViewportContent({ mode = "3d" }: { mode?: "3d" | "pcb" }) { )} - {/* Post-processing effects - disabled during camera motion for FPS */} - {engineReady && !isCameraMoving && sceneSettings.postProcessing.ambientOcclusion?.enabled !== false && sceneSettings.postProcessing.vignette?.enabled !== false && ( + {/* Post-processing effects - disabled during camera motion for FPS, and + while a WebXR session is active. EffectComposer renders to an + offscreen target and blits to the canvas, which doesn't write to the + XR layer's framebuffer — so in VR/AR the scene goes black and only + objects rendered directly by WebXRManager (hands, controllers) show. */} + {engineReady && !isCameraMoving && !xrPresenting && sceneSettings.postProcessing.ambientOcclusion?.enabled !== false && sceneSettings.postProcessing.vignette?.enabled !== false && ( )} {/* AO only mode */} - {engineReady && !isCameraMoving && sceneSettings.postProcessing.ambientOcclusion?.enabled !== false && sceneSettings.postProcessing.vignette?.enabled === false && ( + {engineReady && !isCameraMoving && !xrPresenting && sceneSettings.postProcessing.ambientOcclusion?.enabled !== false && sceneSettings.postProcessing.vignette?.enabled === false && ( )} {/* Vignette only mode */} - {engineReady && !isCameraMoving && sceneSettings.postProcessing.ambientOcclusion?.enabled === false && sceneSettings.postProcessing.vignette?.enabled !== false && ( + {engineReady && !isCameraMoving && !xrPresenting && sceneSettings.postProcessing.ambientOcclusion?.enabled === false && sceneSettings.postProcessing.vignette?.enabled !== false && (