mylingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
38 lines (31 loc) • 1.17 kB
text/typescript
import { debounce } from "@lincode/utils"
import { Object3D } from "three"
import StaticObjectManager from ".."
import Appendable, { appendableRoot } from "../../../../api/core/Appendable"
import { getSelectionFrozen } from "../../../../states/useSelectionFrozen"
const selectionCandidates = new Set<Object3D>()
export default selectionCandidates
export const unselectableSet = new WeakSet<Appendable>()
const traverse = (
targets:
| Array<Appendable | StaticObjectManager>
| Set<Appendable | StaticObjectManager>,
frozenSet: Set<Appendable>
) => {
for (const manager of targets) {
if (frozenSet.has(manager)) continue
if ("addToRaycastSet" in manager && !unselectableSet.has(manager))
//@ts-ignore
manager.addToRaycastSet(selectionCandidates)
manager.children && traverse(manager.children, frozenSet)
}
}
export const getSelectionCandidates = debounce(
(targets: Array<Appendable> | Set<Appendable> = appendableRoot) => {
const [frozenSet] = getSelectionFrozen()
selectionCandidates.clear()
traverse(targets, frozenSet)
},
0,
"trailing"
)