Formalize scene viewport HUD overlay

This commit is contained in:
2026-04-03 17:04:34 +08:00
parent 2de254a16f
commit 5d24fd0337
9 changed files with 277 additions and 54 deletions

View File

@@ -4,11 +4,10 @@
#include "Core/ISelectionManager.h"
#include "SceneViewPanel.h"
#include "Viewport/SceneViewportEditorOverlayData.h"
#include "Viewport/SceneViewportHudOverlay.h"
#include "Viewport/SceneViewportOverlayHandleBuilder.h"
#include "Viewport/SceneViewportOverlayHitTester.h"
#include "Viewport/SceneViewportMath.h"
#include "Viewport/SceneViewportOrientationGizmo.h"
#include "Viewport/SceneViewportOverlayRenderer.h"
#include "Viewport/SceneViewportTransformGizmoFrameBuilder.h"
#include "ViewportPanelContent.h"
#include "Platform/Win32Utf8.h"
@@ -139,6 +138,17 @@ SceneViewportInteractionCandidate BuildOrientationGizmoInteractionCandidate(
return candidate;
}
SceneViewportInteractionCandidate BuildHudOverlayInteractionCandidate(
const SceneViewportHudOverlayHitResult& hitResult) {
switch (hitResult.kind) {
case SceneViewportHudOverlayHitKind::OrientationAxis:
return BuildOrientationGizmoInteractionCandidate(hitResult.orientationAxis);
case SceneViewportHudOverlayHitKind::None:
default:
return {};
}
}
SceneViewportInteractionCandidate BuildOverlayHandleInteractionCandidate(
const SceneViewportOverlayHandleHitResult& hitResult) {
SceneViewportInteractionCandidate candidate = {};
@@ -549,6 +559,8 @@ void SceneViewPanel::Render() {
activeGizmoKind = SceneViewportActiveGizmoKind::None;
}
const bool gizmoActive = activeGizmoKind != SceneViewportActiveGizmoKind::None;
const SceneViewportHudOverlayData interactionHudOverlay =
BuildSceneViewportHudOverlayData(overlay);
SceneViewportInteractionCandidate hoveredInteraction = {};
const bool canResolveViewportInteraction =
hasInteractiveViewport &&
@@ -564,9 +576,9 @@ void SceneViewPanel::Render() {
hoveredInteraction);
AccumulateSceneViewportInteractionCandidate(
BuildOrientationGizmoInteractionCandidate(
HitTestSceneViewportOrientationGizmo(
overlay,
BuildHudOverlayInteractionCandidate(
HitTestSceneViewportHudOverlay(
interactionHudOverlay,
content.itemMin,
content.itemMax,
io.MousePos)),
@@ -812,12 +824,11 @@ void SceneViewPanel::Render() {
m_scaleGizmo,
drawGizmoFrameState.scaleContext)));
DrawSceneViewportOverlay(
DrawSceneViewportHudOverlay(
ImGui::GetWindowDrawList(),
overlay,
BuildSceneViewportHudOverlayData(overlay),
content.itemMin,
content.itemMax,
content.availableSize);
content.itemMax);
}
}