Skip to content

Commit 2cd5612

Browse files
committed
Fix issue with incorrect scene viewport hover handling
1 parent 67a488d commit 2cd5612

File tree

4 files changed

+12
-10
lines changed

4 files changed

+12
-10
lines changed

ContentEditor.App/EngineObjects/SceneMouseHandler.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class SceneMouseHandler(Scene scene)
1818
public Vector2 MouseViewportPosition { get; private set; }
1919
public Vector2 MouseScreenPosition => MouseViewportPosition + ViewportOffset;
2020

21+
public bool IsViewportHovered { get; private set; }
2122
public bool IsLeftDown => IsDown(ImGuiMouseButton.Left);
2223
public bool IsRightDown => IsDown(ImGuiMouseButton.Right);
2324
public bool IsMiddleDown => IsDown(ImGuiMouseButton.Middle);
@@ -114,36 +115,37 @@ private ref bool IsDown(ImGuiMouseButton button)
114115

115116
private MouseButtonFlags DownFlags => (downLB ? MouseButtonFlags.Left : 0) | (downRB ? MouseButtonFlags.Right : 0) | (downMB ? MouseButtonFlags.Middle : 0);
116117

117-
public void UpdateMouseState(IMouse mouse, bool leftDown, bool rightDown, bool middleDown, bool allowDown, Vector2 mouseScreenPos)
118+
public void UpdateMouseState(IMouse mouse, bool leftDown, bool rightDown, bool middleDown, bool isHovered, Vector2 mouseScreenPos)
118119
{
120+
IsViewportHovered = isHovered;
119121
if (leftDown != downLB) {
120122
if (!leftDown) {
121123
HandleMouseUp(mouse, ImGuiMouseButton.Left, mouseScreenPos);
122-
} else if (allowDown) {
124+
} else if (isHovered) {
123125
HandleMouseDown(ImGuiMouseButton.Left, mouseScreenPos);
124126
}
125127
}
126128

127129
if (rightDown != downRB) {
128130
if (!rightDown) {
129131
HandleMouseUp(mouse, ImGuiMouseButton.Right, mouseScreenPos);
130-
} else if (allowDown) {
132+
} else if (isHovered) {
131133
HandleMouseDown(ImGuiMouseButton.Right, mouseScreenPos);
132134
}
133135
}
134136

135137
if (middleDown != downMB) {
136138
if (middleDown) {
137139
HandleMouseUp(mouse, ImGuiMouseButton.Middle, mouseScreenPos);
138-
} else if (allowDown) {
140+
} else if (isHovered) {
139141
HandleMouseDown(ImGuiMouseButton.Middle, mouseScreenPos);
140142
}
141143
}
142144

143145
if (lastMousePos != mouseScreenPos - ViewportOffset) {
144146
HandleMouseMove(mouse, mouseScreenPos);
145147
}
146-
if (allowDown) {
148+
if (isHovered) {
147149
MouseWheelDelta = new Vector2(0, ImGui.GetIO().MouseWheel);
148150
} else {
149151
MouseWheelDelta = Vector2.Zero;

ContentEditor.App/Graphics/Gizmos/GizmoState.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public bool ArrowHandle(ref Vector3 position, out int handleId, Vector3 axis, Ax
115115
if (activeHandle == null || !isHandleActive) {
116116
var mouse = Scene.Mouse.MouseScreenPosition;
117117
if (!Scene.Mouse.IsDragging) {
118-
if (CheckOverlapLine2D(pos1, pos2, screenRadius, mouse)) {
118+
if (Scene.Mouse.IsViewportHovered && CheckOverlapLine2D(pos1, pos2, screenRadius, mouse)) {
119119
ReserveHandle(current.id, handleId);
120120
container.PushMaterial((GizmoMaterialPreset)(axisType + (int)GizmoMaterialPreset.AxisX_Highlight), ShapeBuilder.GeometryType.Filled);
121121
if (Scene.Mouse.IsLeftDown) {
@@ -167,7 +167,7 @@ public bool RotationHandle(Vector3 position, ref Quaternion quaternion, out int
167167
var mouse = Scene.Mouse.MouseScreenPosition;
168168
if (!Scene.Mouse.IsDragging) {
169169
var screenPosition = Scene.ActiveCamera.WorldToScreenPosition(position);
170-
if (Scene.ActiveCamera.IsPointInViewport(screenPosition) && CheckOverlapProjectedCircle(position, axis, mouse, handleSize, handleSize * 0.1f)) {
170+
if (Scene.Mouse.IsViewportHovered && Scene.ActiveCamera.IsPointInViewport(screenPosition) && CheckOverlapProjectedCircle(position, axis, mouse, handleSize, handleSize * 0.1f)) {
171171
ReserveHandle(current.id, handleId);
172172
container.PushMaterial((GizmoMaterialPreset)(axisType + (int)GizmoMaterialPreset.AxisX_Highlight), ShapeBuilder.GeometryType.Line);
173173
if (Scene.Mouse.IsLeftDown) {
@@ -225,7 +225,7 @@ public bool PointHandle(ref Vector3 position, out int handleId, float handleSize
225225
var screenPosition = Scene.ActiveCamera.WorldToScreenPosition(position);
226226
if (container.CanActivate && (activeHandle == null || !isHandleActive)) {
227227
var mouse = Scene.Mouse.MouseScreenPosition;
228-
if ((mouse - screenPosition).LengthSquared() < handleSize * handleSize && !Scene.Mouse.IsDragging) {
228+
if (Scene.Mouse.IsViewportHovered && (mouse - screenPosition).LengthSquared() < handleSize * handleSize && !Scene.Mouse.IsDragging) {
229229
ReserveHandle(current.id, handleId);
230230
// TODO not ideal - needless allocations - optimize later
231231
DrawListQueue.Add(() => {

ContentEditor.App/Imgui/App/SceneView.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public void OnIMGUI()
117117
isDragging = false;
118118
}
119119

120-
if (isDragging || hoveredMesh) {
120+
if (isDragging || hoveredMesh || Scene.Mouse.IsViewportHovered && !hoveredMesh) {
121121
AppImguiHelpers.RedirectMouseInputToScene(Scene, hoveredMesh);
122122
}
123123
}

ContentEditor.App/Imgui/Components/MeshComponentHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ protected override bool ShowTree(UIContext context, RszInstance instance)
4646
if (ImguiHelpers.ToggleButton(isFocused ? $"{AppIcons.Star}" : $"{AppIcons.StarEmpty}", ref isFocused, Colors.IconActive)) {
4747
if (isFocused) {
4848
component.focusedGroup = instance;
49-
component.focusedGroupElementIndex = -1;
5049
} else {
5150
component.focusedGroup = null;
5251
}
52+
component.focusedGroupElementIndex = -1;
5353
}
5454
ImguiHelpers.Tooltip("Focus on this mesh group gizmo");
5555
ImGui.SameLine();

0 commit comments

Comments
 (0)