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

@@ -23,6 +23,10 @@ set(EDITOR_TEST_SOURCES
test_editor_console_sink.cpp
test_editor_script_assembly_builder.cpp
test_editor_script_assembly_builder_utils.cpp
${CMAKE_BINARY_DIR}/_deps/imgui-src/imgui.cpp
${CMAKE_BINARY_DIR}/_deps/imgui-src/imgui_draw.cpp
${CMAKE_BINARY_DIR}/_deps/imgui-src/imgui_tables.cpp
${CMAKE_BINARY_DIR}/_deps/imgui-src/imgui_widgets.cpp
${CMAKE_SOURCE_DIR}/editor/src/Core/EditorConsoleSink.cpp
${CMAKE_SOURCE_DIR}/editor/src/Scripting/EditorScriptAssemblyBuilder.cpp
${CMAKE_SOURCE_DIR}/editor/src/Core/UndoManager.cpp
@@ -33,6 +37,8 @@ set(EDITOR_TEST_SOURCES
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportMoveGizmo.cpp
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportRotateGizmo.cpp
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportScaleGizmo.cpp
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportHudOverlay.cpp
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOrientationGizmo.cpp
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOverlayBuilder.cpp
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOverlayProviders.cpp
)

View File

@@ -1,6 +1,7 @@
#include <gtest/gtest.h>
#include "Viewport/SceneViewportCameraController.h"
#include "Viewport/SceneViewportHudOverlay.h"
#include "Viewport/SceneViewportMath.h"
#include <XCEngine/Components/GameObject.h>
@@ -64,8 +65,12 @@ XCEngine::Rendering::Passes::InfiniteGridPassData ToInfiniteGridPassData(
using XCEngine::Editor::BuildSceneViewportAxisDragPlaneNormal;
using XCEngine::Editor::SceneViewportCameraController;
using XCEngine::Editor::SceneViewportHudOverlayHitKind;
using XCEngine::Editor::SceneViewportHudOverlayHitResult;
using XCEngine::Editor::BuildSceneViewportProjectionMatrix;
using XCEngine::Editor::BuildSceneViewportHudOverlayData;
using XCEngine::Editor::BuildSceneViewportViewMatrix;
using XCEngine::Editor::HitTestSceneViewportHudOverlay;
using XCEngine::Editor::ProjectSceneViewportWorldPoint;
using XCEngine::Editor::SceneViewportOverlayData;
using XCEngine::Components::GameObject;
@@ -267,3 +272,38 @@ TEST(SceneViewportOverlayRenderer_Test, BuildSceneViewportAxisDragPlaneNormalFal
EXPECT_NEAR(Vector3::Dot(planeNormal, Vector3::Right()), 0.0f, 1e-4f);
EXPECT_GT(planeNormal.SqrMagnitude(), 0.5f);
}
TEST(SceneViewportOverlayRenderer_Test, BuildSceneViewportHudOverlayDataTracksVisibilityIntent) {
SceneViewportOverlayData overlay = {};
overlay.valid = true;
const auto visibleHud = BuildSceneViewportHudOverlayData(overlay);
const auto hiddenHud = BuildSceneViewportHudOverlayData(overlay, false);
EXPECT_TRUE(visibleHud.HasVisibleElements());
EXPECT_FALSE(hiddenHud.HasVisibleElements());
}
TEST(SceneViewportOverlayRenderer_Test, HitTestSceneViewportHudOverlaySkipsInvalidOrHiddenOverlay) {
const SceneViewportHudOverlayHitResult invalidHit =
HitTestSceneViewportHudOverlay({}, ImVec2(0.0f, 0.0f), ImVec2(200.0f, 200.0f), ImVec2(100.0f, 100.0f));
EXPECT_EQ(invalidHit.kind, SceneViewportHudOverlayHitKind::None);
SceneViewportOverlayData overlay = {};
overlay.valid = true;
overlay.cameraPosition = Vector3(0.0f, 0.0f, -5.0f);
overlay.cameraForward = Vector3::Forward();
overlay.cameraRight = Vector3::Right();
overlay.cameraUp = Vector3::Up();
overlay.verticalFovDegrees = 60.0f;
overlay.nearClipPlane = 0.03f;
overlay.farClipPlane = 2000.0f;
const SceneViewportHudOverlayHitResult hiddenHit =
HitTestSceneViewportHudOverlay(
BuildSceneViewportHudOverlayData(overlay, false),
ImVec2(0.0f, 0.0f),
ImVec2(200.0f, 200.0f),
ImVec2(100.0f, 100.0f));
EXPECT_EQ(hiddenHit.kind, SceneViewportHudOverlayHitKind::None);
}