lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
76 lines • 3.52 kB
JavaScript
import { createEffect } from "@lincode/reactivity";
import { emitTransformControls } from "../../events/onTransformControls";
import { getSelectionTarget } from "../../states/useSelectionTarget";
import { getTransformControlsSnap } from "../../states/useTransformControlsSnap";
import scene from "../scene";
import { lazy } from "@lincode/utils";
import { Cancellable } from "@lincode/promiselikes";
import { setTransformControlsDragging } from "../../states/useTransformControlsDragging";
import { getTransformControlsSpaceComputed } from "../../states/useTransformControlsSpaceComputed";
import { getCameraRendered } from "../../states/useCameraRendered";
import { getEditorModeComputed } from "../../states/useEditorModeComputed";
import { CM2M } from "../../globals";
import { deg2Rad } from "@lincode/math";
import { container } from "../renderLoop/containers";
import { ssrExcludeSet } from "../../collections/ssrExcludeSet";
import { cameraRenderedPtr } from "../../pointers/cameraRenderedPtr";
import { selectionTargetPtr } from "../../pointers/selectionTargetPtr";
import { renderCheckExcludeSet } from "../../collections/renderCheckExcludeSet";
import { transformControlsModePtr } from "../../pointers/transformControlsModePtr";
const lazyTransformControls = lazy(async () => {
const { TransformControls } = await import("./TransformControls");
const transformControls = new TransformControls(cameraRenderedPtr[0], container);
getCameraRendered((camera) => (transformControls.camera = camera));
transformControls.enabled = false;
transformControls.addEventListener("dragging-changed", ({ value }) => {
setTransformControlsDragging(value);
emitTransformControls(value ? "start" : "end");
});
return transformControls;
});
createEffect(() => {
const [selectionTarget] = selectionTargetPtr;
const target = selectionTarget && "outerObject3d" in selectionTarget
? selectionTarget.outerObject3d
: undefined;
if (!target)
return;
const _mode = getEditorModeComputed();
const mode = _mode === "curve" ? "translate" : _mode;
if (mode !== "translate" && mode !== "rotate" && mode !== "scale")
return;
transformControlsModePtr[0] = mode;
const space = getTransformControlsSpaceComputed();
const snap = !getTransformControlsSnap();
const handle = new Cancellable();
lazyTransformControls().then((transformControls) => {
if (handle.done || !target.parent)
return;
transformControls.setMode(mode);
transformControls.setSpace(space);
transformControls.setScaleSnap(snap ? 10 * CM2M : null);
transformControls.setRotationSnap(snap ? 15 * deg2Rad : null);
transformControls.setTranslationSnap(snap ? 10 * CM2M : null);
scene.add(transformControls);
transformControls.attach(target);
transformControls.enabled = true;
ssrExcludeSet.add(transformControls);
renderCheckExcludeSet.add(transformControls);
handle.then(() => {
scene.remove(transformControls);
transformControls.detach();
transformControls.enabled = false;
ssrExcludeSet.delete(transformControls);
renderCheckExcludeSet.delete(transformControls);
});
});
return () => {
handle.cancel();
};
}, [
getSelectionTarget,
getEditorModeComputed,
getTransformControlsSpaceComputed,
getTransformControlsSnap
]);
//# sourceMappingURL=index.js.map