diff --git a/game/addons/tools/Code/Editor/RectEditor/MeshRectangle.cs b/game/addons/tools/Code/Editor/RectEditor/MeshRectangle.cs index efbf0808..0f2e4778 100644 --- a/game/addons/tools/Code/Editor/RectEditor/MeshRectangle.cs +++ b/game/addons/tools/Code/Editor/RectEditor/MeshRectangle.cs @@ -153,7 +153,7 @@ public partial class Document BuildUnwrappedMeshWithSquareMapping(); break; case MappingMode.Planar: - var cameraRot = SceneViewportWidget.LastSelected.State.CameraRotation; + var cameraRot = SceneViewWidget.Current.LastSelectedViewportWidget.State.CameraRotation; BuildUnwrappedMeshWithPlanarMapping( cameraRot.Left, cameraRot.Up ); break; case MappingMode.UseExisting: diff --git a/game/addons/tools/Code/Extensions/SceneEditorExtensions.cs b/game/addons/tools/Code/Extensions/SceneEditorExtensions.cs index e4472cb2..cb5b51dc 100644 --- a/game/addons/tools/Code/Extensions/SceneEditorExtensions.cs +++ b/game/addons/tools/Code/Extensions/SceneEditorExtensions.cs @@ -120,7 +120,7 @@ public static class SceneEditorExtensions 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 e3f6a477..d586d68e 100644 --- a/game/addons/tools/Code/Scene/Mesh/Tools/TextureTool.UI.cs +++ b/game/addons/tools/Code/Scene/Mesh/Tools/TextureTool.UI.cs @@ -199,7 +199,7 @@ partial class TextureTool 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 db40f203..0e82388e 100644 --- a/game/addons/tools/Code/Scene/SceneEditorMenus.cs +++ b/game/addons/tools/Code/Scene/SceneEditorMenus.cs @@ -1,6 +1,4 @@ -using Editor.MapEditor; - -namespace Editor; +namespace Editor; public static class SceneEditorMenus { @@ -146,13 +144,17 @@ public static class SceneEditorMenus [Shortcut( "gameObject.align-to-view", "CTRL+SHIFT+F" )] public static void AlignToView() { - if ( !SceneViewportWidget.LastSelected.IsValid() ) + if ( SceneViewWidget.Current is null ) + return; + + 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 +333,14 @@ public static class SceneEditorMenus 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 8621584d..92c9b121 100644 --- a/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs +++ b/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs @@ -747,10 +747,10 @@ partial class GameObjectNode : TreeNode { go.Parent = parent; - if ( !EditorPreferences.CreateObjectsAtOrigin && !parent.IsValid() ) + if ( !EditorPreferences.CreateObjectsAtOrigin && !parent.IsValid() && SceneViewWidget.Current?.LastSelectedViewportWidget?.IsValid() == true ) { // 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 ); @@ -810,10 +810,10 @@ partial class GameObjectNode : TreeNode { go.Parent = parent; - if ( !EditorPreferences.CreateObjectsAtOrigin && !parent.IsValid() ) + if ( !EditorPreferences.CreateObjectsAtOrigin && !parent.IsValid() && SceneViewWidget.Current?.LastSelectedViewportWidget?.IsValid() == true ) { // 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 @@ partial class GameObjectNode : TreeNode 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 e24553f4..66d9445c 100644 --- a/game/addons/tools/Code/Scene/SceneView/SceneViewWidget.cs +++ b/game/addons/tools/Code/Scene/SceneView/SceneViewWidget.cs @@ -33,6 +33,8 @@ public partial class SceneViewWidget : Widget public static SceneViewWidget Current { get; private set; } + public SceneViewportWidget LastSelectedViewportWidget { get; set; } + public EditorToolManager Tools { get; private set; } /// @@ -338,6 +340,13 @@ file class ViewportToolBar : Widget 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 ac130e44..b19b0332 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 partial class SceneViewportWidget : Widget 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 @@ public partial class SceneViewportWidget : Widget // 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 15ae92f6..4832fed0 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 @@ class CameraToolWindow : WidgetWindow { 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 daf1eb08..32f508f7 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 @@ class NavMeshLinkToolWindow : WidgetWindow 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 @@ class NavMeshLinkToolWindow : WidgetWindow 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 @@ class NavMeshLinkToolWindow : WidgetWindow 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(); } } );