From e41dfe738b585199a3eef7a22f2018ae9b8140d3 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 28 May 2021 14:24:19 +0200 Subject: [PATCH] Add support for moving object with transform gizmo when mouse moves outside the viewport during usage --- Source/Editor/Gizmo/GizmoBase.cs | 5 +++++ Source/Editor/Gizmo/TransformGizmoBase.cs | 20 +++++++++++++++++-- .../Editor/Tools/Foliage/PaintFoliageGizmo.cs | 3 +++ .../Editor/Tools/Terrain/PaintTerrainGizmo.cs | 3 +++ .../Tools/Terrain/SculptTerrainGizmo.cs | 3 +++ Source/Editor/Tools/VertexPainting.cs | 3 +++ Source/Editor/Viewport/EditorGizmoViewport.cs | 3 +++ Source/Editor/Viewport/EditorViewport.cs | 18 +++++++++++++++-- .../Editor/Viewport/PrefabWindowViewport.cs | 3 +++ 9 files changed, 57 insertions(+), 4 deletions(-) diff --git a/Source/Editor/Gizmo/GizmoBase.cs b/Source/Editor/Gizmo/GizmoBase.cs index 6159c7673..1d8ccd233 100644 --- a/Source/Editor/Gizmo/GizmoBase.cs +++ b/Source/Editor/Gizmo/GizmoBase.cs @@ -22,6 +22,11 @@ namespace FlaxEditor.Gizmo /// public bool IsActive => Owner.Gizmos.Active == this; + /// + /// Gets a value indicating whether this gizmo is using mouse currently (eg. user moving objects). + /// + public virtual bool IsControllingMouse => false; + /// /// Initializes a new instance of the class. /// diff --git a/Source/Editor/Gizmo/TransformGizmoBase.cs b/Source/Editor/Gizmo/TransformGizmoBase.cs index 170bcb5b1..9df9b858b 100644 --- a/Source/Editor/Gizmo/TransformGizmoBase.cs +++ b/Source/Editor/Gizmo/TransformGizmoBase.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +using System; using System.Collections.Generic; using FlaxEngine; @@ -65,6 +66,16 @@ namespace FlaxEditor.Gizmo /// public Transform LastDelta { get; private set; } + /// + /// Occurs when transforming selection started. + /// + public event Action TransformingStarted; + + /// + /// Occurs when transforming selection ended. + /// + public event Action TransformingEnded; + /// /// Initializes a new instance of the class. /// @@ -118,10 +129,10 @@ namespace FlaxEditor.Gizmo return; // End action - OnEndTransforming(); - _startTransforms.Clear(); _isTransforming = false; _isDuplicating = false; + OnEndTransforming(); + _startTransforms.Clear(); } private void UpdateGizmoPosition() @@ -366,6 +377,9 @@ namespace FlaxEditor.Gizmo } } + /// + public override bool IsControllingMouse => _isTransforming; + /// public override void Update(float dt) { @@ -531,6 +545,7 @@ namespace FlaxEditor.Gizmo /// protected virtual void OnStartTransforming() { + TransformingStarted?.Invoke(); } /// @@ -548,6 +563,7 @@ namespace FlaxEditor.Gizmo /// protected virtual void OnEndTransforming() { + TransformingEnded?.Invoke(); } /// diff --git a/Source/Editor/Tools/Foliage/PaintFoliageGizmo.cs b/Source/Editor/Tools/Foliage/PaintFoliageGizmo.cs index b24f503aa..9e6d78920 100644 --- a/Source/Editor/Tools/Foliage/PaintFoliageGizmo.cs +++ b/Source/Editor/Tools/Foliage/PaintFoliageGizmo.cs @@ -169,6 +169,9 @@ namespace FlaxEditor.Tools.Foliage PaintEnded?.Invoke(); } + /// + public override bool IsControllingMouse => IsPainting; + /// public override void Update(float dt) { diff --git a/Source/Editor/Tools/Terrain/PaintTerrainGizmo.cs b/Source/Editor/Tools/Terrain/PaintTerrainGizmo.cs index 51372f290..de95e4005 100644 --- a/Source/Editor/Tools/Terrain/PaintTerrainGizmo.cs +++ b/Source/Editor/Tools/Terrain/PaintTerrainGizmo.cs @@ -135,6 +135,9 @@ namespace FlaxEditor.Tools.Terrain PaintEnded?.Invoke(); } + /// + public override bool IsControllingMouse => IsPainting; + /// public override void Update(float dt) { diff --git a/Source/Editor/Tools/Terrain/SculptTerrainGizmo.cs b/Source/Editor/Tools/Terrain/SculptTerrainGizmo.cs index 88cd83d46..5900bc601 100644 --- a/Source/Editor/Tools/Terrain/SculptTerrainGizmo.cs +++ b/Source/Editor/Tools/Terrain/SculptTerrainGizmo.cs @@ -135,6 +135,9 @@ namespace FlaxEditor.Tools.Terrain PaintEnded?.Invoke(); } + /// + public override bool IsControllingMouse => IsPainting; + /// public override void Update(float dt) { diff --git a/Source/Editor/Tools/VertexPainting.cs b/Source/Editor/Tools/VertexPainting.cs index 29d9daedc..ad2a93251 100644 --- a/Source/Editor/Tools/VertexPainting.cs +++ b/Source/Editor/Tools/VertexPainting.cs @@ -540,6 +540,9 @@ namespace FlaxEditor.Tools _paintUpdateCount = 0; } + /// + public override bool IsControllingMouse => IsPainting; + /// public override void Update(float dt) { diff --git a/Source/Editor/Viewport/EditorGizmoViewport.cs b/Source/Editor/Viewport/EditorGizmoViewport.cs index 93b2c7fbe..5c9fcf034 100644 --- a/Source/Editor/Viewport/EditorGizmoViewport.cs +++ b/Source/Editor/Viewport/EditorGizmoViewport.cs @@ -73,6 +73,9 @@ namespace FlaxEditor.Viewport /// public Undo Undo { get; } + /// + protected override bool IsControllingMouse => Gizmos.Active?.IsControllingMouse ?? false; + /// protected override void AddUpdateCallbacks(RootControl root) { diff --git a/Source/Editor/Viewport/EditorViewport.cs b/Source/Editor/Viewport/EditorViewport.cs index 6e2288979..9c4dcc253 100644 --- a/Source/Editor/Viewport/EditorViewport.cs +++ b/Source/Editor/Viewport/EditorViewport.cs @@ -136,7 +136,7 @@ namespace FlaxEditor.Viewport // Input - private bool _isControllingMouse; + private bool _isControllingMouse, _isViewportControllingMouse; private int _deltaFilteringStep; private Vector2 _startPos; private Vector2 _mouseDeltaLast; @@ -653,6 +653,11 @@ namespace FlaxEditor.Viewport task.Begin += OnRenderBegin; } + /// + /// Gets a value indicating whether this viewport is using mouse currently (eg. user moving objects). + /// + protected virtual bool IsControllingMouse => false; + /// /// Orients the viewport. /// @@ -972,7 +977,16 @@ namespace FlaxEditor.Viewport // Update input { // Get input buttons and keys (skip if viewport has no focus or mouse is over a child control) - bool useMouse = Mathf.IsInRange(_viewMousePos.X, 0, Width) && Mathf.IsInRange(_viewMousePos.Y, 0, Height); + var isViewportControllingMouse = IsControllingMouse; + if (isViewportControllingMouse != _isViewportControllingMouse) + { + _isViewportControllingMouse = isViewportControllingMouse; + if (isViewportControllingMouse) + StartMouseCapture(); + else + EndMouseCapture(); + } + bool useMouse = IsControllingMouse || (Mathf.IsInRange(_viewMousePos.X, 0, Width) && Mathf.IsInRange(_viewMousePos.Y, 0, Height)); _prevInput = _input; var hit = GetChildAt(_viewMousePos, c => c.Visible && !(c is CanvasRootControl)); if (ContainsFocus && hit == null) diff --git a/Source/Editor/Viewport/PrefabWindowViewport.cs b/Source/Editor/Viewport/PrefabWindowViewport.cs index e189a8e62..3cdd6ae0e 100644 --- a/Source/Editor/Viewport/PrefabWindowViewport.cs +++ b/Source/Editor/Viewport/PrefabWindowViewport.cs @@ -356,6 +356,9 @@ namespace FlaxEditor.Viewport /// public Undo Undo { get; } + /// + protected override bool IsControllingMouse => Gizmos.Active?.IsControllingMouse ?? false; + /// protected override void AddUpdateCallbacks(RootControl root) {