feat: add scene view fly controls

This commit is contained in:
2026-03-28 18:28:11 +08:00
parent af2f30dad6
commit 569f8ef725
5 changed files with 72 additions and 2 deletions

View File

@@ -47,6 +47,7 @@ TEST(SceneViewportCameraController_Test, LookInputRotatesCameraInPlaceAndKeepsDi
const Vector3 initialPosition = controller.GetPosition();
const Vector3 initialFocus = controller.GetFocalPoint();
const float initialPitch = controller.GetPitchDegrees();
SceneViewportCameraInputState input = {};
input.viewportHeight = 720.0f;
@@ -56,6 +57,7 @@ TEST(SceneViewportCameraController_Test, LookInputRotatesCameraInPlaceAndKeepsDi
EXPECT_TRUE(NearlyEqual(controller.GetPosition(), initialPosition));
EXPECT_FALSE(NearlyEqual(controller.GetFocalPoint(), initialFocus));
EXPECT_LT(controller.GetPitchDegrees(), initialPitch);
EXPECT_TRUE(NearlyEqual(
controller.GetFocalPoint(),
controller.GetPosition() + controller.GetForward() * controller.GetDistance(),
@@ -69,6 +71,7 @@ TEST(SceneViewportCameraController_Test, OrbitInputRotatesAroundFocalPointAndKee
const Vector3 initialPosition = controller.GetPosition();
const Vector3 initialFocus = controller.GetFocalPoint();
const float initialDistance = controller.GetDistance();
const float initialPitch = controller.GetPitchDegrees();
SceneViewportCameraInputState input = {};
input.viewportHeight = 720.0f;
@@ -78,6 +81,7 @@ TEST(SceneViewportCameraController_Test, OrbitInputRotatesAroundFocalPointAndKee
EXPECT_FALSE(NearlyEqual(controller.GetPosition(), initialPosition));
EXPECT_TRUE(NearlyEqual(controller.GetFocalPoint(), initialFocus));
EXPECT_LT(controller.GetPitchDegrees(), initialPitch);
EXPECT_NEAR((controller.GetFocalPoint() - controller.GetPosition()).Magnitude(), initialDistance, 1e-3f);
}
@@ -105,6 +109,26 @@ TEST(SceneViewportCameraController_Test, PanAndZoomUpdateCameraStateConsistently
1e-3f));
}
TEST(SceneViewportCameraController_Test, FlyInputMovesCameraAndFocalPointTogether) {
SceneViewportCameraController controller;
controller.Reset();
const Vector3 initialPosition = controller.GetPosition();
const Vector3 initialFocus = controller.GetFocalPoint();
const Vector3 initialOffset = initialFocus - initialPosition;
SceneViewportCameraInputState input = {};
input.viewportHeight = 720.0f;
input.deltaTime = 0.5f;
input.moveForward = 1.0f;
input.moveRight = 1.0f;
controller.ApplyInput(input);
EXPECT_FALSE(NearlyEqual(controller.GetPosition(), initialPosition));
EXPECT_FALSE(NearlyEqual(controller.GetFocalPoint(), initialFocus));
EXPECT_TRUE(NearlyEqual(controller.GetFocalPoint() - controller.GetPosition(), initialOffset, 1e-3f));
}
TEST(SceneViewportCameraController_Test, FocusMovesPivotWithoutChangingDistance) {
SceneViewportCameraController controller;
controller.Reset();