diff --git a/packages/viewer/src/systems/door/door-system.tsx b/packages/viewer/src/systems/door/door-system.tsx index d261cb80..257798e3 100644 --- a/packages/viewer/src/systems/door/door-system.tsx +++ b/packages/viewer/src/systems/door/door-system.tsx @@ -2412,6 +2412,10 @@ function syncDoorCutout(node: DoorNode, mesh: THREE.Mesh) { if (!cutout) { cutout = new THREE.Mesh() cutout.name = 'cutout' + // The cutout is a 1m-deep CSG helper for the wall hole — never interactive. + // three.js raycasts invisible meshes, so without this its front face (0.5m + // proud of the door) intercepts every paint/hover ray. + cutout.raycast = noopHitboxRaycast mesh.add(cutout) } cutout.geometry.dispose() diff --git a/packages/viewer/src/systems/window/window-system.tsx b/packages/viewer/src/systems/window/window-system.tsx index feed9e73..a45f4f12 100644 --- a/packages/viewer/src/systems/window/window-system.tsx +++ b/packages/viewer/src/systems/window/window-system.tsx @@ -3500,6 +3500,10 @@ function syncWindowCutout(node: WindowNode, mesh: THREE.Mesh) { if (!cutout) { cutout = new THREE.Mesh() cutout.name = 'cutout' + // The cutout is a 1m-deep CSG helper for the wall hole — never interactive. + // three.js raycasts invisible meshes, so without this its front face (0.5m + // proud of the glass) intercepts every paint/hover ray. + cutout.raycast = noopHitboxRaycast mesh.add(cutout) } cutout.geometry.dispose()