fix(paint-slots): disable the CSG cutout's raycast so window/door paint hits the slots
The real interceptor was the 'cutout' mesh, not the hitbox: it's a 1m-deep CSG helper whose front face sits 0.5m proud of the glass, and current three.js raycasts invisible meshes — so every paint/hover ray resolved to 'cutout' (no slotId → role null). Disable its raycast; combined with the hitbox noop, paint/hover rays now land on the tagged frame/glass (panel/glass) children. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
531dbb6e68
commit
c3bd065f2f
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user