diff --git a/frontend/apps/artcraft/app/src/pages/PageEnigma/Editor/editor.ts b/frontend/apps/artcraft/app/src/pages/PageEnigma/Editor/editor.ts index bc79434b83..1594d5fe20 100644 --- a/frontend/apps/artcraft/app/src/pages/PageEnigma/Editor/editor.ts +++ b/frontend/apps/artcraft/app/src/pages/PageEnigma/Editor/editor.ts @@ -42,6 +42,7 @@ import { } from "~/signals"; import { outlinerState, updateObjectPanel } from "../signals"; +import { transformSpace } from "../signals/selectedMode"; import { IGenerationOptions } from "../models/generationOptions"; import { toEngineActions } from "../Queue/toEngineActions"; import { SceneGenereationMetaData } from "../models/sceneGenerationMetadata"; @@ -592,8 +593,7 @@ class Editor { this.cameraViewControls.enabled = true; this.control = new TransformControls(this.camera, this.renderer.domElement); - this.control.space = "local"; // Local transformation mode - // .space = 'world'; // Global mode + this.control.space = "world"; // Default to world space for translate mode this.control.setScaleSnap(0.01); this.control.setTranslationSnap(0.01); this.control.setRotationSnap(0.01); @@ -1538,9 +1538,18 @@ class Editor { return; } this.control.mode = type; + this.control.space = type === "scale" ? "local" : transformSpace.value; this.transform_interaction = true; } + toggleTransformSpace() { + if (this.control == undefined || this.control.mode === "scale") { + return; + } + transformSpace.value = transformSpace.value === "world" ? "local" : "world"; + this.control.space = transformSpace.value; + } + async stopPlaybackAndUploadVideo() { await this.videoGeneration.stopPlaybackAndUploadVideo(); } diff --git a/frontend/apps/artcraft/app/src/pages/PageEnigma/Editor/keybinds_controls.ts b/frontend/apps/artcraft/app/src/pages/PageEnigma/Editor/keybinds_controls.ts index dca9b02a5d..eadcf76aff 100644 --- a/frontend/apps/artcraft/app/src/pages/PageEnigma/Editor/keybinds_controls.ts +++ b/frontend/apps/artcraft/app/src/pages/PageEnigma/Editor/keybinds_controls.ts @@ -20,6 +20,7 @@ import { selectedMode, poseMode, showPoseControls, + transformSpace, } from "../signals/selectedMode"; import { Euler } from "three"; @@ -341,16 +342,25 @@ export class MouseControls { } else if (event.key === "t") { // transform this.control?.setMode("translate"); + if (this.control) this.control.space = transformSpace.value; selectedMode.value = "move"; return; + } else if (event.key === "x") { + // toggle world/local space (blocked in scale mode) + if (this.control?.mode === "scale") return; + transformSpace.value = transformSpace.value === "world" ? "local" : "world"; + if (this.control) this.control.space = transformSpace.value; + return; } else if (event.key === "r" && !event.ctrlKey) { // rotate this.control?.setMode("rotate"); + if (this.control) this.control.space = transformSpace.value; selectedMode.value = "rotate"; return; } else if (event.key === "g") { // scale this.control?.setMode("scale"); + if (this.control) this.control.space = transformSpace.value; selectedMode.value = "scale"; return; } else if (event.key === "k") { diff --git a/frontend/apps/artcraft/app/src/pages/PageEnigma/comps/Controls3D/Controls3D.tsx b/frontend/apps/artcraft/app/src/pages/PageEnigma/comps/Controls3D/Controls3D.tsx index 40e291764d..138f3e307d 100644 --- a/frontend/apps/artcraft/app/src/pages/PageEnigma/comps/Controls3D/Controls3D.tsx +++ b/frontend/apps/artcraft/app/src/pages/PageEnigma/comps/Controls3D/Controls3D.tsx @@ -22,7 +22,7 @@ import { useTabStore } from "~/pages/Stores/TabState"; // eslint-disable-next-line import/no-unresolved // import { AssetType } from "~/enums"; import { AssetModal } from "../AssetMenu/AssetModal"; -import { selectedMode } from "../../signals/selectedMode"; +import { selectedMode, transformSpace } from "../../signals/selectedMode"; import { useSignals } from "@preact/signals-react/runtime"; import { outlinerState } from "../../signals/outliner/outliner"; // eslint-disable-next-line import/no-unresolved @@ -320,6 +320,33 @@ export const Controls3D = () => { onOptionChange={handleModeChange} selectedOption={selectedMode.value} /> + {selectedMode.value === "scale" ? ( + + + + ) : ( + + + + )} diff --git a/frontend/apps/artcraft/app/src/pages/PageEnigma/signals/selectedMode.ts b/frontend/apps/artcraft/app/src/pages/PageEnigma/signals/selectedMode.ts index b57e04d9fc..9f01de7605 100644 --- a/frontend/apps/artcraft/app/src/pages/PageEnigma/signals/selectedMode.ts +++ b/frontend/apps/artcraft/app/src/pages/PageEnigma/signals/selectedMode.ts @@ -3,3 +3,4 @@ import { signal } from "@preact/signals-react"; export const selectedMode = signal("move"); export const showPoseControls = signal(false); export const poseMode = signal("select"); +export const transformSpace = signal<"world" | "local">("world");