Browse Source

Merge pull request #400 from AtomicGameEngine/JME-ATOMIC-373

W/E/R shortcuts for translate, rotate, scale, world/local gizmo modes, better icons
JoshEngebretson 10 years ago
parent
commit
4b145edc12

BIN
Resources/EditorData/AtomicEditor/editor/skin/3d_rotate.png


BIN
Resources/EditorData/AtomicEditor/editor/skin/3d_scale.png


BIN
Resources/EditorData/AtomicEditor/editor/skin/3d_translate.png


BIN
Resources/EditorData/AtomicEditor/editor/skin/play.png


+ 3 - 3
Resources/EditorData/AtomicEditor/editor/skin/skin.tb.txt

@@ -147,11 +147,11 @@ elements
 		background-color #23241f
 
 	3DScaleBitmap
-		bitmap 3d_scale.png		
+		bitmap 3d_scale.png
 	3DTranslateBitmap
-		bitmap 3d_translate.png		
+		bitmap 3d_translate.png
 	3DRotateBitmap
-		bitmap 3d_rotate.png		
+		bitmap 3d_rotate.png
 
 	DarkGrayText
 		text-color #aaaaaa

+ 12 - 5
Resources/EditorData/AtomicEditor/editor/ui/maintoolbar.tb.txt

@@ -1,18 +1,25 @@
 definitions
 	menubutton		
 		lp: height: 28, width: 28
-		skin TBButton.flat
-TBLayout: distribution: gravity
+		skin TBButton.uniformflat
+TBLayout: distribution: gravity, spacing: 4
 	TBButton 
 		@include definitions>menubutton
 		TBSkinImage: skin: PlayButton
 		id maintoolbar_play
-	TBButton: skin: TBButton.flat
+	TBButton: toggle-mode: 1
+		@include definitions>menubutton
 		TBSkinImage: skin: 3DTranslateBitmap
 		id 3d_translate
-	TBButton: skin: TBButton.flat
+	TBButton: toggle-mode: 1
+		@include definitions>menubutton
 		TBSkinImage: skin: 3DRotateBitmap
 		id 3d_rotate
-	TBButton: skin: TBButton.flat
+	TBButton: toggle-mode: 1
+		@include definitions>menubutton
 		TBSkinImage: skin: 3DScaleBitmap
 		id 3d_scale
+	TBButton: toggle-mode: 1
+		lp: width: 64
+		text: "Local"
+		id 3d_axismode

+ 16 - 0
Resources/EditorData/AtomicEditor/resources/default_skin/skin.tb.txt

@@ -53,6 +53,22 @@ elements
 		bitmap button_flat_pressed.png
 		cut 8
 
+	TBButton.uniformflat
+		text-color #fefefe
+		padding 4 4
+		children
+			element TBButton.uniformflat.hovered
+				state hovered
+			element TBButton.uniformflat.pressed
+				state pressed
+	TBButton.uniformflat.hovered
+		bitmap button_flat_outline.png
+		cut 15
+		expand 6
+	TBButton.uniformflat.pressed
+		bitmap button_flat_pressed.png
+		cut 8		
+
 	TBButton.link
 		text-color #73FDFF
 		padding 6 8

+ 37 - 0
Script/AtomicEditor/ui/MainToolbar.ts

@@ -9,6 +9,9 @@ import EditorUI = require("./EditorUI");
 
 class MainToolbar extends Atomic.UIWidget {
 
+    translateButton: Atomic.UIButton;
+    rotateButton: Atomic.UIButton;
+    scaleButton: Atomic.UIButton;
 
     constructor(parent: Atomic.UIWidget) {
 
@@ -16,11 +19,38 @@ class MainToolbar extends Atomic.UIWidget {
 
         this.load("AtomicEditor/editor/ui/maintoolbar.tb.txt");
 
+        this.translateButton = <Atomic.UIButton>this.getWidget("3d_translate");
+        this.rotateButton = <Atomic.UIButton>this.getWidget("3d_rotate");
+        this.scaleButton = <Atomic.UIButton>this.getWidget("3d_scale");
+
+        this.translateButton.value = 1;
+
         parent.addChild(this);
 
+        this.subscribeToEvent("GizmoEditModeChanged", (ev) => this.handleGizmoEditModeChanged(ev));
         this.subscribeToEvent(this, "WidgetEvent", (data) => this.handleWidgetEvent(data));
     }
 
+    handleGizmoEditModeChanged(ev) {
+
+        this.translateButton.value = 0;
+        this.rotateButton.value = 0;
+        this.scaleButton.value = 0;
+
+        switch (ev.mode) {
+            case 1:
+                this.translateButton.value = 1;
+                break;
+            case 2:
+                this.rotateButton.value = 1;
+                break;
+            case 3:
+                this.scaleButton.value = 1;
+                break;
+        }
+
+    }
+
     handleWidgetEvent(ev: Atomic.UIWidgetEvent) {
 
         if (ev.type == Atomic.UI_EVENT_TYPE_CLICK && ev.target) {
@@ -37,6 +67,13 @@ class MainToolbar extends Atomic.UIWidget {
 
                 return true;
 
+            } 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);
+                return true;
+
             } else if (ev.target.id == "maintoolbar_play") {
 
                 EditorUI.getShortcuts().invokePlay();

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

@@ -16,6 +16,8 @@ class Shortcuts extends Atomic.ScriptObject {
 
         this.subscribeToEvent("UIShortcut", (ev: Atomic.UIShortcutEvent) => this.handleUIShortcut(ev));
 
+        this.subscribeToEvent("KeyDown", (ev: Atomic.KeyDownEvent) => this.handleKeyDown(ev));
+
 
     }
 
@@ -83,18 +85,50 @@ class Shortcuts extends Atomic.ScriptObject {
         this.invokeResourceFrameShortcut("selectall");
     }
 
-    invokeResourceFrameShortcut(shortcut:string) {
+    invokeGizmoEditModeChanged(mode:Editor.EditMode) {
+
+        this.sendEvent("GizmoEditModeChanged", { mode: mode });
+
+    }
+
+    invokeGizmoAxisModeChanged(mode:Editor.AxisMode) {
+
+        this.sendEvent("GizmoAxisModeChanged", { mode: mode });
+
+    }
+
+    invokeResourceFrameShortcut(shortcut: string) {
         if (!ToolCore.toolSystem.project) return;
         var resourceFrame = EditorUI.getMainFrame().resourceframe.currentResourceEditor;
-        if(resourceFrame) {
+        if (resourceFrame) {
             resourceFrame.invokeShortcut(shortcut);
         }
     }
 
+    handleKeyDown(ev: Atomic.KeyDownEvent) {
+
+        // if the right mouse buttons isn't down
+        if (!(ev.buttons & Atomic.MOUSEB_RIGHT)) {
+
+            // TODO: Make these customizable
+
+            if (ev.key == Atomic.KEY_W) {
+                this.invokeGizmoEditModeChanged(Editor.EDIT_MOVE);
+            } else if (ev.key == Atomic.KEY_E) {
+              this.invokeGizmoEditModeChanged(Editor.EDIT_ROTATE);
+            } else if (ev.key == Atomic.KEY_R) {
+                this.invokeGizmoEditModeChanged(Editor.EDIT_SCALE);
+            }
+
+        }
+
+    }
+
     // global shortcut handler
     handleUIShortcut(ev: Atomic.UIShortcutEvent) {
+
         var cmdKey;
-        if(Atomic.platform == "MacOSX") {
+        if (Atomic.platform == "MacOSX") {
             cmdKey = (Atomic.input.getKeyDown(Atomic.KEY_LGUI) || Atomic.input.getKeyDown(Atomic.KEY_RGUI));
         } else {
             cmdKey = (Atomic.input.getKeyDown(Atomic.KEY_LCTRL) || Atomic.input.getKeyDown(Atomic.KEY_RCTRL));
@@ -113,7 +147,7 @@ class Shortcuts extends Atomic.ScriptObject {
             }
             else if (ev.key == Atomic.KEY_P) {
                 this.invokePlay();
-            //if shift is pressed
+                //if shift is pressed
             } else if (ev.qualifiers & Atomic.QUAL_SHIFT) {
                 if (ev.key == Atomic.KEY_B) {
                     EditorUI.getModelOps().showBuildSettings();

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

@@ -44,6 +44,28 @@ declare module Atomic {
 
     }
 
+    export interface KeyDownEvent {
+
+        // keycode
+        key: number;
+        //  Atomic.QUAL_SHIFT, Atomic.QUAL_CTRL, Atomic.QUAL_ALT, Atomic.QUAL_ANY
+        qualifiers: number;
+
+        // mouse buttons down
+        buttons:number;
+
+    }
+
+    export interface KeyUpEvent {
+
+        // keycode
+        key: number;
+        //  Atomic.QUAL_SHIFT, Atomic.QUAL_CTRL, Atomic.QUAL_ALT, Atomic.QUAL_ANY
+        qualifiers: number;
+        // mouse buttons down
+        buttons:number;
+
+    }
 
     export interface UIShortcutEvent {
 
@@ -220,6 +242,18 @@ declare module AtomicNET {
 
 }
 
+declare module Editor {
+
+  export interface GizmoEditModeChangedEvent {
+    mode:EditMode;
+  }
+
+  export interface GizmoAxisModeChangedEvent {
+    mode:AxisMode;
+  }
+  
+}
+
 declare module ToolCore {
 
     export interface ResourceAddedEvent {

+ 5 - 0
Source/AtomicEditor/Editors/SceneEditor3D/Gizmo3D.cpp

@@ -416,6 +416,11 @@ void Gizmo3D::Drag()
 
 }
 
+void Gizmo3D::SetAxisMode(AxisMode mode)
+{
+    axisMode_ = mode;
+}
+
 void Gizmo3D::SetEditMode(EditMode mode)
 {
     editMode_ = mode;

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

@@ -109,7 +109,8 @@ public:
 
     void SetView(SceneView3D* view3D);
 
-    void SetEditMode(EditMode);
+    void SetAxisMode(AxisMode mode);
+    void SetEditMode(EditMode mode);
 
     bool Selected()
     {

+ 8 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditor3D.cpp

@@ -85,6 +85,7 @@ SceneEditor3D ::SceneEditor3D(Context* context, const String &fullpath, UITabCon
     SubscribeToEvent(E_EDITORACTIVENODECHANGE, HANDLER(SceneEditor3D, HandleEditorActiveNodeChange));
 
     SubscribeToEvent(E_GIZMOEDITMODECHANGED, HANDLER(SceneEditor3D, HandleGizmoEditModeChanged));
+    SubscribeToEvent(E_GIZMOAXISMODECHANGED, HANDLER(SceneEditor3D, HandleGizmoAxisModeChanged));
 
     // FIXME: Set the size at the end of setup, so all children are updated accordingly
     // future size changes will be handled automatically
@@ -223,6 +224,13 @@ void SceneEditor3D::HandleGizmoEditModeChanged(StringHash eventType, VariantMap&
     gizmo3D_->SetEditMode(mode);
 }
 
+void SceneEditor3D::HandleGizmoAxisModeChanged(StringHash eventType, VariantMap& eventData)
+{
+    AxisMode mode = (AxisMode) ((int)eventData[GizmoEditModeChanged::P_MODE].GetFloat());
+    gizmo3D_->SetAxisMode(mode);
+}
+
+
 void SceneEditor3D::Close(bool navigateToAvailableResource)
 {
 

+ 1 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditor3D.h

@@ -61,6 +61,7 @@ private:
     void HandlePlayStarted(StringHash eventType, VariantMap& eventData);
     void HandlePlayStopped(StringHash eventType, VariantMap& eventData);
     void HandleGizmoEditModeChanged(StringHash eventType, VariantMap& eventData);
+    void HandleGizmoAxisModeChanged(StringHash eventType, VariantMap& eventData);
     void HandleNodeRemoved(StringHash eventType, VariantMap& eventData);
 
     SharedPtr<Scene> scene_;

+ 5 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditor3DEvents.h

@@ -18,6 +18,11 @@ EVENT(E_GIZMOEDITMODECHANGED, GizmoEditModeChanged)
     PARAM(P_MODE, MODE);            // int
 }
 
+EVENT(E_GIZMOAXISMODECHANGED, GizmoAxisModeChanged)
+{
+    PARAM(P_MODE, MODE);            // int
+}
+
 EVENT(E_GIZMOMOVED, GizmoMoved)
 {
 

+ 1 - 16
Source/AtomicEditor/Editors/SceneEditor3D/SceneView3D.cpp

@@ -161,33 +161,18 @@ void SceneView3D::MoveCamera(float timeStep)
         yaw_ += MOUSE_SENSITIVITY * mouseMove.x_;
         pitch_ += MOUSE_SENSITIVITY * mouseMove.y_;
         pitch_ = Clamp(pitch_, -90.0f, 90.0f);
-        // Not working on OSX
-        //input->SetMouseMode(MM_RELATIVE);
     }
-    else
-    {
-        // Not working on OSX
-        /*
-        if (input->GetMouseMode() != MM_ABSOLUTE)
-            input->SetMouseMode(MM_ABSOLUTE);
-        */
-    }
-
 
     // Construct new orientation for the camera scene node from yaw and pitch. Roll is fixed to zero
     cameraNode_->SetRotation(Quaternion(pitch_, yaw_, 0.0f));
 
-    //Vector3 pos = cameraNode_->GetWorldPosition();
-    //Quaternion q = cameraNode_->GetWorldRotation();
-    //LOGINFOF("%f %f %f : %f %f %f %f", pos.x_, pos.y_, pos.z_, q.x_, q.y_, q.z_, q.w_ );
-
 #ifdef ATOMIC_PLATFORM_WINDOWS
     bool superdown = input->GetKeyDown(KEY_LCTRL) || input->GetKeyDown(KEY_RCTRL);
 #else
     bool superdown = input->GetKeyDown(KEY_LGUI) || input->GetKeyDown(KEY_RGUI);
 #endif
 
-    if (!superdown) {
+    if (!superdown && input->GetMouseButtonDown(MOUSEB_RIGHT)) {
 
         // Read WASD keys and move the camera scene node to the corresponding direction if they are pressed
         // Use the Translate() function (default local space) to move relative to the node's orientation.