mylingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
71 lines • 3.32 kB
JavaScript
import { Cancellable } from "@lincode/promiselikes";
import { createNestedEffect } from "@lincode/reactivity";
import { mouseEvents } from "../../../../api/mouse";
import { onSceneGraphChange } from "../../../../events/onSceneGraphChange";
import { onSelectionRecompute } from "../../../../events/onSelectionRecompute";
import { emitSelectionTarget, onSelectionTarget } from "../../../../events/onSelectionTarget";
import { getEditing } from "../../../../states/useEditing";
import { getEditorMode } from "../../../../states/useEditorMode";
import { resetMultipleSelectionTargets } from "../../../../states/useMultipleSelectionTargets";
import { getSelectionTarget, setSelectionTarget } from "../../../../states/useSelectionTarget";
import { getTransformControlsDragging } from "../../../../states/useTransformControlsDragging";
import { vec2Point } from "../../../utils/vec2Point";
import pickable from "./pickable";
import selectionCandidates, { getSelectionCandidates } from "./selectionCandidates";
let pathObjects = [];
export default () => {
createNestedEffect(() => {
if (!getEditing() ||
getTransformControlsDragging() ||
getEditorMode() !== "path")
return;
getSelectionCandidates(pathObjects);
const handle0 = onSceneGraphChange(() => getSelectionCandidates(pathObjects));
const handle1 = onSelectionRecompute(() => {
getSelectionCandidates(pathObjects);
emitSelectionTarget();
});
const handle2 = new Cancellable();
Promise.all([
import("../../../primitives/Sphere"),
import("../../../Curve")
]).then(([{ default: Sphere }, { default: Curve }]) => {
if (handle2.done)
return;
const curve = new Curve();
handle2.then(() => curve.dispose());
handle2.watch(mouseEvents.on("click", (e) => {
setTimeout(() => {
if (handle2.done || getSelectionTarget())
return;
const target = new Sphere();
target.scale = 0.1;
target.placeAt(e.point);
target.name = "point" + pathObjects.length;
pathObjects.push(target);
emitSelectionTarget(target);
curve.addPoint(vec2Point(target.outerObject3d.position));
});
}));
});
const handle3 = mouseEvents.on("click", () => emitSelectionTarget());
const handle4 = pickable("click", selectionCandidates, (target) => emitSelectionTarget(target));
const handle5 = onSelectionTarget(({ target }) => {
resetMultipleSelectionTargets();
setSelectionTarget(target);
});
return () => {
handle2.cancel();
handle0.cancel();
handle1.cancel();
handle2.cancel();
handle3.cancel();
handle4.cancel();
handle5.cancel();
if (getEditorMode() !== "path") {
pathObjects = [];
}
};
}, [getEditing, getTransformControlsDragging, getEditorMode]);
};
//# sourceMappingURL=useRaycastPath.js.map