Muto 0.0.1
Cross-Platform Application Template
GitHub Repo | Muto Updates | Muto's Author
Loading...
Searching...
No Matches
Muto::EditorCamera Class Reference

#include <EditorCamera.h>

Inheritance diagram for Muto::EditorCamera:
Muto::Camera

Public Member Functions

 EditorCamera ()
 
 EditorCamera (float fov, float aspectRation, float nearClip, float farClip)
 
float GetDistance () const
 
glm::vec3 GetForwardDirection () const
 
glm::quat GetOrientation () const
 
float GetPitch () const
 
const glm::vec3 & GetPosition () const
 
glm::vec3 GetRightDirection () const
 
glm::vec3 GetUpDirection () const
 
const glm::mat4 & GetViewMatrix () const
 
glm::mat4 GetViewProjection () const
 
float GetYaw () const
 
void OnEvent (Event &e)
 
void OnUpdate (Timestep ts)
 
void SetDistance (float distance)
 
void SetPitch (float pitch)
 
void SetPosition (const glm::vec3 &position)
 
void SetViewportSize (float width, float height)
 
void SetYaw (float yaw)
 
- Public Member Functions inherited from Muto::Camera
 Camera ()=default
 
 Camera (const glm::mat4 &projection)
 
const glm::mat4 & GetProjection () const
 
 ~Camera ()=default
 

Private Member Functions

glm::vec3 CalculatePosition () const
 
void MousePan (const glm::vec2 &delta)
 
void MouseRotate (const glm::vec2 &delta)
 
void MouseZoom (float delta)
 
bool OnMouseScroll (MouseScrolledEvent &e)
 
std::pair< float, float > PanSpeed () const
 
float RotationSpeed () const
 
void UpdateProjection ()
 
void UpdateView ()
 
float ZoomSpeed () const
 

Private Attributes

float m_AspectRatio = 1.778f
 
float m_Distance = 10.0f
 
float m_FarClip = 1000.0f
 
glm::vec3 m_FocalPoint = glm::vec3(1.0f)
 
float m_FOV = 45.0f
 
glm::vec2 m_InitialMousePosition = { 0.0f, 0.0f }
 
float m_NearClip = 0.1f
 
float m_Pitch = 0.0f
 
glm::vec3 m_Position = { 0.0f, 0.0f, 0.0f }
 
glm::mat4 m_ViewMatrix
 
float m_ViewportHeight = 720
 
float m_ViewportWidth = 1280
 
float m_Yaw = 0.0f
 

Additional Inherited Members

- Protected Attributes inherited from Muto::Camera
glm::mat4 m_Projection = glm::mat4(1.0f)
 

Constructor & Destructor Documentation

◆ EditorCamera() [1/2]

Muto::EditorCamera::EditorCamera ( )
13 {
14 }

◆ EditorCamera() [2/2]

Muto::EditorCamera::EditorCamera ( float  fov,
float  aspectRation,
float  nearClip,
float  farClip 
)
17 {
18 UpdateView();
19 }
Camera()=default
float m_AspectRatio
Definition EditorCamera.h:66
float m_FarClip
Definition EditorCamera.h:66
float m_FOV
Definition EditorCamera.h:66
void UpdateView()
Definition EditorCamera.cpp:77
float m_NearClip
Definition EditorCamera.h:66
constexpr Scope< T > CreateScope(Args &&... args)
Creates a Scope (unique_ptr) for the given type and constructor arguments.
Definition Defines_Macros.h:51

References EditorCamera(), m_AspectRatio, m_FarClip, m_FOV, m_NearClip, and UpdateView().

Referenced by EditorCamera().

Member Function Documentation

◆ CalculatePosition()

glm::vec3 Muto::EditorCamera::CalculatePosition ( ) const
private
120 {
122 }
glm::vec3 m_FocalPoint
Definition EditorCamera.h:70
float m_Distance
Definition EditorCamera.h:74
glm::vec3 GetForwardDirection() const
Definition EditorCamera.cpp:133

◆ GetDistance()

float Muto::EditorCamera::GetDistance ( ) const
inline
27{ return m_Distance; }

References m_Distance.

◆ GetForwardDirection()

glm::vec3 Muto::EditorCamera::GetForwardDirection ( ) const
133 {
134 return glm::rotate(GetOrientation(), glm::vec3(0.0f, 0.0f, -1.0f));
135 }
glm::quat GetOrientation() const
Definition EditorCamera.cpp:137

◆ GetOrientation()

glm::quat Muto::EditorCamera::GetOrientation ( ) const
137 {
138 return glm::quat(glm::vec3(-m_Pitch, -m_Yaw, 0.0f));
139 }
float m_Pitch
Definition EditorCamera.h:75
float m_Yaw
Definition EditorCamera.h:75

◆ GetPitch()

float Muto::EditorCamera::GetPitch ( ) const
inline
43{ return m_Pitch; }

References m_Pitch.

◆ GetPosition()

const glm::vec3 & Muto::EditorCamera::GetPosition ( ) const
inline
40{ return m_Position; }
glm::vec3 m_Position
Definition EditorCamera.h:69

◆ GetRightDirection()

glm::vec3 Muto::EditorCamera::GetRightDirection ( ) const
129 {
130 return glm::rotate(GetOrientation(), glm::vec3(1.0f, 0.0f, 0.0f));
131 }

◆ GetUpDirection()

glm::vec3 Muto::EditorCamera::GetUpDirection ( ) const
124 {
125
126 return glm::rotate(GetOrientation(), glm::vec3(0.0f, 1.0f, 0.0f));
127 }

◆ GetViewMatrix()

const glm::mat4 & Muto::EditorCamera::GetViewMatrix ( ) const
inline
32{ return m_ViewMatrix; }
glm::mat4 m_ViewMatrix
Definition EditorCamera.h:68

◆ GetViewProjection()

glm::mat4 Muto::EditorCamera::GetViewProjection ( ) const
inline
33{ return m_Projection * m_ViewMatrix; }
glm::mat4 m_Projection
Definition Camera.h:25

◆ GetYaw()

float Muto::EditorCamera::GetYaw ( ) const
inline
46{ return m_Yaw; }

References m_Yaw.

◆ MousePan()

void Muto::EditorCamera::MousePan ( const glm::vec2 &  delta)
private
96 {
97 auto [xSpeed, ySpeed] = PanSpeed();
100 }
glm::vec3 GetRightDirection() const
Definition EditorCamera.cpp:129
glm::vec3 GetUpDirection() const
Definition EditorCamera.cpp:124
std::pair< float, float > PanSpeed() const
Definition EditorCamera.cpp:21

◆ MouseRotate()

void Muto::EditorCamera::MouseRotate ( const glm::vec2 &  delta)
private
103 {
104 float yawSign = GetUpDirection().y < 0 ? -1.0f : 1.0f;
105 m_Yaw += yawSign * delta.x * RotationSpeed();
106 m_Pitch += delta.y * RotationSpeed();
107 }
float RotationSpeed() const
Definition EditorCamera.cpp:32

References m_Pitch, m_Yaw, and RotationSpeed().

◆ MouseZoom()

void Muto::EditorCamera::MouseZoom ( float  delta)
private
110 {
112 if (m_Distance < 1.0f)
113 {
115 m_Distance = 1.0f;
116 }
117 }
float ZoomSpeed() const
Definition EditorCamera.cpp:37

References m_Distance, and ZoomSpeed().

Referenced by OnMouseScroll(), and OnUpdate().

◆ OnEvent()

void Muto::EditorCamera::OnEvent ( Event &  e)
66 {
67 EventDispatcher dispatcher(e);
68 dispatcher.Dispatch<MouseScrolledEvent>(MU_BIND_EVENT_FN(EditorCamera::OnMouseScroll));
69 }
#define MU_BIND_EVENT_FN(fn)
Binds a member function as an event handler.
Definition Defines_Macros.h:17
bool OnMouseScroll(MouseScrolledEvent &e)
Definition EditorCamera.cpp:87

References Muto::EventDispatcher::EventDispatcher(), and OnMouseScroll().

◆ OnMouseScroll()

bool Muto::EditorCamera::OnMouseScroll ( MouseScrolledEvent &  e)
private
88 {
89 float delta = e.GetYOffset() * 0.1f;
91 UpdateView();
92 return false;
93 }
void MouseZoom(float delta)
Definition EditorCamera.cpp:109

References Muto::MouseScrolledEvent::GetYOffset(), MouseZoom(), and UpdateView().

Referenced by OnEvent().

◆ OnUpdate()

void Muto::EditorCamera::OnUpdate ( Timestep  ts)
47 {
49 {
50 const glm::vec2& mouse{ Input::GetMouseX(), Input::GetMouseY() };
51 glm::vec2 delta = (mouse - m_InitialMousePosition) * 0.003f;
53
59 MouseZoom(-delta.y);
60 }
61
62 UpdateView();
63 }
void MouseRotate(const glm::vec2 &delta)
Definition EditorCamera.cpp:102
void MousePan(const glm::vec2 &delta)
Definition EditorCamera.cpp:95
glm::vec2 m_InitialMousePosition
Definition EditorCamera.h:72
static float GetMouseY()
Gets the current Y position of the mouse cursor.
Definition WindowsInput.cpp:36
static bool IsKeyPressed(int keycode)
Checks if the specified key is currently pressed.
Definition WindowsInput.cpp:9
static bool IsMouseButtonPressed(int button)
Checks if the specified mouse button is currently pressed.
Definition WindowsInput.cpp:16
static float GetMouseX()
Gets the current X position of the mouse cursor.
Definition WindowsInput.cpp:32
@ LeftAlt
Definition KeyCodes.h:144
@ MBC_ButtonRight
Definition MouseButtonCodes.h:30
@ MBC_ButtonMiddle
Definition MouseButtonCodes.h:31
@ MBC_ButtonLeft
Definition MouseButtonCodes.h:29

References Muto::Input::IsKeyPressed(), Muto::Input::IsMouseButtonPressed(), Muto::Key::LeftAlt, Muto::Mouse::MBC_ButtonLeft, Muto::Mouse::MBC_ButtonMiddle, Muto::Mouse::MBC_ButtonRight, MouseZoom(), and UpdateView().

◆ PanSpeed()

std::pair< float, float > Muto::EditorCamera::PanSpeed ( ) const
private
22 {
23 float x = std::min(m_ViewportWidth / 1000.0f, 2.4f); // max = 2.4f
24 float xFactor = 0.0366f * (x * x) - 0.1778f * x + 0.3021f;
25
26 float y = std::min(m_ViewportHeight / 1000.0f, 2.4f); // max = 2.4f
27 float yFactor = 0.0366f * (y * y) - 0.1778f * y + 0.3021f;
28
29 return { xFactor, yFactor };
30 }
float m_ViewportWidth
Definition EditorCamera.h:77
float m_ViewportHeight
Definition EditorCamera.h:77

References m_ViewportHeight, and m_ViewportWidth.

◆ RotationSpeed()

float Muto::EditorCamera::RotationSpeed ( ) const
private
33 {
34 return 0.8f;
35 }

Referenced by MouseRotate().

◆ SetDistance()

void Muto::EditorCamera::SetDistance ( float  distance)
inline

References m_Distance.

◆ SetPitch()

void Muto::EditorCamera::SetPitch ( float  pitch)
inline
44{ m_Pitch = pitch; }

References m_Pitch.

◆ SetPosition()

void Muto::EditorCamera::SetPosition ( const glm::vec3 &  position)

◆ SetViewportSize()

void Muto::EditorCamera::SetViewportSize ( float  width,
float  height 
)
inline
void UpdateProjection()
Definition EditorCamera.cpp:71

References m_ViewportHeight, m_ViewportWidth, and UpdateProjection().

◆ SetYaw()

void Muto::EditorCamera::SetYaw ( float  yaw)
inline
47{ m_Yaw = yaw; }

References m_Yaw.

◆ UpdateProjection()

void Muto::EditorCamera::UpdateProjection ( )
private
72 {
74 m_Projection = glm::perspective(glm::radians(m_FOV), m_AspectRatio, m_NearClip, m_FarClip);
75 }

References m_AspectRatio, m_ViewportHeight, and m_ViewportWidth.

Referenced by SetViewportSize().

◆ UpdateView()

void Muto::EditorCamera::UpdateView ( )
private
78 {
79 //m_Yaw = m_Pitch = 0.0f; // Lock the camera's rotation
81
82 glm::quat orientation = GetOrientation();
83 m_ViewMatrix = glm::translate(glm::mat4(1.0f), m_Position) * glm::toMat4(orientation);
84 m_ViewMatrix = glm::inverse(m_ViewMatrix);
85 }
glm::vec3 CalculatePosition() const
Definition EditorCamera.cpp:119

Referenced by EditorCamera(), OnMouseScroll(), and OnUpdate().

◆ ZoomSpeed()

float Muto::EditorCamera::ZoomSpeed ( ) const
private
38 {
39 float distance = m_Distance * 0.2f;
40 distance = std::max(distance, 0.0f);
41 float speed = distance * distance;
42 speed = std::min(speed, 100.0f); // max speed = 100
43 return speed;
44 }

References m_Distance.

Referenced by MouseZoom().

Member Data Documentation

◆ m_AspectRatio

float Muto::EditorCamera::m_AspectRatio = 1.778f
private

Referenced by EditorCamera(), and UpdateProjection().

◆ m_Distance

float Muto::EditorCamera::m_Distance = 10.0f
private

◆ m_FarClip

float Muto::EditorCamera::m_FarClip = 1000.0f
private

Referenced by EditorCamera().

◆ m_FocalPoint

glm::vec3 Muto::EditorCamera::m_FocalPoint = glm::vec3(1.0f)
private

◆ m_FOV

float Muto::EditorCamera::m_FOV = 45.0f
private

Referenced by EditorCamera().

◆ m_InitialMousePosition

glm::vec2 Muto::EditorCamera::m_InitialMousePosition = { 0.0f, 0.0f }
private
72{ 0.0f, 0.0f };

◆ m_NearClip

float Muto::EditorCamera::m_NearClip = 0.1f
private

Referenced by EditorCamera().

◆ m_Pitch

float Muto::EditorCamera::m_Pitch = 0.0f
private

Referenced by GetPitch(), MouseRotate(), and SetPitch().

◆ m_Position

glm::vec3 Muto::EditorCamera::m_Position = { 0.0f, 0.0f, 0.0f }
private
69{ 0.0f, 0.0f, 0.0f };

◆ m_ViewMatrix

glm::mat4 Muto::EditorCamera::m_ViewMatrix
private

◆ m_ViewportHeight

float Muto::EditorCamera::m_ViewportHeight = 720
private

◆ m_ViewportWidth

float Muto::EditorCamera::m_ViewportWidth = 1280
private

◆ m_Yaw

float Muto::EditorCamera::m_Yaw = 0.0f
private

Referenced by GetYaw(), MouseRotate(), and SetYaw().


The documentation for this class was generated from the following files: