-
Notifications
You must be signed in to change notification settings - Fork 108
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
perf(Select): fix update loop #237
base: master
Are you sure you want to change the base?
Conversation
Hmm after testing this further, I realized that this doesn't work in the case of <Canvas>
<Selection>
<Select enabled>
<Box name="box" />
</Select>
<Select enabled={false}>
</Select>
</Selection>
</Canvas> I will look into this some more... |
I've played with this a bit more and I believe this fix is now working as intended. |
is it ready to go in? did you notice any adverse effects on older boxes? |
if (api && enabled) { | ||
let changed = false | ||
const current: THREE.Object3D<THREE.Event>[] = [] | ||
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<THREE.Event>[] = [] | ||
group.current.traverse((o) => { | ||
if (o.type === 'Mesh') current.push(o) | ||
}) | ||
if (enabled && current.some(o => !api.selected.includes(o))) { | ||
api.select(state => [...state, ...current]) | ||
} else if (!enabled && current.some(o => api.selected.includes(o))) { | ||
api.select(state => state.filter(o => !current.includes(o))) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why remove the cleanup handler? I'm not sure I understand when L33 is supposed to happen in the case of a Select unmounting with any number of siblings rather than parents who rerender when children
change (e.g. <Selection> <Select /> <Select /> </Selection>
).
See #236 for additional details
Would be great to hear your feedback on this. This code
is only correct if there are no duplicates in any of the two arrays (otherwise, they would have to be de-duped first) - but I believe that is the case here.