Преглед на файлове

Fixed invalid calculation for editor window cursor hover
When dragging objects in scene use their center instead of pivot, in order to properly place objects with weird pivot points in front of the camera

BearishSun преди 9 години
родител
ревизия
3e78ef950b
променени са 2 файла, в които са добавени 16 реда и са изтрити 4 реда
  1. 15 1
      Source/MBansheeEditor/Windows/Scene/SceneWindow.cs
  2. 1 3
      Source/SBansheeEditor/Source/BsScriptEditorWindow.cpp

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

@@ -84,6 +84,7 @@ namespace BansheeEditor
         // Drag & drop
         // Drag & drop
         private bool dragActive;
         private bool dragActive;
         private SceneObject draggedSO;
         private SceneObject draggedSO;
+        private Vector3 draggedSOOffset;
 
 
         /// <summary>
         /// <summary>
         /// Returns the scene camera.
         /// Returns the scene camera.
@@ -539,6 +540,11 @@ namespace BansheeEditor
 
 
                                         Renderable renderable = draggedSO.AddComponent<Renderable>();
                                         Renderable renderable = draggedSO.AddComponent<Renderable>();
                                         renderable.Mesh = mesh;
                                         renderable.Mesh = mesh;
+
+                                        if (mesh != null)
+                                            draggedSOOffset = mesh.Bounds.Box.Center;
+                                        else
+                                            draggedSOOffset = Vector3.Zero;
                                     }
                                     }
 
 
                                     break;
                                     break;
@@ -549,6 +555,14 @@ namespace BansheeEditor
                                     {
                                     {
                                         Prefab prefab = ProjectLibrary.Load<Prefab>(draggedPaths[i]);
                                         Prefab prefab = ProjectLibrary.Load<Prefab>(draggedPaths[i]);
                                         draggedSO = UndoRedo.Instantiate(prefab, "Instantiating " + prefab.Name);
                                         draggedSO = UndoRedo.Instantiate(prefab, "Instantiating " + prefab.Name);
+
+                                        if (draggedSO != null)
+                                        {
+                                            AABox draggedObjBounds = EditorUtility.CalculateBounds(draggedSO);
+                                            draggedSOOffset = draggedObjBounds.Center;
+                                        }
+                                        else
+                                            draggedSOOffset = Vector3.Zero;
                                     }
                                     }
 
 
                                     break;
                                     break;
@@ -560,7 +574,7 @@ namespace BansheeEditor
                     if (draggedSO != null)
                     if (draggedSO != null)
                     {
                     {
                         Ray worldRay = camera.ViewportToWorldRay(scenePos);
                         Ray worldRay = camera.ViewportToWorldRay(scenePos);
-                        draggedSO.Position = worldRay*DefaultPlacementDepth;
+                        draggedSO.Position = worldRay*DefaultPlacementDepth - draggedSOOffset;
                     }
                     }
                 }
                 }
 
 

+ 1 - 3
Source/SBansheeEditor/Source/BsScriptEditorWindow.cpp

@@ -207,9 +207,7 @@ namespace BansheeEngine
 			if(Platform::isPointOverWindow(*renderWindow, pointerPos))
 			if(Platform::isPointOverWindow(*renderWindow, pointerPos))
 			{
 			{
 				Rect2I bounds = thisPtr->getEditorWidget()->getBounds();
 				Rect2I bounds = thisPtr->getEditorWidget()->getBounds();
-
-				Vector2I widgetPos(bounds.x, bounds.y);
-				Vector2I screenPos = widget->widgetToScreenPos(widgetPos);
+				Vector2I screenPos = widget->widgetToScreenPos(Vector2I(0, 0));
 
 
 				bounds.x = screenPos.x;
 				bounds.x = screenPos.x;
 				bounds.y = screenPos.y;
 				bounds.y = screenPos.y;