Browse Source

Add hotkey for toggling gizmo axis mode

Josh Engebretson 10 years ago
parent
commit
9e30f46d0d

+ 20 - 4
Script/AtomicEditor/ui/MainToolbar.ts

@@ -12,6 +12,7 @@ class MainToolbar extends Atomic.UIWidget {
     translateButton: Atomic.UIButton;
     rotateButton: Atomic.UIButton;
     scaleButton: Atomic.UIButton;
+    axisButton: Atomic.UIButton;
 
     constructor(parent: Atomic.UIWidget) {
 
@@ -23,15 +24,32 @@ class MainToolbar extends Atomic.UIWidget {
         this.rotateButton = <Atomic.UIButton>this.getWidget("3d_rotate");
         this.scaleButton = <Atomic.UIButton>this.getWidget("3d_scale");
 
+        this.axisButton = <Atomic.UIButton>this.getWidget("3d_axismode");
+
         this.translateButton.value = 1;
 
         parent.addChild(this);
 
+        this.subscribeToEvent("GizmoAxisModeChanged", (ev) => this.handleGizmoAxisModeChanged(ev));
         this.subscribeToEvent("GizmoEditModeChanged", (ev) => this.handleGizmoEditModeChanged(ev));
         this.subscribeToEvent(this, "WidgetEvent", (data) => this.handleWidgetEvent(data));
     }
 
-    handleGizmoEditModeChanged(ev) {
+    handleGizmoAxisModeChanged(ev: Editor.GizmoAxisModeChangedEvent) {
+
+        if (ev.toggle) return;
+
+        if (ev.mode == Editor.AXIS_WORLD) {
+            this.axisButton.value = 1;
+            this.axisButton.text = "World";
+        } else {
+            this.axisButton.value = 0;
+            this.axisButton.text = "Local";
+        }
+
+    }
+
+    handleGizmoEditModeChanged(ev: Editor.GizmoEditModeChangedEvent) {
 
         this.translateButton.value = 0;
         this.rotateButton.value = 0;
@@ -69,9 +87,7 @@ class MainToolbar extends Atomic.UIWidget {
 
             } else if (ev.target.id == "3d_axismode") {
 
-                ev.target.text = ev.target.value ? "World" : "Local";
-
-                EditorUI.getShortcuts().invokeGizmoAxisModeChanged( ev.target.value ? Editor.AXIS_WORLD :  Editor.AXIS_LOCAL);
+                EditorUI.getShortcuts().invokeGizmoAxisModeChanged(ev.target.value ? Editor.AXIS_WORLD : Editor.AXIS_LOCAL);
                 return true;
 
             } else if (ev.target.id == "maintoolbar_play") {

+ 4 - 2
Script/AtomicEditor/ui/Shortcuts.ts

@@ -86,9 +86,9 @@ class Shortcuts extends Atomic.ScriptObject {
 
     }
 
-    invokeGizmoAxisModeChanged(mode:Editor.AxisMode) {
+    invokeGizmoAxisModeChanged(mode:Editor.AxisMode, toggle:boolean = false) {
 
-        this.sendEvent("GizmoAxisModeChanged", { mode: mode });
+        this.sendEvent("GizmoAxisModeChanged", { mode: mode, toggle: toggle });
 
     }
 
@@ -113,6 +113,8 @@ class Shortcuts extends Atomic.ScriptObject {
               this.invokeGizmoEditModeChanged(Editor.EDIT_ROTATE);
             } else if (ev.key == Atomic.KEY_R) {
                 this.invokeGizmoEditModeChanged(Editor.EDIT_SCALE);
+            } else if (ev.key == Atomic.KEY_X) {
+                this.invokeGizmoAxisModeChanged(Editor.AXIS_WORLD, true);
             }
 
         }

+ 1 - 0
Script/TypeScript/AtomicWork.d.ts

@@ -255,6 +255,7 @@ declare module Editor {
 
   export interface GizmoAxisModeChangedEvent {
     mode:AxisMode;
+    toggle:boolean;
   }
 
 }

+ 2 - 0
Source/AtomicEditor/Editors/SceneEditor3D/Gizmo3D.h

@@ -110,6 +110,8 @@ public:
     void SetView(SceneView3D* view3D);
 
     void SetAxisMode(AxisMode mode);
+    AxisMode GetAxisMode() const { return axisMode_; }
+
     void SetEditMode(EditMode mode);
 
     bool Selected()

+ 13 - 4
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditor3D.cpp

@@ -260,15 +260,24 @@ void SceneEditor3D::HandlePlayStopped(StringHash eventType, VariantMap& eventDat
 }
 
 void SceneEditor3D::HandleGizmoEditModeChanged(StringHash eventType, VariantMap& eventData)
-{
-    EditMode mode = (EditMode) ((int)eventData[GizmoEditModeChanged::P_MODE].GetFloat());
+{    
+    EditMode mode = (EditMode) (eventData[GizmoEditModeChanged::P_MODE].GetInt());
     gizmo3D_->SetEditMode(mode);
 }
 
 void SceneEditor3D::HandleGizmoAxisModeChanged(StringHash eventType, VariantMap& eventData)
 {
-    AxisMode mode = (AxisMode) ((int)eventData[GizmoEditModeChanged::P_MODE].GetFloat());
-    gizmo3D_->SetAxisMode(mode);
+    AxisMode mode = (AxisMode) (eventData[GizmoAxisModeChanged::P_MODE].GetInt());
+    bool toggle = eventData[GizmoAxisModeChanged::P_TOGGLE].GetBool();
+    if (toggle)
+    {
+        AxisMode mode = gizmo3D_->GetAxisMode() == AXIS_WORLD ? AXIS_LOCAL : AXIS_WORLD;
+        VariantMap neventData;
+        neventData[GizmoAxisModeChanged::P_MODE] = (int) mode;
+        SendEvent(E_GIZMOAXISMODECHANGED, neventData);
+    }
+    else
+        gizmo3D_->SetAxisMode(mode);
 }
 
 

+ 4 - 2
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditor3DEvents.h

@@ -15,12 +15,14 @@ namespace AtomicEditor
 /// Variable timestep scene update.
 EVENT(E_GIZMOEDITMODECHANGED, GizmoEditModeChanged)
 {
-    PARAM(P_MODE, MODE);            // int
+    PARAM(P_MODE, Mode);            // int
 }
 
 EVENT(E_GIZMOAXISMODECHANGED, GizmoAxisModeChanged)
 {
-    PARAM(P_MODE, MODE);            // int
+    PARAM(P_MODE, Mode);            // int
+    PARAM(P_TOGGLE, Toggle);            // bool
+
 }
 
 EVENT(E_GIZMOMOVED, GizmoMoved)