feat: add scene view editor camera controls
This commit is contained in:
75
tests/editor/test_scene_viewport_camera_controller.cpp
Normal file
75
tests/editor/test_scene_viewport_camera_controller.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "Viewport/SceneViewportCameraController.h"
|
||||
|
||||
#include <XCEngine/Components/GameObject.h>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
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()));
|
||||
const Vector3 localFocus = cameraObject.GetTransform()->InverseTransformPoint(controller.GetFocalPoint());
|
||||
EXPECT_GT(localFocus.z, 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);
|
||||
}
|
||||
Reference in New Issue
Block a user