#include #include "Viewport/SceneViewportCameraController.h" #include #include namespace { bool NearlyEqual(float lhs, float rhs, float epsilon = 1e-4f) { return std::abs(lhs - rhs) <= epsilon; } bool NearlyEqual(const XCEngine::Math::Vector3& lhs, const XCEngine::Math::Vector3& rhs, float epsilon = 1e-4f) { return NearlyEqual(lhs.x, rhs.x, epsilon) && NearlyEqual(lhs.y, rhs.y, epsilon) && NearlyEqual(lhs.z, rhs.z, epsilon); } } // namespace using XCEngine::Components::GameObject; using XCEngine::Editor::SceneViewportCameraController; using XCEngine::Editor::SceneViewportCameraInputState; using XCEngine::Math::Vector3; TEST(SceneViewportCameraController_Test, ApplyToMatchesComputedPositionAndForward) { SceneViewportCameraController controller; controller.Reset(); controller.Focus(Vector3(2.0f, 1.0f, -3.0f)); GameObject cameraObject("EditorCamera"); controller.ApplyTo(*cameraObject.GetTransform()); EXPECT_TRUE(NearlyEqual(cameraObject.GetTransform()->GetPosition(), controller.GetPosition())); EXPECT_TRUE(NearlyEqual( cameraObject.GetTransform()->GetForward().Normalized(), controller.GetForward(), 1e-3f)); EXPECT_GT(Vector3::Dot(cameraObject.GetTransform()->GetUp().Normalized(), Vector3::Up()), 0.0f); } TEST(SceneViewportCameraController_Test, ApplyInputUpdatesOrbitPanAndZoomState) { SceneViewportCameraController controller; controller.Reset(); const float initialDistance = controller.GetDistance(); const float initialYaw = controller.GetYawDegrees(); const float initialPitch = controller.GetPitchDegrees(); const Vector3 initialFocus = controller.GetFocalPoint(); SceneViewportCameraInputState input = {}; input.viewportHeight = 720.0f; input.zoomDelta = 1.0f; input.orbitDeltaX = 20.0f; input.orbitDeltaY = -15.0f; input.panDeltaX = 16.0f; input.panDeltaY = -10.0f; controller.ApplyInput(input); EXPECT_LT(controller.GetDistance(), initialDistance); EXPECT_NE(controller.GetYawDegrees(), initialYaw); EXPECT_NE(controller.GetPitchDegrees(), initialPitch); EXPECT_FALSE(NearlyEqual(controller.GetFocalPoint(), initialFocus)); } TEST(SceneViewportCameraController_Test, FocusMovesPivotWithoutChangingDistance) { SceneViewportCameraController controller; controller.Reset(); const float initialDistance = controller.GetDistance(); const Vector3 target(5.0f, -2.0f, 7.5f); controller.Focus(target); EXPECT_TRUE(NearlyEqual(controller.GetFocalPoint(), target)); EXPECT_FLOAT_EQ(controller.GetDistance(), initialDistance); }