Переглянути джерело

Multi-node movement by Ctrl + arrows.

Lasse Öörni 14 роки тому
батько
коміт
e9f6407de2
1 змінених файлів з 38 додано та 18 видалено
  1. 38 18
      Bin/Data/Scripts/Editor/EditorCamera.as

+ 38 - 18
Bin/Data/Scripts/Editor/EditorCamera.as

@@ -455,7 +455,7 @@ void MoveCamera(float timeStep)
     }
 
     // Move/rotate/scale object
-    if (editNode !is null && ui.focusElement is null && input.keyDown[KEY_LCTRL])
+    if (!selectedNodes.empty && ui.focusElement is null && input.keyDown[KEY_LCTRL])
     {
         bool changed = false;
         Vector3 adjust(0, 0, 0);
@@ -491,9 +491,14 @@ void MoveCamera(float timeStep)
             case OBJ_MOVE:
                 if (!moveSnap)
                 {
-                    if (axisMode == AXIS_LOCAL)
-                        adjust = editNode.rotation * adjust;
-                    editNode.position = editNode.position + adjust * moveStep;
+                    for (uint i = 0; i < selectedNodes.length; ++i)
+                    {
+                        Node@ node = selectedNodes[i];
+                        Vector3 nodeAdjust = adjust;
+                        if (axisMode == AXIS_LOCAL)
+                            nodeAdjust = node.rotation * nodeAdjust;
+                        node.position = node.position + nodeAdjust * moveStep;
+                    }
                     changed = true;
                 }
                 break;
@@ -501,11 +506,15 @@ void MoveCamera(float timeStep)
             case OBJ_ROTATE:
                 if (!rotateSnap)
                 {
-                    Vector3 euler = editNode.rotation.eulerAngles;
-                    euler.x += adjust.z * rotateStep;
-                    euler.y += adjust.x * rotateStep;
-                    euler.z += adjust.y * rotateStep;
-                    editNode.rotation = Quaternion(euler);
+                    for (uint i = 0; i < selectedNodes.length; ++i)
+                    {
+                        Node@ node = selectedNodes[i];
+                        Vector3 euler = node.rotation.eulerAngles;
+                        euler.x += adjust.z * rotateStep;
+                        euler.y += adjust.x * rotateStep;
+                        euler.z += adjust.y * rotateStep;
+                        node.rotation = Quaternion(euler);
+                    }
                     changed = true;
                 }
                 break;
@@ -513,7 +522,11 @@ void MoveCamera(float timeStep)
             case OBJ_SCALE:
                 if (!scaleSnap)
                 {
-                    editNode.scale = editNode.scale + adjust * scaleStep;
+                    for (uint i = 0; i < selectedNodes.length; ++i)
+                    {
+                        Node@ node = selectedNodes[i];
+                        node.scale = node.scale + adjust * scaleStep;
+                    }
                     changed = true;
                 }
                 break;
@@ -527,7 +540,7 @@ void MoveCamera(float timeStep)
 
 void SteppedObjectManipulation(int key)
 {
-    if (editNode is null)
+    if (selectedNodes.empty)
         return;
 
     // Do not react in non-snapped mode, because that is handled in frame update
@@ -565,11 +578,14 @@ void SteppedObjectManipulation(int key)
     switch (moveMode)
     {
     case OBJ_MOVE:
+        for (uint i = 0; i < selectedNodes.length; ++i)
         {
+            Node@ node = selectedNodes[i];
+            Vector3 nodeAdjust = adjust;
             if (axisMode == AXIS_LOCAL)
-                adjust = editNode.rotation * adjust;
+                nodeAdjust = node.rotation * nodeAdjust;
 
-            Vector3 pos = editNode.position;
+            Vector3 pos = node.position;
             if (adjust.x != 0)
             {
                 pos.x += adjust.x * moveStep;
@@ -585,13 +601,15 @@ void SteppedObjectManipulation(int key)
                 pos.z += adjust.z * moveStep;
                 pos.z = Floor(pos.z / moveStep + 0.5) * moveStep;
             }
-            editNode.position = pos;
+            node.position = pos;
         }
         break;
 
     case OBJ_ROTATE:
+        for (uint i = 0; i < selectedNodes.length; ++i)
         {
-            Vector3 rot = editNode.rotation.eulerAngles;
+            Node@ node = selectedNodes[i];
+            Vector3 rot = node.rotation.eulerAngles;
             if (adjust.z != 0)
             {
                 rot.x += adjust.z * rotateStep;
@@ -607,13 +625,15 @@ void SteppedObjectManipulation(int key)
                 rot.z += adjust.y * rotateStep;
                 rot.z = Floor(rot.z / rotateStep + 0.5) * rotateStep;
             }
-            editNode.rotation = Quaternion(rot);
+            node.rotation = Quaternion(rot);
         }
         break;
 
     case OBJ_SCALE:
+        for (uint i = 0; i < selectedNodes.length; ++i)
         {
-            Vector3 scale = editNode.scale;
+            Node@ node = selectedNodes[i];
+            Vector3 scale = node.scale;
             if (adjust.x != 0)
             {
                 scale.x += adjust.x * scaleStep;
@@ -629,7 +649,7 @@ void SteppedObjectManipulation(int key)
                 scale.z += adjust.z * scaleStep;
                 scale.z = Floor(scale.z / scaleStep + 0.5) * scaleStep;
             }
-            editNode.scale = scale;
+            node.scale = scale;
         }
         break;
     }