From 05055af127450aab9c9a86a8b4244ae62e82113a Mon Sep 17 00:00:00 2001 From: Sebastian Alff Date: Sat, 12 Aug 2023 13:00:05 +0200 Subject: [PATCH 1/3] fix update loop caused by Select --- src/Selection.tsx | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/Selection.tsx b/src/Selection.tsx index 54de97ff..53f3d832 100644 --- a/src/Selection.tsx +++ b/src/Selection.tsx @@ -22,20 +22,13 @@ export function Select({ enabled = false, children, ...props }: SelectApi) { const group = useRef(null!) const api = useContext(selectionContext) useEffect(() => { - if (api && enabled) { - let changed = false - const current: THREE.Object3D[] = [] - group.current.traverse((o) => { - o.type === 'Mesh' && current.push(o) - if (api.selected.indexOf(o) === -1) changed = true - }) - if (changed) { - api.select((state) => [...state, ...current]) - return () => { - api.select((state) => state.filter((selected) => !current.includes(selected))) - } - } - } + if (!api) return + const current: THREE.Object3D[] = [] + if (enabled) group.current.traverse((o) => { + if (o.type === 'Mesh') current.push(o) + }) + const changed = (current.length !== api.selected.length) ? true : !current.every(o => api.selected.includes(o)) + if (changed) api.select(current) }, [enabled, children, api]) return ( From 699c46fd295798ef3057e59d6e0bc6a84c908ae9 Mon Sep 17 00:00:00 2001 From: Sebastian Alff Date: Sat, 12 Aug 2023 16:04:38 +0200 Subject: [PATCH 2/3] fix update to containing Selection --- src/Selection.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Selection.tsx b/src/Selection.tsx index 53f3d832..feae7947 100644 --- a/src/Selection.tsx +++ b/src/Selection.tsx @@ -24,11 +24,14 @@ export function Select({ enabled = false, children, ...props }: SelectApi) { useEffect(() => { if (!api) return const current: THREE.Object3D[] = [] - if (enabled) group.current.traverse((o) => { + group.current.traverse((o) => { if (o.type === 'Mesh') current.push(o) }) - const changed = (current.length !== api.selected.length) ? true : !current.every(o => api.selected.includes(o)) - if (changed) api.select(current) + if (enabled && current.some(o => !api.selected.includes(o))) { + api.select(state => [...new Set([...state, ...current])]) + } else if (!enabled && current.some(o => api.selected.includes(o))) { + api.select(state => state.filter(o => !current.includes(o))) + } }, [enabled, children, api]) return ( From 06069297351f03543283fa8b70b8b6b69d1d3743 Mon Sep 17 00:00:00 2001 From: Sebastian Alff Date: Sun, 13 Aug 2023 11:51:36 +0200 Subject: [PATCH 3/3] no need for a set --- src/Selection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Selection.tsx b/src/Selection.tsx index feae7947..7b8b3f46 100644 --- a/src/Selection.tsx +++ b/src/Selection.tsx @@ -28,7 +28,7 @@ export function Select({ enabled = false, children, ...props }: SelectApi) { if (o.type === 'Mesh') current.push(o) }) if (enabled && current.some(o => !api.selected.includes(o))) { - api.select(state => [...new Set([...state, ...current])]) + api.select(state => [...state, ...current]) } else if (!enabled && current.some(o => api.selected.includes(o))) { api.select(state => state.filter(o => !current.includes(o))) }