From 2364c05055a04e6dfd9b87aad0535e6221da5e52 Mon Sep 17 00:00:00 2001 From: GeorgH93 Date: Wed, 25 Aug 2021 19:11:19 +0200 Subject: [PATCH] Refactor CameraController logic --- .../Controller/ArCameraController.cpp | 21 +++++----- .../Controller/ArCameraController.hpp | 11 +----- .../Controller/CameraController.hpp | 39 +++++++++++++++++++ .../Controller/FreeCamCameraController.cpp | 4 +- .../Controller/FreeCamCameraController.hpp | 13 ++----- 5 files changed, 56 insertions(+), 32 deletions(-) create mode 100644 openVulkanoCpp/Controller/CameraController.hpp diff --git a/openVulkanoCpp/Controller/ArCameraController.cpp b/openVulkanoCpp/Controller/ArCameraController.cpp index f1e6db3..ef56f47 100644 --- a/openVulkanoCpp/Controller/ArCameraController.cpp +++ b/openVulkanoCpp/Controller/ArCameraController.cpp @@ -11,11 +11,10 @@ namespace openVulkanoCpp { - ArCameraController::ArCameraController() : m_camera(nullptr) - {} + ArCameraController::ArCameraController() = default; ArCameraController::ArCameraController(Scene::Camera* camera, const std::shared_ptr& session, const Math::Matrix4f& registration) - : m_arSession(session), m_camera(camera), m_registration(registration), m_updated(false) + : CameraController(camera), m_arSession(session), m_registration(registration), m_updated(false) { Init(); } @@ -49,14 +48,14 @@ namespace openVulkanoCpp else { Logger::AR->critical("Failed to create AR session for ArCameraController! Error: " + createResult.statusMessage); - m_camera = nullptr; + SetCamera(nullptr); return; } } else { Logger::AR->critical("No native AR implementation available! Can't start ArCameraController."); - m_camera = nullptr; + SetCamera(nullptr); return; } } @@ -67,28 +66,28 @@ namespace openVulkanoCpp void ArCameraController::Init(Scene::Camera* camera, const std::shared_ptr& session, const Math::Matrix4f& registration) { - if (m_camera) return; + if (GetCamera()) return; + CameraController::Init(camera); m_arSession = session; - m_camera = camera; m_registration = registration; Init(); } void ArCameraController::Tick() { - if (!m_camera || !m_updated) return; + if (!GetCamera() || !m_updated) return; std::unique_lock lock(m_mutex); Math::Matrix4f mat = m_registration * Math::Utils::inverse(m_matrixToUpdate); - m_camera->SetMatrix(mat); + GetCamera()->SetMatrix(mat); m_updated = false; } void ArCameraController::Close() { - if (!m_camera) return; + if (!GetCamera()) return; m_arSession->OnNewCameraViewMatrix -= EventHandler(this, &ArCameraController::UpdateCameraTransformation); - m_camera = nullptr; + SetCamera(nullptr); m_arSession = nullptr; } diff --git a/openVulkanoCpp/Controller/ArCameraController.hpp b/openVulkanoCpp/Controller/ArCameraController.hpp index 896fcd0..9436324 100644 --- a/openVulkanoCpp/Controller/ArCameraController.hpp +++ b/openVulkanoCpp/Controller/ArCameraController.hpp @@ -6,8 +6,7 @@ #pragma once -#include "Base/ITickable.hpp" -#include "Base/ICloseable.hpp" +#include "CameraController.hpp" #include "Math/Math.hpp" #include #include @@ -20,15 +19,9 @@ namespace openVulkanoCpp class ArSession; } - namespace Scene - { - class Camera; - } - - class ArCameraController final : public ITickable, public ICloseable + class ArCameraController final : public CameraController { std::shared_ptr m_arSession; - Scene::Camera* m_camera; Math::Matrix4f m_registration; Math::Matrix4f m_matrixToUpdate; std::mutex m_mutex; diff --git a/openVulkanoCpp/Controller/CameraController.hpp b/openVulkanoCpp/Controller/CameraController.hpp new file mode 100644 index 0000000..652e896 --- /dev/null +++ b/openVulkanoCpp/Controller/CameraController.hpp @@ -0,0 +1,39 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include "Base/ITickable.hpp" +#include "Base/ICloseable.hpp" + +namespace openVulkanoCpp +{ + namespace Scene + { + class Camera; + } + + class CameraController : public ITickable, ICloseable + { + Scene::Camera* m_camera; + + protected: + CameraController(Scene::Camera* camera = nullptr) + : m_camera(camera) + {} + + public: + ~CameraController() override = default; + + virtual void Init(Scene::Camera* camera) { m_camera = camera; } + + void Close() override { m_camera = nullptr; } + + void SetCamera(Scene::Camera* camera) { m_camera = camera; } + + Scene::Camera* GetCamera() { return m_camera; } + }; +} diff --git a/openVulkanoCpp/Controller/FreeCamCameraController.cpp b/openVulkanoCpp/Controller/FreeCamCameraController.cpp index e6c3627..7ec09e4 100644 --- a/openVulkanoCpp/Controller/FreeCamCameraController.cpp +++ b/openVulkanoCpp/Controller/FreeCamCameraController.cpp @@ -12,7 +12,7 @@ namespace openVulkanoCpp { - FreeCamCameraController::FreeCamCameraController(Scene::Camera* camera) : m_camera(camera) + FreeCamCameraController::FreeCamCameraController(Scene::Camera* camera) : CameraController(camera) { auto input = Input::InputManager::GetInstance(); m_actionForward = input->GetAction("forward"); @@ -48,7 +48,7 @@ namespace openVulkanoCpp m_position += rot * vec; Math::Matrix4f camTransformation = Math::Utils::toMat4(rot); camTransformation[3] = Math::Vector4f(m_position, 1); - m_camera->SetMatrix(camTransformation); + GetCamera()->SetMatrix(camTransformation); } void FreeCamCameraController::SetDefaultKeybindings() diff --git a/openVulkanoCpp/Controller/FreeCamCameraController.hpp b/openVulkanoCpp/Controller/FreeCamCameraController.hpp index b349d99..81c5b39 100644 --- a/openVulkanoCpp/Controller/FreeCamCameraController.hpp +++ b/openVulkanoCpp/Controller/FreeCamCameraController.hpp @@ -6,8 +6,7 @@ #pragma once -#include "Base/ITickable.hpp" -#include "Base/ICloseable.hpp" +#include "CameraController.hpp" #include "Math/Math.hpp" namespace openVulkanoCpp @@ -22,10 +21,8 @@ namespace openVulkanoCpp class InputAction; } - class FreeCamCameraController final : public ITickable, public ICloseable + class FreeCamCameraController final : public CameraController { - Scene::Camera* m_camera = nullptr; - float m_yaw = 0, m_pitch = 0, m_boostFactor = 2; Math::Vector3f_SIMD m_position = { 0, 0, 0 }; @@ -41,9 +38,7 @@ namespace openVulkanoCpp ~FreeCamCameraController() override = default; - void Init(Scene::Camera* camera) { m_camera = camera; ResetPose(); } - - void SetCamera(Scene::Camera* camera) { m_camera = camera; } + void Init(Scene::Camera* camera) override { CameraController::Init(camera); ResetPose(); } void ResetPose() { m_yaw = m_pitch = 0; m_position = { 0, 0, 0 }; } @@ -55,8 +50,6 @@ namespace openVulkanoCpp void Tick() override; - void Close() override { m_camera = nullptr; } - void SetDefaultKeybindings(); }; } \ No newline at end of file