From f9467f322fa7dedf6ba23fcfa7c6d87054ba3def Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Mon, 1 Jul 2024 14:01:59 +0200 Subject: [PATCH] Add basic map camera controller --- .../Controller/MapCameraController.cpp | 40 ++++++++++++++++++ .../Controller/MapCameraController.hpp | 42 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 openVulkanoCpp/Controller/MapCameraController.cpp create mode 100644 openVulkanoCpp/Controller/MapCameraController.hpp diff --git a/openVulkanoCpp/Controller/MapCameraController.cpp b/openVulkanoCpp/Controller/MapCameraController.cpp new file mode 100644 index 0000000..42150e3 --- /dev/null +++ b/openVulkanoCpp/Controller/MapCameraController.cpp @@ -0,0 +1,40 @@ +/* + * 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/. + */ + +#include "MapCameraController.hpp" +#include "Input/InputManager.hpp" +#include "Scene/Camera.hpp" + +namespace OpenVulkano +{ + MapCameraController::MapCameraController(Scene::Camera* camera) : CameraController(camera) + { + auto input = Input::InputManager::GetInstance(); + m_actionUp = input->GetAction("map_up"); + m_actionSide = input->GetAction("map_side"); + } + + void MapCameraController::Tick() + { + if (!GetCamera()) return; + auto input = Input::InputManager::GetInstance(); + Math::Vector3f_SIMD vec = m_dirUp * input->GetAxis(m_actionUp) + m_dirSide * input->GetAxis(m_actionSide); + vec /= GetCamera()->GetZoom(); + vec /= GetCamera()->GetContentScaleFactor(); + + GetCamera()->SetMatrix(Math::Utils::translate(vec) * GetCamera()->GetMatrix()); + } + + void MapCameraController::SetDefaultKeybindings() + { + m_actionUp->BindKey(Input::InputKey::Controller::AXIS_LEFT_Y); + m_actionUp->BindKey(Input::InputKey::Touch::AXIS_PAN_Y); + m_actionUp->BindKey(Input::InputKey::Mouse::AXIS_Y); + m_actionSide->BindKey(Input::InputKey::Controller::AXIS_LEFT_X); + m_actionSide->BindKey(Input::InputKey::Touch::AXIS_PAN_X); + m_actionSide->BindKey(Input::InputKey::Mouse::AXIS_X); + } +} diff --git a/openVulkanoCpp/Controller/MapCameraController.hpp b/openVulkanoCpp/Controller/MapCameraController.hpp new file mode 100644 index 0000000..803f18a --- /dev/null +++ b/openVulkanoCpp/Controller/MapCameraController.hpp @@ -0,0 +1,42 @@ +/* + * 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 "CameraController.hpp" +#include "Math/Math.hpp" + +namespace OpenVulkano +{ + namespace Input + { + class InputAction; + } + + class MapCameraController final : public CameraController + { + Input::InputAction* m_actionSide; + Input::InputAction* m_actionUp; + + Math::Vector3f_SIMD m_dirUp; + Math::Vector3f_SIMD m_dirSide; + + public: + MapCameraController(Scene::Camera* camera = nullptr); + + ~MapCameraController() override = default; + + void SetDir(const Math::Vector3f_SIMD& up, const Math::Vector3f_SIMD& side) + { + m_dirUp = up; + m_dirSide = side; + } + + void Tick() override; + + void SetDefaultKeybindings(); + }; +} \ No newline at end of file