diff --git a/game/addons/tools/Code/Extensions/SceneEditorExtensions.cs b/game/addons/tools/Code/Extensions/SceneEditorExtensions.cs index e4472cb23..339526991 100644 --- a/game/addons/tools/Code/Extensions/SceneEditorExtensions.cs +++ b/game/addons/tools/Code/Extensions/SceneEditorExtensions.cs @@ -120,7 +120,7 @@ public static bool FirstPersonCamera( this Gizmo.Instance self, CameraComponent currentSpeed = Math.Clamp( currentSpeed, 0.25f, 100.0f ); EditorPreferences.CameraSpeed = currentSpeed; - SceneViewportWidget.LastSelected.timeSinceCameraSpeedChange = 0; + SceneViewWidget.Current.LastSelectedViewportWidget.timeSinceCameraSpeedChange = 0; } var sens = EditorPreferences.CameraSensitivity; diff --git a/game/addons/tools/Code/Scene/Mesh/Tools/TextureTool.UI.cs b/game/addons/tools/Code/Scene/Mesh/Tools/TextureTool.UI.cs index 4665c6d53..5f808155c 100644 --- a/game/addons/tools/Code/Scene/Mesh/Tools/TextureTool.UI.cs +++ b/game/addons/tools/Code/Scene/Mesh/Tools/TextureTool.UI.cs @@ -186,7 +186,7 @@ private void AlignToFace() private void AlignToView() { - var sceneView = SceneViewportWidget.LastSelected; + var sceneView = SceneViewWidget.Current?.LastSelectedViewportWidget; if ( !sceneView.IsValid() ) return; diff --git a/game/addons/tools/Code/Scene/SceneEditorMenus.cs b/game/addons/tools/Code/Scene/SceneEditorMenus.cs index db40f203c..7e3c8d762 100644 --- a/game/addons/tools/Code/Scene/SceneEditorMenus.cs +++ b/game/addons/tools/Code/Scene/SceneEditorMenus.cs @@ -146,13 +146,14 @@ public static void Frame() [Shortcut( "gameObject.align-to-view", "CTRL+SHIFT+F" )] public static void AlignToView() { - if ( !SceneViewportWidget.LastSelected.IsValid() ) + var lastSelectedViewportWidget = SceneViewWidget.Current.LastSelectedViewportWidget; + if ( !lastSelectedViewportWidget.IsValid() ) return; if ( EditorScene.Selection.Count == 0 ) return; - var targetTransform = new Transform( SceneViewportWidget.LastSelected.State.CameraPosition, SceneViewportWidget.LastSelected.State.CameraRotation ); + var targetTransform = new Transform( lastSelectedViewportWidget.State.CameraPosition, lastSelectedViewportWidget.State.CameraRotation ); var gos = EditorScene.Selection.OfType().ToArray(); gos.DispatchPreEdited( nameof( GameObject.LocalPosition ) ); @@ -331,13 +332,14 @@ private static void Nudge( Vector2 direction ) if ( !EditorScene.Selection.OfType().Any() ) return; - if ( !SceneViewportWidget.LastSelected.IsValid() ) + var lastSelectedViewportWidget = SceneViewWidget.Current.LastSelectedViewportWidget; + if ( !lastSelectedViewportWidget.IsValid() ) return; var gos = EditorScene.Selection.OfType(); using ( SceneEditorSession.Active.UndoScope( "Nudge Object(s)" ).WithGameObjectChanges( gos, GameObjectUndoFlags.Properties ).Push() ) { - var gizmoInstance = SceneViewportWidget.LastSelected.GizmoInstance; + var gizmoInstance = lastSelectedViewportWidget.GizmoInstance; var rotation = Rotation.Identity; if ( !gizmoInstance.Settings.GlobalSpace ) diff --git a/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs b/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs index 8621584d9..840fbb127 100644 --- a/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs +++ b/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs @@ -750,7 +750,7 @@ void PostCreate( GameObject go, GameObject parent ) if ( !EditorPreferences.CreateObjectsAtOrigin && !parent.IsValid() ) { // I wonder if we should be tracing and placing it on the surface? - go.LocalPosition = SceneViewportWidget.LastSelected.State.CameraPosition + SceneViewportWidget.LastSelected.State.CameraRotation.Forward * 300; + go.LocalPosition = SceneViewWidget.Current.LastSelectedViewportWidget.State.CameraPosition + SceneViewWidget.Current.LastSelectedViewportWidget.State.CameraRotation.Forward * 300; } afterCreate?.Invoke( go ); @@ -813,7 +813,7 @@ void PostCreate( GameObject go, GameObject parent ) if ( !EditorPreferences.CreateObjectsAtOrigin && !parent.IsValid() ) { // I wonder if we should be tracing and placing it on the surface? - go.LocalPosition = SceneViewportWidget.LastSelected.State.CameraPosition + SceneViewportWidget.LastSelected.State.CameraRotation.Forward * 300; + go.LocalPosition = SceneViewWidget.Current.LastSelectedViewportWidget.State.CameraPosition + SceneViewWidget.Current.LastSelectedViewportWidget.State.CameraRotation.Forward * 300; } afterCreate?.Invoke( go ); @@ -891,7 +891,7 @@ void PostCreate( GameObject go ) if ( !EditorPreferences.CreateObjectsAtOrigin && !parent.IsValid() ) { // I wonder if we should be tracing and placing it on the surface? - go.LocalPosition = SceneViewportWidget.LastSelected.State.CameraPosition + SceneViewportWidget.LastSelected.State.CameraRotation.Forward * 300; + go.LocalPosition = SceneViewWidget.Current.LastSelectedViewportWidget.State.CameraPosition + SceneViewWidget.Current.LastSelectedViewportWidget.State.CameraRotation.Forward * 300; } afterCreate?.Invoke( go ); diff --git a/game/addons/tools/Code/Scene/SceneView/SceneViewWidget.cs b/game/addons/tools/Code/Scene/SceneView/SceneViewWidget.cs index e24553f48..66d9445c0 100644 --- a/game/addons/tools/Code/Scene/SceneView/SceneViewWidget.cs +++ b/game/addons/tools/Code/Scene/SceneView/SceneViewWidget.cs @@ -33,6 +33,8 @@ public ViewportLayoutMode ViewportLayout public static SceneViewWidget Current { get; private set; } + public SceneViewportWidget LastSelectedViewportWidget { get; set; } + public EditorToolManager Tools { get; private set; } /// @@ -338,6 +340,13 @@ void OnToolChanged() toolWidget.Focus(); } + else + { + if ( SceneViewWidget.Current?.LastSelectedViewportWidget?.IsValid() ?? false ) + { + SceneViewWidget.Current.LastSelectedViewportWidget.Focus(); + } + } // Update footer var footerWidget = subTool?.CreateToolFooter() ?? rootTool?.CreateToolFooter(); diff --git a/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs b/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs index ac130e444..b19b0332b 100644 --- a/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs +++ b/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs @@ -2,7 +2,6 @@ public partial class SceneViewportWidget : Widget { - public static SceneViewportWidget LastSelected { get; private set; } public static Vector2 MousePosition { get; private set; } public int Id { get; private set; } @@ -43,7 +42,7 @@ public SceneViewportWidget( SceneViewWidget sceneView, int id ) : base( sceneVie Id = id; if ( Id == 0 ) { - LastSelected = this; + SceneView.LastSelectedViewportWidget = this; } if ( ProjectCookie.Get( $"SceneView.Viewport{Id}.Settings", null ) is ViewportState savedSettings ) @@ -447,9 +446,9 @@ void OnEditorPreFrame() // var hasMouseFocus = hasMouseInput; - if ( IsFocused ) + if ( IsFocused && SceneViewWidget.Current.IsValid() ) { - LastSelected = this; + SceneViewWidget.Current.LastSelectedViewportWidget = this; } GizmoInstance.Input.IsHovered = hasMouseFocus; diff --git a/game/addons/tools/Code/Scene/Tools/Component/CameraComponentTool.cs b/game/addons/tools/Code/Scene/Tools/Component/CameraComponentTool.cs index 15ae92f65..4832fed04 100644 --- a/game/addons/tools/Code/Scene/Tools/Component/CameraComponentTool.cs +++ b/game/addons/tools/Code/Scene/Tools/Component/CameraComponentTool.cs @@ -206,7 +206,7 @@ void LookAt() { EditorToolManager.CurrentModeName = "camera.lookat"; // maintain focus on scene even after clicking the button - SceneViewportWidget.LastSelected?.Focus(); + SceneViewWidget.Current?.LastSelectedViewportWidget?.Focus(); } void CloseWindow() diff --git a/game/addons/tools/Code/Scene/Tools/Component/NavMeshLinkTool.cs b/game/addons/tools/Code/Scene/Tools/Component/NavMeshLinkTool.cs index daf1eb085..32f508f72 100644 --- a/game/addons/tools/Code/Scene/Tools/Component/NavMeshLinkTool.cs +++ b/game/addons/tools/Code/Scene/Tools/Component/NavMeshLinkTool.cs @@ -107,7 +107,7 @@ void Rebuild() isPickingEnd = false; isAddingNewLink = false; helpLabel.Text = "Pick start position for selected link. Press Ctrl or Cancel Button to cancel."; - SceneViewportWidget.LastSelected.Focus(); + SceneViewWidget.Current?.LastSelectedViewportWidget?.Focus(); } } ); @@ -120,7 +120,7 @@ void Rebuild() isPickingStart = false; isAddingNewLink = false; helpLabel.Text = "Pick end position for selected link. Press Ctrl or Cancel Button to cancel."; - SceneViewportWidget.LastSelected.Focus(); + SceneViewWidget.Current?.LastSelectedViewportWidget?.Focus(); } } ); @@ -132,7 +132,7 @@ void Rebuild() isAddingNewLink = true; isPickingStart = true; helpLabel.Text = "Pick start Position for new link. Press Ctrl or Cancel Button to cancel."; - SceneViewportWidget.LastSelected.Focus(); + SceneViewWidget.Current?.LastSelectedViewportWidget?.Focus(); } } );