From 361135a24e1c93d06cc86c2b8f5179b25d786ae1 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Thu, 21 May 2026 19:14:01 +0000 Subject: [PATCH] Changes Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com> --- src/components/three/ModelViewer.tsx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/components/three/ModelViewer.tsx b/src/components/three/ModelViewer.tsx index 1262bf2..178f115 100644 --- a/src/components/three/ModelViewer.tsx +++ b/src/components/three/ModelViewer.tsx @@ -753,11 +753,30 @@ function SelectionHandler() { useModelStore.getState().toggleElementSelection(key); }; + const onR3FMiss = (event: Event) => { + const detail = (event as CustomEvent).detail; + if (!detail || detail.button !== 0) return; + const rect = canvas.getBoundingClientRect(); + mouse.x = ((detail.clientX - rect.left) / rect.width) * 2 - 1; + mouse.y = -((detail.clientY - rect.top) / rect.height) * 2 + 1; + raycaster.setFromCamera(mouse, camera); + const intersects = raycaster.intersectObjects(scene.children, true); + const hit = intersects.find((i) => isPickableModelMesh(i.object)); + if (!hit) return; + + const element = findElementRoot(hit.object); + const modelId = useModelStore.getState().activeModelId; + if (!modelId || !element) return; + useModelStore.getState().toggleElementSelection(elementKey(modelId, element)); + }; + canvas.addEventListener('pointerdown', onDown); canvas.addEventListener('pointerup', onUp); + canvas.addEventListener('tsxr-selection-miss', onR3FMiss); return () => { canvas.removeEventListener('pointerdown', onDown); canvas.removeEventListener('pointerup', onUp); + canvas.removeEventListener('tsxr-selection-miss', onR3FMiss); gl.domElement.style.cursor = prevCursor; }; }, [selectionMode, camera, scene, gl, raycaster, mouse]);