Skip to content

Conversation

@donalffons
Copy link

See #236 for additional details

Would be great to hear your feedback on this. This code

const changed = (current.length !== api.selected.length) ? true : !current.every(o => api.selected.includes(o))

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.

@donalffons
Copy link
Author

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...

@donalffons
Copy link
Author

I've played with this a bit more and I believe this fix is now working as intended.

@drcmda
Copy link
Member

drcmda commented Aug 18, 2023

is it ready to go in? did you notice any adverse effects on older boxes?

@CodyJasonBennett CodyJasonBennett changed the title Fix update loop caused by Select perf(Select): fix update loop Aug 23, 2023
Comment on lines -25 to +33
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)))
Copy link
Member

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>).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

3 participants