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 && (