diff options
| author | iwubcode <iwubcode@users.noreply.github.com> | 2021-04-24 22:59:35 -0500 |
|---|---|---|
| committer | iwubcode <iwubcode@users.noreply.github.com> | 2021-10-08 18:16:32 -0500 |
| commit | e70157474bd53c7ae40c85a921b589a79fbd7d7a (patch) | |
| tree | 0db3ea78844feba7079fb05980db4dfdb37e3efa /Source/Core/VideoCommon/FreeLookCamera.cpp | |
| parent | ff1cb5a1c08d5a4a2a0449b8b23a4977ccc20f8a (diff) | |
Core / VideoCommon: refactor FreeLookCamera to have the underlying controller handle all the logic (field-of-view, movement, etc)
Diffstat (limited to 'Source/Core/VideoCommon/FreeLookCamera.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/FreeLookCamera.cpp | 162 |
1 files changed, 72 insertions, 90 deletions
diff --git a/Source/Core/VideoCommon/FreeLookCamera.cpp b/Source/Core/VideoCommon/FreeLookCamera.cpp index 9c2987717b..3eca6e6270 100644 --- a/Source/Core/VideoCommon/FreeLookCamera.cpp +++ b/Source/Core/VideoCommon/FreeLookCamera.cpp @@ -35,12 +35,12 @@ std::string to_string(FreeLook::ControlType type) return ""; } -class SixAxisController final : public CameraController +class SixAxisController final : public CameraControllerInput { public: SixAxisController() = default; - Common::Matrix44 GetView() override { return m_mat; } + Common::Matrix44 GetView() const override { return m_mat; } void MoveVertical(float amt) override { @@ -64,18 +64,26 @@ public: m_mat = Common::Matrix44::FromQuaternion(quat) * m_mat; } - void Reset() override { m_mat = Common::Matrix44::Identity(); } + void Reset() override + { + CameraControllerInput::Reset(); + m_mat = Common::Matrix44::Identity(); + } - void DoState(PointerWrap& p) override { p.Do(m_mat); } + void DoState(PointerWrap& p) override + { + CameraControllerInput::DoState(p); + p.Do(m_mat); + } private: Common::Matrix44 m_mat = Common::Matrix44::Identity(); }; -class FPSController final : public CameraController +class FPSController final : public CameraControllerInput { public: - Common::Matrix44 GetView() override + Common::Matrix44 GetView() const override { return Common::Matrix44::FromQuaternion(m_rotate_quat) * Common::Matrix44::Translate(m_position); @@ -118,6 +126,7 @@ public: void Reset() override { + CameraControllerInput::Reset(); m_position = Common::Vec3{}; m_rotation = Common::Vec3{}; m_rotate_quat = Common::Quaternion::Identity(); @@ -125,6 +134,7 @@ public: void DoState(PointerWrap& p) override { + CameraControllerInput::DoState(p); p.Do(m_rotation); p.Do(m_rotate_quat); p.Do(m_position); @@ -136,10 +146,10 @@ private: Common::Vec3 m_position = Common::Vec3{}; }; -class OrbitalController final : public CameraController +class OrbitalController final : public CameraControllerInput { public: - Common::Matrix44 GetView() override + Common::Matrix44 GetView() const override { return Common::Matrix44::Translate(Common::Vec3{0, 0, -m_distance}) * Common::Matrix44::FromQuaternion(m_rotate_quat); @@ -174,6 +184,7 @@ public: void Reset() override { + CameraControllerInput::Reset(); m_rotation = Common::Vec3{}; m_rotate_quat = Common::Quaternion::Identity(); m_distance = 0; @@ -181,6 +192,7 @@ public: void DoState(PointerWrap& p) override { + CameraControllerInput::DoState(p); p.Do(m_rotation); p.Do(m_rotate_quat); p.Do(m_distance); @@ -193,123 +205,101 @@ private: }; } // namespace -FreeLookCamera::FreeLookCamera() -{ - SetControlType(FreeLook::ControlType::SixAxis); -} - -void FreeLookCamera::SetControlType(FreeLook::ControlType type) +Common::Vec2 CameraControllerInput::GetFieldOfView() const { - if (m_current_type && *m_current_type == type) - { - return; - } - - if (type == FreeLook::ControlType::SixAxis) - { - m_camera_controller = std::make_unique<SixAxisController>(); - } - else if (type == FreeLook::ControlType::Orbital) - { - m_camera_controller = std::make_unique<OrbitalController>(); - } - else if (type == FreeLook::ControlType::FPS) - { - m_camera_controller = std::make_unique<FPSController>(); - } - - m_current_type = type; + return Common::Vec2{m_fov_x, m_fov_y}; } -Common::Matrix44 FreeLookCamera::GetView() +void CameraControllerInput::DoState(PointerWrap& p) { - return m_camera_controller->GetView(); + p.Do(m_speed); + p.Do(m_fov_x); + p.Do(m_fov_y); } -Common::Vec2 FreeLookCamera::GetFieldOfView() const +void CameraControllerInput::IncreaseFovX(float fov) { - return Common::Vec2{m_fov_x, m_fov_y}; + m_fov_x += fov; + m_fov_x = std::clamp(m_fov_x, m_min_fov_multiplier, m_fov_x); } -void FreeLookCamera::MoveVertical(float amt) +void CameraControllerInput::IncreaseFovY(float fov) { - m_camera_controller->MoveVertical(amt); - m_dirty = true; + m_fov_y += fov; + m_fov_y = std::clamp(m_fov_y, m_min_fov_multiplier, m_fov_y); } -void FreeLookCamera::MoveHorizontal(float amt) +float CameraControllerInput::GetFovStepSize() const { - m_camera_controller->MoveHorizontal(amt); - m_dirty = true; + return 1.5f; } -void FreeLookCamera::MoveForward(float amt) +void CameraControllerInput::Reset() { - m_camera_controller->MoveForward(amt); + m_fov_x = 1.0f; + m_fov_y = 1.0f; m_dirty = true; } -void FreeLookCamera::Rotate(const Common::Vec3& amt) +void CameraControllerInput::ModifySpeed(float amt) { - m_camera_controller->Rotate(amt); - m_dirty = true; + m_speed += amt; + m_speed = std::clamp(m_speed, 0.0f, m_speed); } -void FreeLookCamera::Rotate(const Common::Quaternion& amt) +void CameraControllerInput::ResetSpeed() { - m_camera_controller->Rotate(amt); - m_dirty = true; + m_speed = 60.0f; } -void FreeLookCamera::IncreaseFovX(float fov) +float CameraControllerInput::GetSpeed() const { - m_fov_x += fov; - m_fov_x = std::clamp(m_fov_x, m_min_fov_multiplier, m_fov_x); + return m_speed; } -void FreeLookCamera::IncreaseFovY(float fov) +FreeLookCamera::FreeLookCamera() { - m_fov_y += fov; - m_fov_y = std::clamp(m_fov_y, m_min_fov_multiplier, m_fov_y); + SetControlType(FreeLook::ControlType::SixAxis); } -float FreeLookCamera::GetFovStepSize() const +void FreeLookCamera::SetControlType(FreeLook::ControlType type) { - return 1.5f; -} + if (m_current_type && *m_current_type == type) + { + return; + } -void FreeLookCamera::Reset() -{ - m_camera_controller->Reset(); - m_fov_x = 1.0f; - m_fov_y = 1.0f; - m_dirty = true; -} + if (type == FreeLook::ControlType::SixAxis) + { + m_camera_controller = std::make_unique<SixAxisController>(); + } + else if (type == FreeLook::ControlType::Orbital) + { + m_camera_controller = std::make_unique<OrbitalController>(); + } + else if (type == FreeLook::ControlType::FPS) + { + m_camera_controller = std::make_unique<FPSController>(); + } -void FreeLookCamera::ModifySpeed(float amt) -{ - m_speed += amt; - m_speed = std::clamp(m_speed, 0.0f, m_speed); + m_current_type = type; } -void FreeLookCamera::ResetSpeed() +Common::Matrix44 FreeLookCamera::GetView() const { - m_speed = 60.0f; + return m_camera_controller->GetView(); } -float FreeLookCamera::GetSpeed() const +Common::Vec2 FreeLookCamera::GetFieldOfView() const { - return m_speed; + return m_camera_controller->GetFieldOfView(); } void FreeLookCamera::DoState(PointerWrap& p) { if (p.mode == PointerWrap::MODE_WRITE || p.mode == PointerWrap::MODE_MEASURE) { - p.Do(m_speed); p.Do(m_current_type); - p.Do(m_fov_x); - p.Do(m_fov_y); if (m_camera_controller) { m_camera_controller->DoState(p); @@ -318,10 +308,7 @@ void FreeLookCamera::DoState(PointerWrap& p) else { const auto old_type = m_current_type; - p.Do(m_speed); p.Do(m_current_type); - p.Do(m_fov_x); - p.Do(m_fov_y); if (old_type == m_current_type) { m_camera_controller->DoState(p); @@ -340,17 +327,12 @@ void FreeLookCamera::DoState(PointerWrap& p) } } -bool FreeLookCamera::IsDirty() const -{ - return m_dirty; -} - -void FreeLookCamera::SetClean() +bool FreeLookCamera::IsActive() const { - m_dirty = false; + return FreeLook::GetActiveConfig().enabled; } -bool FreeLookCamera::IsActive() const +CameraController* FreeLookCamera::GetController() const { - return FreeLook::GetActiveConfig().enabled; + return m_camera_controller.get(); } |
