From 4efd411045439dbc92ee39c6be43de0a5d039a70 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 19 Mar 2021 12:15:13 +0100 Subject: [PATCH] Add improvements for objects spawning in editor viewport #367 --- .../Viewport/MainEditorGizmoViewport.cs | 28 +++++++++---------- .../Windows/WindowsWindow.DragDrop.cpp | 6 ++++ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Source/Editor/Viewport/MainEditorGizmoViewport.cs b/Source/Editor/Viewport/MainEditorGizmoViewport.cs index a0f2eb044..df94759d1 100644 --- a/Source/Editor/Viewport/MainEditorGizmoViewport.cs +++ b/Source/Editor/Viewport/MainEditorGizmoViewport.cs @@ -860,6 +860,13 @@ namespace FlaxEditor.Viewport return location; } + private void Spawn(Actor actor, ref Vector3 hitLocation) + { + actor.Position = PostProcessSpawnedActorLocation(actor, ref hitLocation); + Editor.Instance.SceneEditing.Spawn(actor); + Focus(); + } + private void Spawn(AssetItem item, SceneGraphNode hit, ref Vector2 location, ref Vector3 hitLocation) { if (item is AssetItem assetItem) @@ -872,8 +879,7 @@ namespace FlaxEditor.Viewport Name = item.ShortName, ParticleSystem = asset }; - actor.Position = PostProcessSpawnedActorLocation(actor, ref hitLocation); - Editor.Instance.SceneEditing.Spawn(actor); + Spawn(actor, ref hitLocation); return; } if (assetItem.IsOfType()) @@ -884,8 +890,7 @@ namespace FlaxEditor.Viewport Name = item.ShortName, Animation = asset }; - actor.Position = PostProcessSpawnedActorLocation(actor, ref hitLocation); - Editor.Instance.SceneEditing.Spawn(actor); + Spawn(actor, ref hitLocation); return; } if (assetItem.IsOfType()) @@ -921,8 +926,7 @@ namespace FlaxEditor.Viewport Name = item.ShortName, SkinnedModel = model }; - actor.Position = PostProcessSpawnedActorLocation(actor, ref hitLocation); - Editor.Instance.SceneEditing.Spawn(actor); + Spawn(actor, ref hitLocation); return; } if (assetItem.IsOfType()) @@ -933,8 +937,7 @@ namespace FlaxEditor.Viewport Name = item.ShortName, Model = model }; - actor.Position = PostProcessSpawnedActorLocation(actor, ref hitLocation); - Editor.Instance.SceneEditing.Spawn(actor); + Spawn(actor, ref hitLocation); return; } if (assetItem.IsOfType()) @@ -945,8 +948,7 @@ namespace FlaxEditor.Viewport Name = item.ShortName, Clip = clip }; - actor.Position = PostProcessSpawnedActorLocation(actor, ref hitLocation); - Editor.Instance.SceneEditing.Spawn(actor); + Spawn(actor, ref hitLocation); return; } if (assetItem.IsOfType()) @@ -954,8 +956,7 @@ namespace FlaxEditor.Viewport var prefab = FlaxEngine.Content.LoadAsync(item.ID); var actor = PrefabManager.SpawnPrefab(prefab, null); actor.Name = item.ShortName; - actor.Position = PostProcessSpawnedActorLocation(actor, ref hitLocation); - Editor.Instance.SceneEditing.Spawn(actor); + Spawn(actor, ref hitLocation); return; } if (assetItem.IsOfType()) @@ -967,8 +968,7 @@ namespace FlaxEditor.Viewport { var actor = (Actor)visualScriptItem.ScriptType.CreateInstance(); actor.Name = item.ShortName; - actor.Position = PostProcessSpawnedActorLocation(actor, ref hitLocation); - Editor.Instance.SceneEditing.Spawn(actor); + Spawn(actor, ref hitLocation); return; } } diff --git a/Source/Engine/Platform/Windows/WindowsWindow.DragDrop.cpp b/Source/Engine/Platform/Windows/WindowsWindow.DragDrop.cpp index 1bec8868a..a6dc90a1f 100644 --- a/Source/Engine/Platform/Windows/WindowsWindow.DragDrop.cpp +++ b/Source/Engine/Platform/Windows/WindowsWindow.DragDrop.cpp @@ -10,6 +10,8 @@ #include "Engine/Core/Collections/Array.h" #include "Engine/Engine/Engine.h" #include "Engine/Platform/IGuiData.h" +#include "Engine/Input/Input.h" +#include "Engine/Input/Mouse.h" #include "Engine/Threading/ThreadPoolTask.h" #include "Engine/Threading/ThreadPool.h" #include "Engine/Scripting/Scripting.h" @@ -630,6 +632,10 @@ DragDropEffect WindowsWindow::DoDragDrop(const StringView& data) dropSource->Release(); ReleaseStgMedium(&stgmed); + // Fix hanging mouse state (Windows doesn't send WM_LBUTTONUP when we end the drag and drop) + if (Input::GetMouseButton(MouseButton::Left)) + Input::Mouse->OnMouseUp(Input::Mouse->GetPosition(), MouseButton::Left, this); + return SUCCEEDED(result) ? dropEffectFromOleEnum(dwEffect) : DragDropEffect::None; }