Shkyera Engine
Easy to use, game engine for Python
Loading...
Searching...
No Matches
CameraMovementSystem.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4
5#include <Common/Profiler.hpp>
8#include <ECS/Registry.hpp>
12
13#include <GLFW/glfw3.h>
14
15namespace shkyera {
16
17template <typename MainCameraTag>
19 public:
20 CameraMovementSystem(std::shared_ptr<Registry> registry);
21 void update();
22
23 private:
24 constexpr static float MOVEMENT_SPEED = 0.6;
25 constexpr static float MOUSE_SENSITIVITY = 0.2;
26
29};
30
31template <typename MainCameraTag>
35
36template <typename MainCameraTag>
38 SHKYERA_PROFILE("CameraMovementSystem::update");
39
41
42 if (inputManager.isMouseButtonPressed(GLFW_MOUSE_BUTTON_RIGHT)) {
44 _cameraControl = true;
45 }
46 }
47
48 if (inputManager.isMouseButtonReleased(GLFW_MOUSE_BUTTON_RIGHT)) {
49 _cameraControl = false;
50 }
51
52 if (inputManager.isKeyDown(GLFW_KEY_W) && _cameraControl) {
53 auto& cameraTransform = RegistryViewer::write<TransformComponent>(*RegistryViewer::getEntity<MainCameraTag>());
54
55 glm::vec3 forward;
56 float yaw = cameraTransform.getOrientation().y;
57 float pitch = cameraTransform.getOrientation().x;
58
59 forward.x = cos(yaw) * cos(pitch);
60 forward.y = sin(pitch);
61 forward.z = sin(yaw) * cos(pitch);
62 forward = glm::normalize(forward);
63
64 cameraTransform.setPosition(cameraTransform.getPosition() + forward * MOVEMENT_SPEED);
65 }
66
67 if (inputManager.isKeyDown(GLFW_KEY_S) && _cameraControl) {
68 auto& cameraTransform = RegistryViewer::write<TransformComponent>(*RegistryViewer::getEntity<MainCameraTag>());
69
70 glm::vec3 backward;
71 float yaw = cameraTransform.getOrientation().y;
72 float pitch = cameraTransform.getOrientation().x;
73
74 backward.x = -cos(yaw) * cos(pitch);
75 backward.y = -sin(pitch);
76 backward.z = -sin(yaw) * cos(pitch);
77 backward = glm::normalize(backward);
78
79 cameraTransform.setPosition(cameraTransform.getPosition() + backward * MOVEMENT_SPEED);
80 }
81
82 if (inputManager.isKeyDown(GLFW_KEY_A) && _cameraControl) {
83 auto& cameraTransform = RegistryViewer::write<TransformComponent>(*RegistryViewer::getEntity<MainCameraTag>());
84
85 glm::vec3 left;
86 float yaw = cameraTransform.getOrientation().y;
87
88 left.x = -sin(yaw);
89 left.y = 0.0f;
90 left.z = cos(yaw);
91 left = glm::normalize(left);
92
93 cameraTransform.setPosition(cameraTransform.getPosition() + left * MOVEMENT_SPEED);
94 }
95
96 if (inputManager.isKeyDown(GLFW_KEY_D) && _cameraControl) {
97 auto& cameraTransform = RegistryViewer::write<TransformComponent>(*RegistryViewer::getEntity<MainCameraTag>());
98
99 glm::vec3 right;
100 float yaw = cameraTransform.getOrientation().y;
101
102 right.x = sin(yaw);
103 right.y = 0.0f;
104 right.z = -cos(yaw);
105 right = glm::normalize(right);
106
107 cameraTransform.setPosition(cameraTransform.getPosition() + right * MOVEMENT_SPEED);
108 }
109
110 if (inputManager.isKeyDown(GLFW_KEY_Q) && _cameraControl) {
111 auto& cameraTransform = RegistryViewer::write<TransformComponent>(*RegistryViewer::getEntity<MainCameraTag>());
112
113 glm::vec3 down = glm::vec3(0.0f, -1.0f, 0.0f); // Down direction in world space
114 cameraTransform.setPosition(cameraTransform.getPosition() + down * MOVEMENT_SPEED);
115 }
116
117 if (inputManager.isKeyDown(GLFW_KEY_E) && _cameraControl) {
118 auto& cameraTransform = RegistryViewer::write<TransformComponent>(*RegistryViewer::getEntity<MainCameraTag>());
119
120 glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f); // Up direction in world space
121 cameraTransform.setPosition(cameraTransform.getPosition() + up * MOVEMENT_SPEED);
122 }
123
125 if (_cameraControl) {
126 auto& cameraTransform = RegistryViewer::write<TransformComponent>(*RegistryViewer::getEntity<MainCameraTag>());
127
128 float xOffset = static_cast<float>(mousePosition.x - _previousMousePosition.x) * MOUSE_SENSITIVITY;
129 float yOffset = static_cast<float>(_previousMousePosition.y - mousePosition.y) * MOUSE_SENSITIVITY;
130
131 glm::vec3 orientation = cameraTransform.getOrientation();
132 orientation.y -= glm::radians(xOffset);
133 orientation.x += glm::radians(yOffset);
134
135 if (orientation.x > glm::radians(89.0f))
136 orientation.x = glm::radians(89.0f);
137 if (orientation.x < glm::radians(-89.0f))
138 orientation.x = glm::radians(-89.0f);
139
140 cameraTransform.getOrientation() = orientation;
141 }
142 _previousMousePosition = mousePosition;
143}
144
145} // namespace shkyera
#define SHKYERA_PROFILE(name)
Definition Profiler.hpp:45
Definition CameraMovementSystem.hpp:18
static constexpr float MOUSE_SENSITIVITY
Definition CameraMovementSystem.hpp:25
void update()
Definition CameraMovementSystem.hpp:37
CameraMovementSystem(std::shared_ptr< Registry > registry)
Definition CameraMovementSystem.hpp:32
glm::vec2 _previousMousePosition
Definition CameraMovementSystem.hpp:28
bool _cameraControl
Definition CameraMovementSystem.hpp:27
static constexpr float MOVEMENT_SPEED
Definition CameraMovementSystem.hpp:24
static InputManager & getInstance()
Definition InputManager.cpp:7
Definition RegistryViewer.hpp:51
Definition TransformComponent.hpp:21
Definition Asset.hpp:6
Definition Mesh.cpp:16
Definition Clock.hpp:9
Definition RegistryViewer.hpp:14
Definition RegistryViewer.hpp:24