refactor: align scene view camera controls with unity
This commit is contained in:
@@ -41,28 +41,68 @@ TEST(SceneViewportCameraController_Test, ApplyToMatchesComputedPositionAndForwar
|
||||
EXPECT_GT(Vector3::Dot(cameraObject.GetTransform()->GetUp().Normalized(), Vector3::Up()), 0.0f);
|
||||
}
|
||||
|
||||
TEST(SceneViewportCameraController_Test, ApplyInputUpdatesOrbitPanAndZoomState) {
|
||||
TEST(SceneViewportCameraController_Test, LookInputRotatesCameraInPlaceAndKeepsDistance) {
|
||||
SceneViewportCameraController controller;
|
||||
controller.Reset();
|
||||
|
||||
const float initialDistance = controller.GetDistance();
|
||||
const float initialYaw = controller.GetYawDegrees();
|
||||
const float initialPitch = controller.GetPitchDegrees();
|
||||
const Vector3 initialPosition = controller.GetPosition();
|
||||
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;
|
||||
input.lookDeltaX = 20.0f;
|
||||
input.lookDeltaY = -15.0f;
|
||||
controller.ApplyInput(input);
|
||||
|
||||
EXPECT_LT(controller.GetDistance(), initialDistance);
|
||||
EXPECT_NE(controller.GetYawDegrees(), initialYaw);
|
||||
EXPECT_NE(controller.GetPitchDegrees(), initialPitch);
|
||||
EXPECT_TRUE(NearlyEqual(controller.GetPosition(), initialPosition));
|
||||
EXPECT_FALSE(NearlyEqual(controller.GetFocalPoint(), initialFocus));
|
||||
EXPECT_TRUE(NearlyEqual(
|
||||
controller.GetFocalPoint(),
|
||||
controller.GetPosition() + controller.GetForward() * controller.GetDistance(),
|
||||
1e-3f));
|
||||
}
|
||||
|
||||
TEST(SceneViewportCameraController_Test, OrbitInputRotatesAroundFocalPointAndKeepsDistance) {
|
||||
SceneViewportCameraController controller;
|
||||
controller.Reset();
|
||||
|
||||
const Vector3 initialPosition = controller.GetPosition();
|
||||
const Vector3 initialFocus = controller.GetFocalPoint();
|
||||
const float initialDistance = controller.GetDistance();
|
||||
|
||||
SceneViewportCameraInputState input = {};
|
||||
input.viewportHeight = 720.0f;
|
||||
input.orbitDeltaX = 20.0f;
|
||||
input.orbitDeltaY = -15.0f;
|
||||
controller.ApplyInput(input);
|
||||
|
||||
EXPECT_FALSE(NearlyEqual(controller.GetPosition(), initialPosition));
|
||||
EXPECT_TRUE(NearlyEqual(controller.GetFocalPoint(), initialFocus));
|
||||
EXPECT_NEAR((controller.GetFocalPoint() - controller.GetPosition()).Magnitude(), initialDistance, 1e-3f);
|
||||
}
|
||||
|
||||
TEST(SceneViewportCameraController_Test, PanAndZoomUpdateCameraStateConsistently) {
|
||||
SceneViewportCameraController controller;
|
||||
controller.Reset();
|
||||
|
||||
const Vector3 initialPosition = controller.GetPosition();
|
||||
const Vector3 initialFocus = controller.GetFocalPoint();
|
||||
const float initialDistance = controller.GetDistance();
|
||||
|
||||
SceneViewportCameraInputState input = {};
|
||||
input.viewportHeight = 720.0f;
|
||||
input.panDeltaX = 16.0f;
|
||||
input.panDeltaY = -10.0f;
|
||||
input.zoomDelta = 1.0f;
|
||||
controller.ApplyInput(input);
|
||||
|
||||
EXPECT_FALSE(NearlyEqual(controller.GetPosition(), initialPosition));
|
||||
EXPECT_FALSE(NearlyEqual(controller.GetFocalPoint(), initialFocus));
|
||||
EXPECT_LT(controller.GetDistance(), initialDistance);
|
||||
EXPECT_TRUE(NearlyEqual(
|
||||
controller.GetFocalPoint(),
|
||||
controller.GetPosition() + controller.GetForward() * controller.GetDistance(),
|
||||
1e-3f));
|
||||
}
|
||||
|
||||
TEST(SceneViewportCameraController_Test, FocusMovesPivotWithoutChangingDistance) {
|
||||
|
||||
Reference in New Issue
Block a user