LkEngine 0.1.2
 
Loading...
Searching...
No Matches
EditorCamera.h
1#pragma once
2
5#include "LkEngine/Core/Event/KeyEvent.h"
6#include "LkEngine/Core/Event/MouseEvent.h"
7#include "LkEngine/Core/Time/Timestep.h"
8#include "LkEngine/Core/Input/Keyboard.h"
9#include "LkEngine/Core/Input/Mouse.h"
10
12
14
15#include "LkEngine/Scene/SceneCamera.h"
16
17
18namespace LkEngine {
19
20 enum class EEditorCameraMode
21 {
22 None = 0,
23 Flycam,
24 Arcball
25 };
26 LK_ENUM_CLASS(EEditorCameraMode);
27
32 {
33 public:
34 LEditorCamera(const float DegFov, const float Width, const float Height,
35 const float NearP, const float FarP);
36 LEditorCamera() = delete;
37 ~LEditorCamera() = default;
38
39 LEditorCamera& operator=(const LSceneCamera& Other)
40 {
41 Origin = Other.GetOrigin();
42 FocalPoint = Other.GetFocalPoint();
43 Direction = Other.GetDirection();
44
45 Pitch = Other.GetPitch();
46 Yaw = Other.GetYaw();
47
48 Distance = 8.0f;
49 NormalSpeed = 0.0020f;
50 TravelSpeed = 1.0f;
51
52 return *this;
53 }
54
55 void Initialize();
56 void Tick(const float DeltaTime = 0.0f);
57 void UpdateCameraView();
58
59 virtual ECameraType GetType() const override { return ECameraType::Editor; }
60
61 FORCEINLINE void SetPerspective(const float InVerticalFovDeg, const float InNearClip = 0.1f, const float InFarClip = 1000.0f)
62 {
63 if ((ProjectionType != ECameraProjection::Perspective)
64 || (DegPerspectiveFov != InVerticalFovDeg)
65 || (PerspectiveNear != InNearClip)
66 || (PerspectiveFar != InFarClip))
67 {
68 ProjectionType = ECameraProjection::Perspective;
69 DegPerspectiveFov = InVerticalFovDeg;
70 PerspectiveNear = InNearClip;
71 PerspectiveFar = InFarClip;
72
73 OnCameraProjectionChanged.Broadcast(ECameraProjection::Perspective);
74 }
75 }
76
77 FORCEINLINE void SetOrthographic(const float InWidth, const float InHeight, const float InNearClip = -1.0f, const float InFarClip = 1.0f)
78 {
79 if ((ProjectionType != ECameraProjection::Perspective)
80 || (OrthographicNear != InNearClip)
81 || (OrthographicFar != InFarClip))
82 {
83 ProjectionType = ECameraProjection::Orthographic;
84 OrthographicNear = InNearClip;
85 OrthographicFar = InFarClip;
86
87 OnCameraProjectionChanged.Broadcast(ECameraProjection::Orthographic);
88 }
89 }
90
91 FORCEINLINE void SetPosition(const glm::vec3& InPosition)
92 {
93 Position = InPosition;
94 UpdateCameraView();
95 }
96
97 void SetViewportSize(const uint16_t InWidth, const uint16_t InHeight);
98
99 void MousePan(const glm::vec2& Delta);
100 void MouseRotate(const glm::vec2& Delta);
101 void MouseZoom(const float Delta);
102
103 float GetCameraSpeed() const;
104 std::pair<float, float> GetPanSpeed() const;
105 float GetZoomSpeed() const;
106
107 void SetPitchLocked(const bool Locked);
108 bool IsPitchLocked() const;
109 void SetYawLocked(const bool Locked);
110 bool IsYawLocked() const;
111
112 FORCEINLINE float GetDistance() const { return Distance; }
113 FORCEINLINE float GetNormalSpeed() const { return NormalSpeed; }
114 FORCEINLINE float GetTravelSpeed() const { return TravelSpeed; }
115 FORCEINLINE void SetDistance(const float InDistance) { Distance = InDistance; }
116 FORCEINLINE void SetNormalSpeed(const float InSpeed) { NormalSpeed = InSpeed; }
117 FORCEINLINE void SetTravelSpeed(const float InSpeed) { TravelSpeed = InSpeed; }
118
119 FORCEINLINE glm::vec3 CalculatePosition() const
120 {
121 return (FocalPoint - (GetForwardDirection() * Distance + PositionDelta));
122 }
123
124 private:
125 bool OnKeyPressed(LKeyPressedEvent& Event);
126 bool OnMouseScrolled(LMouseScrolledEvent& Event);
127
128 private:
129 static constexpr float MIN_SPEED = 0.00050f;
130 static constexpr float MAX_SPEED = 2.0f;
131 private:
132 EEditorCameraMode CameraMode = EEditorCameraMode::Arcball;
133 uint16_t CameraActionFlags = (uint16_t)ECameraAction::None;
134
135 float Distance = 8.0f;
136 float NormalSpeed = 0.0020f;
137 float TravelSpeed = 1.0f;
138
139 glm::vec3 Position{};
140 glm::vec2 InitialMousePosition{};
141 glm::vec3 InitialFocalPoint{};
142 glm::vec3 InitialRotation{};
143
144 uint32_t ViewportWidth = 1280;
145 uint32_t ViewportHeight = 720;
146
147 friend class LEditorLayer;
148 friend class LSceneManagerPanel;
149 friend class LSceneSerializer;
150
152 };
153
154
155 namespace Enum
156 {
157 FORCEINLINE static constexpr const char* ToString(const EEditorCameraMode CameraMode)
158 {
159 switch (CameraMode)
160 {
161 case EEditorCameraMode::None: return "None";
162 case EEditorCameraMode::Flycam: return "Flycam";
163 case EEditorCameraMode::Arcball: return "Arcball";
164 }
165
166 LK_CORE_VERIFY(false, "Enum::ToString(const EEditorCameraMode) failed for: {}", static_cast<int>(CameraMode));
167 return nullptr;
168 }
169 }
170
171}
Base camera.
Core header.
Editor core.
Timer.
Definition EditorCamera.h:32
void Initialize()
Initialize object.
Definition EditorCamera.cpp:27
void Tick(const float DeltaTime=0.0f)
Definition EditorCamera.cpp:43
Definition KeyEvent.h:13
Definition MouseEvent.h:75
Definition SceneCamera.h:12
Definition SceneSerializer.h:19
#define LCLASS(Class)
Definition CoreMacros.h:226
Definition Asset.h:11