Explorar el Código

Add 'Rotate Around Selection' to simulate the legacy way of camera orbit

SuperWangKai hace 8 años
padre
commit
fcc1071f64

+ 3 - 0
bin/Data/Scripts/Editor.as

@@ -208,6 +208,8 @@ void LoadConfig()
         if (cameraElem.HasAttribute("viewportmode")) viewportMode = cameraElem.GetUInt("viewportmode");
         if (cameraElem.HasAttribute("viewportmode")) viewportMode = cameraElem.GetUInt("viewportmode");
         if (cameraElem.HasAttribute("mouseorbitmode")) mouseOrbitMode = cameraElem.GetInt("mouseorbitmode");
         if (cameraElem.HasAttribute("mouseorbitmode")) mouseOrbitMode = cameraElem.GetInt("mouseorbitmode");
         if (cameraElem.HasAttribute("mmbpan")) mmbPanMode = cameraElem.GetBool("mmbpan");
         if (cameraElem.HasAttribute("mmbpan")) mmbPanMode = cameraElem.GetBool("mmbpan");
+        if (cameraElem.HasAttribute("mmbpan")) rotateAroundSelect = cameraElem.GetBool("rotatearoundselect");
+        
         UpdateViewParameters();
         UpdateViewParameters();
     }
     }
 
 
@@ -360,6 +362,7 @@ void SaveConfig()
     cameraElem.SetUInt("viewportmode", viewportMode);
     cameraElem.SetUInt("viewportmode", viewportMode);
     cameraElem.SetInt("mouseorbitmode", mouseOrbitMode);
     cameraElem.SetInt("mouseorbitmode", mouseOrbitMode);
     cameraElem.SetBool("mmbpan", mmbPanMode);
     cameraElem.SetBool("mmbpan", mmbPanMode);
+    cameraElem.SetBool("rotatearoundselect", rotateAroundSelect);
 
 
     objectElem.SetBool("cameraflymode", cameraFlyMode);
     objectElem.SetBool("cameraflymode", cameraFlyMode);
     objectElem.SetInt("hotkeymode", hotKeyMode);
     objectElem.SetInt("hotkeymode", hotKeyMode);

+ 9 - 0
bin/Data/Scripts/Editor/EditorSettings.as

@@ -44,6 +44,9 @@ void UpdateEditorSettingsDialog()
     CheckBox@ middleMousePanToggle = settingsDialog.GetChild("MiddleMousePanToggle", true);
     CheckBox@ middleMousePanToggle = settingsDialog.GetChild("MiddleMousePanToggle", true);
     middleMousePanToggle.checked = mmbPanMode;
     middleMousePanToggle.checked = mmbPanMode;
 
 
+    CheckBox@ rotateAroundSelectToggle = settingsDialog.GetChild("RotateAroundSelectionToggle", true);
+    rotateAroundSelectToggle.checked = rotateAroundSelect;
+
     DropDownList@ hotKeysModeEdit = settingsDialog.GetChild("HotKeysModeEdit", true);
     DropDownList@ hotKeysModeEdit = settingsDialog.GetChild("HotKeysModeEdit", true);
     hotKeysModeEdit.selection = hotKeyMode;
     hotKeysModeEdit.selection = hotKeyMode;
 
 
@@ -135,6 +138,7 @@ void UpdateEditorSettingsDialog()
         SubscribeToEvent(speedEdit, "TextFinished", "EditCameraSpeed");
         SubscribeToEvent(speedEdit, "TextFinished", "EditCameraSpeed");
         SubscribeToEvent(limitRotationToggle, "Toggled", "EditLimitRotation");
         SubscribeToEvent(limitRotationToggle, "Toggled", "EditLimitRotation");
         SubscribeToEvent(middleMousePanToggle, "Toggled", "EditMiddleMousePan");
         SubscribeToEvent(middleMousePanToggle, "Toggled", "EditMiddleMousePan");
+        SubscribeToEvent(rotateAroundSelectToggle, "Toggled", "EditRotateAroundSelect");
         SubscribeToEvent(mouseOrbitEdit, "ItemSelected", "EditMouseOrbitMode");
         SubscribeToEvent(mouseOrbitEdit, "ItemSelected", "EditMouseOrbitMode");
         SubscribeToEvent(hotKeysModeEdit, "ItemSelected", "EditHotKeyMode");
         SubscribeToEvent(hotKeysModeEdit, "ItemSelected", "EditHotKeyMode");
         SubscribeToEvent(newNodeModeEdit, "ItemSelected", "EditNewNodeMode");
         SubscribeToEvent(newNodeModeEdit, "ItemSelected", "EditNewNodeMode");
@@ -253,6 +257,11 @@ void EditMiddleMousePan(StringHash eventType, VariantMap& eventData)
     mmbPanMode = cast<CheckBox>(eventData["Element"].GetPtr()).checked;
     mmbPanMode = cast<CheckBox>(eventData["Element"].GetPtr()).checked;
 }
 }
 
 
+void EditRotateAroundSelect(StringHash eventType, VariantMap& eventData)
+{
+    rotateAroundSelect = cast<CheckBox>(eventData["Element"].GetPtr()).checked;
+}
+
 void EditHotKeyMode(StringHash eventType, VariantMap& eventData)
 void EditHotKeyMode(StringHash eventType, VariantMap& eventData)
 {
 {
     DropDownList@ edit = eventData["Element"].GetPtr();
     DropDownList@ edit = eventData["Element"].GetPtr();

+ 33 - 2
bin/Data/Scripts/Editor/EditorView.as

@@ -415,6 +415,7 @@ enum MouseOrbitMode
 bool toggledMouseLock = false;
 bool toggledMouseLock = false;
 int mouseOrbitMode = ORBIT_RELATIVE;
 int mouseOrbitMode = ORBIT_RELATIVE;
 bool mmbPanMode = false;
 bool mmbPanMode = false;
+bool rotateAroundSelect = false;
 
 
 enum NewNodeMode
 enum NewNodeMode
 {
 {
@@ -1572,6 +1573,29 @@ void CameraRotateAroundCenter(Quaternion rot)
     cameraNode.worldPosition = oldPos;
     cameraNode.worldPosition = oldPos;
 }
 }
 
 
+void CameraRotateAroundSelect(Quaternion rot)
+{
+    cameraSmoothInterpolate.Stop();
+    
+    cameraNode.rotation = rot;
+
+    Vector3 dir = cameraNode.direction;
+    dir.Normalize();
+
+    float dist = cameraNode.position.length;
+
+    cameraNode.position = -dir * dist;
+
+    Vector3 centerPoint;
+    if ((selectedNodes.length > 0 || selectedComponents.length > 0))
+        centerPoint = SelectedNodesCenterPoint();
+    else
+        centerPoint = lastSelectedNodesCenterPoint;
+
+    // legacy way, camera look-at will jump to the selection
+    cameraLookAtNode.worldPosition = centerPoint;
+}
+
 void CameraZoom(float zoom)
 void CameraZoom(float zoom)
 {
 {
     cameraSmoothInterpolate.Stop();
     cameraSmoothInterpolate.Stop();
@@ -1711,7 +1735,10 @@ void HandleStandardUserInput(float timeStep)
                 
                 
                 if (input.mouseButtonDown[MOUSEB_MIDDLE]) // Rotate around the camera center
                 if (input.mouseButtonDown[MOUSEB_MIDDLE]) // Rotate around the camera center
                 {
                 {
-                    CameraRotateAroundLookAt(rot);
+                    if (rotateAroundSelect)
+                        CameraRotateAroundSelect(rot);
+                    else
+                        CameraRotateAroundLookAt(rot);
                     
                     
                     orbiting = true;
                     orbiting = true;
                 }
                 }
@@ -1910,7 +1937,11 @@ void HandleBlenderUserInput(float timeStep)
                 }
                 }
                 else if (input.mouseButtonDown[MOUSEB_MIDDLE])
                 else if (input.mouseButtonDown[MOUSEB_MIDDLE])
                 {
                 {
-                    CameraRotateAroundLookAt(rot);
+                    if (rotateAroundSelect)
+                        CameraRotateAroundSelect(rot);
+                    else
+                        CameraRotateAroundLookAt(rot);
+                    
                     orbiting = true;
                     orbiting = true;
                 }
                 }
             }
             }

+ 9 - 0
bin/Data/UI/EditorSettingsDialog.xml

@@ -87,6 +87,15 @@
                         <attribute name="Text" value="Pan using middle mouse button" />
                         <attribute name="Text" value="Pan using middle mouse button" />
                     </element>
                     </element>
                 </element>
                 </element>
+                <element style="ListRow">
+                    <attribute name="Layout Spacing" value="8" />
+                    <element type="CheckBox">
+                        <attribute name="Name" value="RotateAroundSelectionToggle" />
+                    </element>
+                    <element type="Text">
+                        <attribute name="Text" value="Rotate Around Selection" />
+                    </element>
+                </element>
                 <element style="ListRow">
                 <element style="ListRow">
                     <attribute name="Layout Spacing" value="8" />
                     <attribute name="Layout Spacing" value="8" />
                     <element type="Text">
                     <element type="Text">