Просмотр исходного кода

Bugfix: Fix scale handles not transforming rotated objects properly

BearishSun 6 лет назад
Родитель
Сommit
d76d1ec283

+ 11 - 16
Source/EditorManaged/Windows/Scene/Handles/DefaultHandleManager.cs

@@ -180,26 +180,21 @@ namespace bs.Editor
                         {
                             ScaleHandle scaleHandle = (ScaleHandle) activeHandle;
 
-                            // Make sure we transform relative to the handle position
-                            SceneObject temporarySO = new SceneObject("Temp");
-                            temporarySO.Position = activeHandle.Position;
-
-                            SceneObject[] originalParents = new SceneObject[activeSelection.Length];
+                            Vector3 origin = activeHandle.Position;
                             for (int i = 0; i < activeSelection.Length; i++)
                             {
-                                originalParents[i] = activeSelection[i].so.Parent;
-                                activeSelection[i].so.LocalPosition = activeSelection[i].initialPosition;
-                                activeSelection[i].so.LocalRotation = activeSelection[i].initialRotation;
-                                activeSelection[i].so.LocalScale = activeSelection[i].initialScale;
-                                activeSelection[i].so.Parent = temporarySO;
-                            }
+                                Vector3 posDiff = activeSelection[i].initialPosition - origin;
+                                Vector3 scale = activeSelection[i].initialScale;
+                                Vector3 newScale = scale + scaleHandle.Delta;
 
-                            temporarySO.LocalScale += scaleHandle.Delta;
+                                Vector3 pctScale = new Vector3(
+                                    newScale.x / scale.x,
+                                    newScale.y / scale.y,
+                                    newScale.z / scale.z);
 
-                            for (int i = 0; i < activeSelection.Length; i++)
-                                activeSelection[i].so.Parent = originalParents[i];
-
-                            temporarySO.Destroy();
+                                activeSelection[i].so.LocalScale = newScale;
+                                activeSelection[i].so.Position = origin + posDiff * pctScale;
+                            }
                         }
                             break;
                     }

+ 4 - 3
Source/EditorManaged/Windows/Scene/Handles/ScaleHandle.cs

@@ -76,9 +76,9 @@ namespace bs.Editor
         {
             delta = Vector3.Zero;
 
-            delta += xAxis.Delta * GetXDir() * 0.1f;
-            delta += yAxis.Delta * GetYDir() * 0.1f;
-            delta += zAxis.Delta * GetZDir() * 0.1f;
+            delta += xAxis.Delta * Vector3.XAxis * 0.1f;
+            delta += yAxis.Delta * Vector3.YAxis * 0.1f;
+            delta += zAxis.Delta * Vector3.ZAxis * 0.1f;
             delta += (freeAxis.Delta.x + freeAxis.Delta.y) * Vector3.One * 0.1f;
         }
 
@@ -153,6 +153,7 @@ namespace bs.Editor
             topRight = cameraRot.Rotate(topRight + offset);
             bottomRight = cameraRot.Rotate(bottomRight + offset);
 
+            HandleDrawing.Transform = Matrix4.TRS(Position, Quaternion.Identity, Vector3.One);
             HandleDrawing.DrawLine(bottomLeft, bottomRight, handleSize);
             HandleDrawing.DrawLine(bottomLeft, topLeft, handleSize);
             HandleDrawing.DrawLine(topLeft, topRight, handleSize);