From d671f57952ed9279961b0b6fc5ff1a0fec250ea1 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Mon, 15 Dec 2025 21:41:45 -0600 Subject: [PATCH] Change to container control for anchoring. --- Source/Editor/Gizmo/DirectionGizmo.cs | 43 +++++++++++-------- .../Viewport/MainEditorGizmoViewport.cs | 10 ++--- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/Source/Editor/Gizmo/DirectionGizmo.cs b/Source/Editor/Gizmo/DirectionGizmo.cs index bfe2ebab9..350c3be5c 100644 --- a/Source/Editor/Gizmo/DirectionGizmo.cs +++ b/Source/Editor/Gizmo/DirectionGizmo.cs @@ -6,7 +6,7 @@ using FlaxEngine.GUI; namespace FlaxEditor.Gizmo; -public class DirectionGizmo +public class DirectionGizmo : ContainerControl { private IGizmoOwner _owner; private ViewportProjection _viewportProjection; @@ -33,7 +33,7 @@ public class DirectionGizmo // Store sprite positions for hover detection private List<(Float2 position, AxisDirection direction)> _spritePositions = new List<(Float2, AxisDirection)>(); - + private struct ViewportProjection { private Matrix _viewProjection; @@ -112,33 +112,40 @@ public class DirectionGizmo return distanceSq <= radiusSq; } - /// - /// Updates the gizmo for mouse interactions (hover and click detection). - /// - public void Update(Float2 mousePos) + /// + public override void OnMouseMove(Float2 location) { _hoveredAxisIndex = -1; + // Convert local control space to screen space + Float2 viewportLocation = PointToParent(ref location); + // Check which axis is being hovered - check from end (closest) to start (farthest) for proper layering for (int i = _spritePositions.Count - 1; i >= 0; i--) { - if (IsPointInSprite(mousePos, _spritePositions[i].position)) + if (IsPointInSprite(viewportLocation, _spritePositions[i].position)) { _hoveredAxisIndex = i; break; } } + + base.OnMouseMove(location); } - - /// - /// Handles mouse click on direction gizmo sprites. - /// - public bool OnMouseDown(Float2 mousePos) + + /// + public override bool OnMouseDown(Float2 location, MouseButton button) { + if (base.OnMouseDown(location, button)) + return true; + + // Convert local control space to screen space + Float2 viewportLocation = PointToParent(ref location); + // Check which axis is being clicked - check from end (closest) to start (farthest) for proper layering for (int i = _spritePositions.Count - 1; i >= 0; i--) { - if (IsPointInSprite(mousePos, _spritePositions[i].position)) + if (IsPointInSprite(viewportLocation, _spritePositions[i].position)) { OrientViewToAxis(_spritePositions[i].direction); return true; @@ -167,14 +174,16 @@ public class DirectionGizmo /// /// Used to Draw the gizmo. /// - public void Draw() + public override void DrawSelf() { + base.DrawSelf(); + _viewportProjection.Init(_owner.Viewport); _gizmoCenter = _viewport.Task.View.WorldPosition + _viewport.Task.View.Direction * 1500; _viewportProjection.ProjectPoint(_gizmoCenter, out var gizmoCenterScreen); - var bounds = _viewport.Bounds; - var screenLocation = bounds.Location - new Float2(-bounds.Width * 0.5f + 50, bounds.Height * 0.5f - 50); - var relativeCenter = gizmoCenterScreen - screenLocation; + + // Use the settable bounds instead of hardcoded positioning + var relativeCenter = Bounds.Location + Bounds.Size * 0.5f; // Project unit vectors _viewportProjection.ProjectPoint(_gizmoCenter + Vector3.Right, out var xProjected); diff --git a/Source/Editor/Viewport/MainEditorGizmoViewport.cs b/Source/Editor/Viewport/MainEditorGizmoViewport.cs index b5232c7e4..fccb7a79e 100644 --- a/Source/Editor/Viewport/MainEditorGizmoViewport.cs +++ b/Source/Editor/Viewport/MainEditorGizmoViewport.cs @@ -218,6 +218,11 @@ namespace FlaxEditor.Viewport // Add rubber band selector _rubberBandSelector = new ViewportRubberBandSelector(this); _directionGizmo = new DirectionGizmo(this); + _directionGizmo.Parent = this; + _directionGizmo.AnchorPreset = AnchorPresets.TopRight; + _directionGizmo.LocalY += 30; + _directionGizmo.LocalX -= 10; + _directionGizmo.Size = new Float2(100, 100); // Add grid Grid = new GridGizmo(this); @@ -612,8 +617,6 @@ namespace FlaxEditor.Viewport { base.OnMouseMove(location); - _directionGizmo.Update(location); - // Don't allow rubber band selection when gizmo is controlling mouse, vertex painting mode, or cloth painting is enabled bool canStart = !(IsControllingMouse || IsRightMouseButtonDown || IsAltKeyDown) && Gizmos?.Active is TransformGizmo && !Gizmos.Active.IsControllingMouse; @@ -624,9 +627,6 @@ namespace FlaxEditor.Viewport protected override void OnLeftMouseButtonDown() { base.OnLeftMouseButtonDown(); - - if (_directionGizmo.OnMouseDown(_viewMousePos)) - return; _rubberBandSelector.TryStartingRubberBandSelection(); }