Vivid
Loading...
Searching...
No Matches
EditorCamera.cpp
1#include "EditorCamera.h"
2#include "common/maths/VectorHelper.h"
3
4EditorCamera::EditorCamera(float fov, float aspect, float near, float far)
5 : m_FOV(fov)
6 , m_AspectRatio(aspect)
7 , m_NearCip(near)
8 , m_FarClip(far)
9{
10 m_Position = Vivid::Maths::Vec3(0.0f, 0.0f, 0.0f);
11 m_ViewMatrix = glm::lookAt(m_Position.ToGLM(), m_Position.ToGLM() + m_Front.ToGLM(), m_Up.ToGLM());
12 m_ProjectionMatrix = glm::perspective(glm::radians(m_FOV), m_AspectRatio, m_NearCip, m_FarClip);
13}
14
15// Process mouse movement
16void EditorCamera::ProcessMouseMovement(float xOffset, float yOffset, bool constrainPitch)
17{
18 xOffset *= m_MouseSensitivity;
19 yOffset *= m_MouseSensitivity;
20
21 m_Yaw += xOffset;
22 m_Pitch += yOffset;
23
24 // Make sure that when pitch is out of bounds, screen doesn't get flipped
25 if (constrainPitch)
26 {
27 if (m_Pitch > 89.0f)
28 m_Pitch = 89.0f;
29 if (m_Pitch < -89.0f)
30 m_Pitch = -89.0f;
31 }
32
33 updateCameraVectors();
34 updateViewMatrix();
35}
36
37// Process mouse scroll
38void EditorCamera::ProcessMouseScroll(float scrollOffset)
39{
40 if (m_ZoomSensitivity >= 1.0f && m_ZoomSensitivity <= 45.0f)
41 m_ZoomSensitivity -= scrollOffset;
42 if (m_ZoomSensitivity <= 1.0f)
43 m_ZoomSensitivity = 1.0f;
44 if (m_ZoomSensitivity >= 45.0f)
45 m_ZoomSensitivity = 45.0f;
46
47 updateProjectionMatrix();
48}
49
50// Update camera vectors
51void EditorCamera::updateCameraVectors()
52{
53 // Calculate the new Front vector
55 front.x = sin(glm::radians(m_Yaw)) * cos(glm::radians(m_Pitch));
56 front.y = -sin(glm::radians(m_Pitch));
57 front.z = -cos(glm::radians(m_Yaw)) * cos(glm::radians(m_Pitch));
58 m_Front = Vivid::Maths::Normalize(front);
59 // Also re-calculate the Right and Up vector
60 // Normalize the vectors, because their length gets closer to 0 the more you look up or down which results in slower movement.
61 m_Right = Vivid::Maths::Normalize(Vivid::Maths::Cross(m_Front, Vivid::Maths::Vec3(0.0f, 1.0f, 0.0f)));
62 m_Up = Vivid::Maths::Normalize(Vivid::Maths::Cross(m_Right, m_Front));
63}
64
65void EditorCamera::updateProjectionMatrix()
66{
67 m_ProjectionMatrix = glm::perspective(glm::radians(m_FOV), m_AspectRatio, m_NearCip, m_FarClip);
68}
69
70// Updates view matrix based on camera position and orientation
71void EditorCamera::updateViewMatrix()
72{
73 m_ViewMatrix = glm::lookAt(m_Position.ToGLM(), m_Position.ToGLM() + m_Front.ToGLM(), m_Up.ToGLM());
74}
75
76void EditorCamera::SetPerspective(float fov, float aspect, float near, float far)
77{
78 m_FOV = fov;
79 m_AspectRatio = aspect;
80 m_NearCip = near;
81 m_FarClip = far;
82 updateProjectionMatrix();
83}
84
85void EditorCamera::SetViewportSize(int width, int height)
86{
87 m_AspectRatio = (float)width / (float)height;
88 m_ViewportWidth = width;
89 m_ViewportHeight = height;
90 updateProjectionMatrix();
91}
92
93void EditorCamera::MoveForward()
94{
95 m_Position += m_Front * m_MovementSpeed;
96 updateViewMatrix();
97}
98
99void EditorCamera::MoveBackward()
100{
101 m_Position -= m_Front * m_MovementSpeed;
102 updateViewMatrix();
103}
104
105void EditorCamera::MoveLeft()
106{
107 m_Position -= m_Right * m_MovementSpeed;
108 updateViewMatrix();
109}
110
111void EditorCamera::MoveRight()
112{
113 m_Position += m_Right * m_MovementSpeed;
114 updateViewMatrix();
115}
Contains a 3D vector.
Definition: Vec.h:51