UNPKG

mylingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

45 lines 2.02 kB
import store, { createEffect, createMemo, createRef } from "@lincode/reactivity"; import { raycast } from "../display/core/StaticObjectManager/raycast/pickable"; import selectionCandidates, { unselectableSet } from "../display/core/StaticObjectManager/raycast/selectionCandidates"; import Sphere from "../display/primitives/Sphere"; import clientToWorld from "../display/utils/clientToWorld"; import normalizeClientPosition from "../display/utils/normalizeClientPosition"; import { point2Vec, vec2Point } from "../display/utils/vec2Point"; import { emitSelectionTarget } from "../events/onSelectionTarget"; export const [setDragEvent, getDragEvent] = store(undefined); createEffect(() => { const e = getDragEvent(); const pointRef = createRef({ x: 0, y: 0, z: 0 }); const hitManagerRef = createRef(); const isDragEvent = e instanceof DragEvent; const indicator = createMemo(() => { if (!isDragEvent) return; const indicator = new Sphere(); indicator.name = "indicator"; unselectableSet.add(indicator); indicator.opacity = 0.5; return indicator; }, [isDragEvent]); if (typeof e === "function") { const manager = e(hitManagerRef.current); if (!manager) return; Object.assign(manager, pointRef.current); emitSelectionTarget(manager); return; } if (!isDragEvent || !indicator) return; const [xNorm, yNorm] = normalizeClientPosition(e.clientX, e.clientY); const hit = raycast(xNorm, yNorm, selectionCandidates); hitManagerRef.current = hit?.object.userData.manager; const result = hit?.point ?? point2Vec(clientToWorld(e.clientX, e.clientY)); const point = vec2Point(result); Object.assign(indicator, point); pointRef.current = point; return () => { !(getDragEvent() instanceof DragEvent) && indicator.dispose(); }; }, [getDragEvent]); //# sourceMappingURL=useDragEvent.js.map