2
0
Эх сурвалжийг харах

Bugfix: Duplicated objects are now duplicated using their world position instead of local position

BearishSun 8 жил өмнө
parent
commit
1fefa8e763

+ 14 - 1
Source/BansheeEditor/GUI/BsGUISceneTreeView.cpp

@@ -491,7 +491,20 @@ namespace bs
 		else
 		else
 			message = L"Duplicated " + toWString((UINT32)duplicateList.size()) + L" elements";
 			message = L"Duplicated " + toWString((UINT32)duplicateList.size()) + L" elements";
 
 
-		CmdCloneSO::execute(duplicateList, message);
+		Vector<Transform> savedTransforms(duplicateList.size());
+		for(UINT32 i = 0; i < (UINT32)duplicateList.size(); i++)
+			savedTransforms[i] = duplicateList[i]->getTransform();
+
+		Vector<HSceneObject> clonedObjects = CmdCloneSO::execute(duplicateList, message);
+
+		for(UINT32 i = 0; i < (UINT32)clonedObjects.size(); i++)
+		{
+			const Transform& tfrm = savedTransforms[i];
+			clonedObjects[i]->setWorldPosition(tfrm.getPosition());
+			clonedObjects[i]->setWorldRotation(tfrm.getRotation());
+			clonedObjects[i]->setWorldScale(tfrm.getScale());
+		}
+
 		onModified();
 		onModified();
 	}
 	}
 
 

+ 38 - 1
Source/MBansheeEditor/Windows/Scene/SceneWindow.cs

@@ -342,7 +342,16 @@ namespace BansheeEditor
                 else
                 else
                     message = "Duplicated " + selectedObjects.Length + " elements";
                     message = "Duplicated " + selectedObjects.Length + " elements";
 
 
-                UndoRedo.CloneSO(selectedObjects, message);
+                Transform[] savedTransforms = new Transform[selectedObjects.Length];
+                for (int i = 0; i < savedTransforms.Length; i++)
+                    savedTransforms[i] = new Transform(selectedObjects[i]);
+
+                SceneObject[] clonedObjects = UndoRedo.CloneSO(selectedObjects, message);
+
+                // Restore world positions
+                for (int i = 0; i < savedTransforms.Length; i++)
+                    savedTransforms[i].Apply(clonedObjects[i]);
+
                 EditorApplication.SetSceneDirty();
                 EditorApplication.SetSceneDirty();
             }
             }
         }
         }
@@ -1015,6 +1024,34 @@ namespace BansheeEditor
             isDraggingSelection = false;
             isDraggingSelection = false;
             return true;
             return true;
         }
         }
+
+        /// <summary>
+        /// Contains information about world transform of a single scene object.
+        /// </summary>
+        struct Transform
+        {
+            public Transform(SceneObject so)
+            {
+                position = so.Position;
+                rotation = so.Rotation;
+                scale = so.Scale;
+            }
+
+            /// <summary>
+            /// Applies the saved transform to the specified scene object. The transform is assumed to be in world space.
+            /// </summary>
+            /// <param name="so">Scene object to apply the transform to.</param>
+            public void Apply(SceneObject so)
+            {
+                so.Position = position;
+                so.Rotation = rotation;
+                so.LocalScale = scale;
+            }
+
+            public Vector3 position;
+            public Quaternion rotation;
+            public Vector3 scale;
+        }
     }
     }
 
 
     /** @} */
     /** @} */