Files
XCEngine/editor/src/Viewport/SceneViewportHudOverlay.cpp

65 lines
1.8 KiB
C++
Raw Normal View History

2026-04-03 17:04:34 +08:00
#include "SceneViewportHudOverlay.h"
#include "SceneViewportOrientationGizmo.h"
namespace XCEngine {
namespace Editor {
namespace {
bool IsViewportRectValid(const ImVec2& viewportMin, const ImVec2& viewportMax) {
return viewportMax.x - viewportMin.x > 1.0f &&
viewportMax.y - viewportMin.y > 1.0f;
}
} // namespace
void DrawSceneViewportHudOverlay(
ImDrawList* drawList,
const SceneViewportHudOverlayData& overlay,
const ImVec2& viewportMin,
const ImVec2& viewportMax) {
if (drawList == nullptr ||
!overlay.HasVisibleElements() ||
!IsViewportRectValid(viewportMin, viewportMax)) {
return;
}
drawList->PushClipRect(viewportMin, viewportMax, true);
if (overlay.showOrientationGizmo) {
DrawSceneViewportOrientationGizmo(
drawList,
overlay.sceneOverlay,
viewportMin,
viewportMax);
}
drawList->PopClipRect();
}
SceneViewportHudOverlayHitResult HitTestSceneViewportHudOverlay(
const SceneViewportHudOverlayData& overlay,
const ImVec2& viewportMin,
const ImVec2& viewportMax,
const ImVec2& mousePosition) {
SceneViewportHudOverlayHitResult result = {};
if (!overlay.HasVisibleElements() || !IsViewportRectValid(viewportMin, viewportMax)) {
return result;
}
if (overlay.showOrientationGizmo) {
const SceneViewportOrientationAxis axis = HitTestSceneViewportOrientationGizmo(
overlay.sceneOverlay,
viewportMin,
viewportMax,
mousePosition);
if (axis != SceneViewportOrientationAxis::None) {
result.kind = SceneViewportHudOverlayHitKind::OrientationAxis;
result.orientationAxis = axis;
}
}
return result;
}
} // namespace Editor
} // namespace XCEngine