Browse Source

Restore previous camera yaw + pitch control, but add a toggle in settings dialog to control whether the pitch is clamped between -90 and 90 degrees.

Lasse Öörni 12 years ago
parent
commit
c7e72b02da

+ 2 - 0
Bin/Data/Scripts/Editor.as

@@ -120,6 +120,7 @@ void LoadConfig()
         if (cameraElem.HasAttribute("farclip")) camera.farClip = cameraElem.GetFloat("farclip");
         if (cameraElem.HasAttribute("farclip")) camera.farClip = cameraElem.GetFloat("farclip");
         if (cameraElem.HasAttribute("fov")) camera.fov = cameraElem.GetFloat("fov");
         if (cameraElem.HasAttribute("fov")) camera.fov = cameraElem.GetFloat("fov");
         if (cameraElem.HasAttribute("speed")) cameraBaseSpeed = cameraElem.GetFloat("speed");
         if (cameraElem.HasAttribute("speed")) cameraBaseSpeed = cameraElem.GetFloat("speed");
+        if (cameraElem.HasAttribute("limitrotation")) limitRotation = cameraElem.GetBool("limitrotation");
     }
     }
 
 
     if (!objectElem.isNull)
     if (!objectElem.isNull)
@@ -225,6 +226,7 @@ void SaveConfig()
         cameraElem.SetFloat("farclip", camera.farClip);
         cameraElem.SetFloat("farclip", camera.farClip);
         cameraElem.SetFloat("fov", camera.fov);
         cameraElem.SetFloat("fov", camera.fov);
         cameraElem.SetFloat("speed", cameraBaseSpeed);
         cameraElem.SetFloat("speed", cameraBaseSpeed);
+        cameraElem.SetBool("limitrotation", limitRotation);
     }
     }
 
 
     objectElem.SetFloat("newnodedistance", newNodeDistance);
     objectElem.SetFloat("newnodedistance", newNodeDistance);

+ 10 - 0
Bin/Data/Scripts/Editor/EditorSettings.as

@@ -34,6 +34,9 @@ void UpdateEditorSettingsDialog()
     LineEdit@ speedEdit = settingsDialog.GetChild("SpeedEdit", true);
     LineEdit@ speedEdit = settingsDialog.GetChild("SpeedEdit", true);
     speedEdit.text = String(cameraBaseSpeed);
     speedEdit.text = String(cameraBaseSpeed);
 
 
+    CheckBox@ limitRotationToggle = settingsDialog.GetChild("LimitRotationToggle", true);
+    limitRotationToggle.checked = limitRotation;
+
     LineEdit@ distanceEdit = settingsDialog.GetChild("DistanceEdit", true);
     LineEdit@ distanceEdit = settingsDialog.GetChild("DistanceEdit", true);
     distanceEdit.text = String(newNodeDistance);
     distanceEdit.text = String(newNodeDistance);
 
 
@@ -98,6 +101,7 @@ void UpdateEditorSettingsDialog()
         SubscribeToEvent(fovEdit, "TextFinished", "EditCameraFOV");
         SubscribeToEvent(fovEdit, "TextFinished", "EditCameraFOV");
         SubscribeToEvent(speedEdit, "TextChanged", "EditCameraSpeed");
         SubscribeToEvent(speedEdit, "TextChanged", "EditCameraSpeed");
         SubscribeToEvent(speedEdit, "TextFinished", "EditCameraSpeed");
         SubscribeToEvent(speedEdit, "TextFinished", "EditCameraSpeed");
+        SubscribeToEvent(limitRotationToggle, "Toggled", "EditLimitRotation");
         SubscribeToEvent(distanceEdit, "TextChanged", "EditNewNodeDistance");
         SubscribeToEvent(distanceEdit, "TextChanged", "EditNewNodeDistance");
         SubscribeToEvent(distanceEdit, "TextFinished", "EditNewNodeDistance");
         SubscribeToEvent(distanceEdit, "TextFinished", "EditNewNodeDistance");
         SubscribeToEvent(moveStepEdit, "TextChanged", "EditMoveStep");
         SubscribeToEvent(moveStepEdit, "TextChanged", "EditMoveStep");
@@ -173,6 +177,12 @@ void EditCameraSpeed(StringHash eventType, VariantMap& eventData)
         edit.text = String(cameraBaseSpeed);
         edit.text = String(cameraBaseSpeed);
 }
 }
 
 
+void EditLimitRotation(StringHash eventType, VariantMap& eventData)
+{
+    CheckBox@ edit = eventData["Element"].GetUIElement();
+    limitRotation = edit.checked;
+}
+
 void EditNewNodeDistance(StringHash eventType, VariantMap& eventData)
 void EditNewNodeDistance(StringHash eventType, VariantMap& eventData)
 {
 {
     LineEdit@ edit = eventData["Element"].GetUIElement();
     LineEdit@ edit = eventData["Element"].GetUIElement();

+ 3 - 0
Bin/Data/Scripts/Editor/EditorUI.as

@@ -1093,6 +1093,7 @@ void HandleKeyDown(StringHash eventType, VariantMap& eventData)
         pos.y = 0;
         pos.y = 0;
         cameraNode.position = pos;
         cameraNode.position = pos;
         cameraNode.direction = Vector3(0, 0, viewDirection);
         cameraNode.direction = Vector3(0, 0, viewDirection);
+        ReacquireCameraYawPitch();
     }
     }
 
 
     else if (key == KEY_NUMPAD3) // Side view
     else if (key == KEY_NUMPAD3) // Side view
@@ -1103,6 +1104,7 @@ void HandleKeyDown(StringHash eventType, VariantMap& eventData)
         pos.z = 0;
         pos.z = 0;
         cameraNode.position = pos;
         cameraNode.position = pos;
         cameraNode.direction = Vector3(-viewDirection, 0, 0);
         cameraNode.direction = Vector3(-viewDirection, 0, 0);
+        ReacquireCameraYawPitch();
     }
     }
 
 
     else if (key == KEY_NUMPAD7) // Top view
     else if (key == KEY_NUMPAD7) // Top view
@@ -1113,6 +1115,7 @@ void HandleKeyDown(StringHash eventType, VariantMap& eventData)
         pos.z = 0;
         pos.z = 0;
         cameraNode.position = pos;
         cameraNode.position = pos;
         cameraNode.direction = Vector3(0, -viewDirection, 0);
         cameraNode.direction = Vector3(0, -viewDirection, 0);
+        ReacquireCameraYawPitch();
     }
     }
 
 
     else if (eventData["Qualifiers"].GetInt() == QUAL_CTRL)
     else if (eventData["Qualifiers"].GetInt() == QUAL_CTRL)

+ 17 - 3
Bin/Data/Scripts/Editor/EditorView.as

@@ -39,11 +39,14 @@ SnapScaleMode snapScaleMode = SNAP_SCALE_FULL;
 float cameraBaseSpeed = 10;
 float cameraBaseSpeed = 10;
 float cameraBaseRotationSpeed = 0.2;
 float cameraBaseRotationSpeed = 0.2;
 float cameraShiftSpeedMultiplier = 5;
 float cameraShiftSpeedMultiplier = 5;
+float cameraYaw = 0;
+float cameraPitch = 0;
 float newNodeDistance = 20;
 float newNodeDistance = 20;
 float moveStep = 0.5;
 float moveStep = 0.5;
 float rotateStep = 5;
 float rotateStep = 5;
 float scaleStep = 0.1;
 float scaleStep = 0.1;
 float snapScale = 1.0;
 float snapScale = 1.0;
+bool limitRotation = false;
 bool moveSnap = false;
 bool moveSnap = false;
 bool rotateSnap = false;
 bool rotateSnap = false;
 bool scaleSnap = false;
 bool scaleSnap = false;
@@ -114,6 +117,13 @@ void ResetCamera()
     cameraNode.position = Vector3(0, 5, -10);
     cameraNode.position = Vector3(0, 5, -10);
     // Look at the origin so user can see the scene.
     // Look at the origin so user can see the scene.
     cameraNode.rotation = Quaternion(Vector3(0, 0, 1), -cameraNode.position);
     cameraNode.rotation = Quaternion(Vector3(0, 0, 1), -cameraNode.position);
+    ReacquireCameraYawPitch();
+}
+
+void ReacquireCameraYawPitch()
+{
+    cameraYaw = cameraNode.rotation.yaw;
+    cameraPitch = cameraNode.rotation.pitch;
 }
 }
 
 
 void CreateGrid()
 void CreateGrid()
@@ -327,9 +337,13 @@ void UpdateView(float timeStep)
         IntVector2 mouseMove = input.mouseMove;
         IntVector2 mouseMove = input.mouseMove;
         if (mouseMove.x != 0 || mouseMove.y != 0)
         if (mouseMove.x != 0 || mouseMove.y != 0)
         {
         {
-            float cameraYaw = mouseMove.x * cameraBaseRotationSpeed;
-            float cameraPitch = mouseMove.y * cameraBaseRotationSpeed;
-            cameraNode.rotation = cameraNode.rotation * Quaternion(cameraPitch, cameraYaw, 0);
+            cameraYaw += mouseMove.x * cameraBaseRotationSpeed;
+            cameraPitch += mouseMove.y * cameraBaseRotationSpeed;
+
+            if (limitRotation)
+                cameraPitch = Clamp(cameraPitch, -90.0, 90.0);
+
+            cameraNode.rotation = Quaternion(cameraPitch, cameraYaw, 0);
             FadeUI();
             FadeUI();
         }
         }
     }
     }

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

@@ -68,6 +68,15 @@
                         <attribute name="Max Size" value="100 2147483647" />
                         <attribute name="Max Size" value="100 2147483647" />
                     </element>
                     </element>
                 </element>
                 </element>
+                <element style="ListRow">
+                    <attribute name="Layout Spacing" value="8" />
+                    <element type="CheckBox">
+                        <attribute name="Name" value="LimitRotationToggle" />
+                    </element>
+                    <element type="Text">
+                        <attribute name="Text" value="Limit camera pitch" />
+                    </element>
+                </element>
                 <element type="BorderImage" style="EditorDivider" />
                 <element type="BorderImage" style="EditorDivider" />
                 <element style="ListRow">
                 <element style="ListRow">
                     <attribute name="Layout Spacing" value="20" />
                     <attribute name="Layout Spacing" value="20" />

+ 1 - 0
Docs/Urho3D.dox

@@ -57,6 +57,7 @@ Urho3D development, contributions and bugfixes by:
 - Colin Barrett
 - Colin Barrett
 - Erik Beran
 - Erik Beran
 - Carlo Carollo
 - Carlo Carollo
+- Pete Chown
 - Sebastian Delatorre (primitivewaste)
 - Sebastian Delatorre (primitivewaste)
 - Chris Friesen
 - Chris Friesen
 - Alex Fuller
 - Alex Fuller

+ 1 - 0
Readme.txt

@@ -16,6 +16,7 @@ Urho3D development, contributions and bugfixes by:
 - Colin Barrett
 - Colin Barrett
 - Erik Beran
 - Erik Beran
 - Carlo Carollo
 - Carlo Carollo
+- Pete Chown
 - Sebastian Delatorre (primitivewaste)
 - Sebastian Delatorre (primitivewaste)
 - Chris Friesen
 - Chris Friesen
 - Alex Fuller
 - Alex Fuller