Pioneer
Loading...
Searching...
No Matches
CameraController.h
Go to the documentation of this file.
1// Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3
4#ifndef CAMERACONTROLLER_H
5#define CAMERACONTROLLER_H
6
7#include "Camera.h"
8#include "JsonFwd.h"
9#include "Lang.h"
10#include "Quaternion.h"
11#include "matrix4x4.h"
12#include "vector3.h"
13
14class Ship;
15
17public:
18 enum Type { //can be used for serialization & identification
22 FLYBY
23 };
24
26 virtual ~CameraController() {}
27
28 virtual void Reset();
29
30 virtual Type GetType() const = 0;
31 virtual const char *GetName() const { return ""; }
32 virtual void SaveToJson(Json &jsonObj) {}
33 virtual void LoadFromJson(const Json &jsonObj) {}
34 virtual bool IsExternal() const { return false; }
35
36 // camera position relative to the body
37 void SetPosition(const vector3d &pos) { m_pos = pos; }
38 vector3d GetPosition() const { return m_pos; }
39
40 // camera orientation relative to the body
41 void SetOrient(const matrix3x3d &orient) { m_orient = orient; }
42 const matrix3x3d &GetOrient() const { return m_orient; }
43
44 virtual void Update();
45 virtual void OnActivated(){};
46 virtual void OnDeactivated(){};
47
48 const Ship *GetShip() const { return m_ship; }
49
50protected:
52
53private:
54 const Ship *m_ship;
55 vector3d m_pos;
56 matrix3x3d m_orient;
57};
58
60public:
62 CameraController(camera, ship) {}
63
64 // Rotate the camera in a specific axis.
65 // `amount` is in radians and should be pre-multiplied by the frame delta.
66 virtual void RollCamera(float amount) {}
67 virtual void PitchCamera(float amount) {}
68 virtual void YawCamera(float amount) {}
69
70 // Manually set the camera's rotation angle.
71 virtual void SetRotationAngles(vector3f rotation) {}
72
75 virtual void ZoomEvent(float amount) {}
77 virtual void ZoomEventUpdate(float frameTime) {}
78};
79
81public:
82 enum Mode {
90 };
91
93 void Reset() override;
94 void Update() override;
95
96 Type GetType() const override { return INTERNAL; }
97 const char *GetName() const override { return m_name; }
98
99 void SetSmoothingEnabled(bool enabled);
100 bool GetSmoothingEnabled() const { return m_smoothing; }
101
102 void SetMode(Mode m);
103 Mode GetMode() const { return m_mode; }
104
105 void ZoomEvent(float amount) override;
106 void ZoomEventUpdate(float frameTime) override;
107
108 void SaveToJson(Json &jsonObj) override;
109 void LoadFromJson(const Json &jsonObj) override;
110
111 void OnDeactivated() override;
112
113 void PitchCamera(float amount) override { m_rotToX += amount * m_zoomPct; }
114 void YawCamera(float amount) override { m_rotToY += amount * m_zoomPct; }
115
116 void SetRotationAngles(vector3f rotation) override
117 {
118 m_rotToX = rotation.x;
119 m_rotToY = rotation.y;
120 }
121
122 // TODO: remove this and replace with a better function.
123 void getRots(double &rotX, double &rotY);
124
125private:
126 Mode m_mode;
127 const char *m_name;
128
129 matrix3x3d m_initOrient[MODE_MAX];
130 vector3d m_initPos[MODE_MAX];
131
132 float m_rotToX; //vertical target rot
133 float m_rotToY; //horizontal target rot
134 float m_rotX; //vertical rot
135 float m_rotY; //horizontal rot
136 float m_origFov;
137 float m_zoomPct;
138 float m_zoomPctTo;
139 matrix3x3d m_viewOrient;
140
141 bool m_smoothing;
142};
143
144// Zoomable, rotatable orbit camera, always looks at the ship
146public:
148
149 Type GetType() const override { return EXTERNAL; }
150 const char *GetName() const override { return Lang::EXTERNAL_VIEW; }
151 bool IsExternal() const override { return true; }
152
153 virtual void PitchCamera(float amount) override { m_rotX += amount; }
154 virtual void YawCamera(float amount) override { m_rotY += amount; }
155
156 virtual void SetRotationAngles(vector3f rotation) override
157 {
158 m_rotX = rotation.x;
159 m_rotY = rotation.y;
160 }
161
162 void ZoomEvent(float amount) override;
163 void ZoomEventUpdate(float frameTime) override;
164
165 void SaveToJson(Json &jsonObj) override;
166 void LoadFromJson(const Json &jsonObj) override;
167
168 void Update() override;
169 void Reset() override;
170
171private:
172 double m_dist, m_distTo;
173 double m_rotX; //vertical rot
174 double m_rotY; //horizontal rot
175 matrix3x3d m_extOrient;
176 Quaternionf m_smoothed_ship_orient;
177};
178
179// Much like external camera, but does not turn when the ship turns
181public:
183
184 Type GetType() const override { return SIDEREAL; }
185 const char *GetName() const override { return Lang::SIDEREAL_VIEW; }
186 bool IsExternal() const override { return true; }
187
188 void PitchCamera(float amount) override
189 {
190 const vector3d rotAxis = m_sidOrient.VectorX();
191 m_sidOrient = matrix3x3d::Rotate(M_PI / 4 * amount, rotAxis) * m_sidOrient;
192 }
193
194 void YawCamera(float amount) override
195 {
196 const vector3d rotAxis = m_sidOrient.VectorY();
197 m_sidOrient = matrix3x3d::Rotate(M_PI / 4 * amount, rotAxis) * m_sidOrient;
198 }
199
200 void RollCamera(float amount) override
201 {
202 const vector3d rotAxis = m_sidOrient.VectorZ();
203 m_sidOrient = matrix3x3d::Rotate(M_PI / 4 * amount, rotAxis) * m_sidOrient;
204 }
205
206 // Apply in YXZ order because euler angles are non-ideal.
207 void SetRotationAngles(vector3f rotation) override
208 {
209 m_sidOrient = matrix3x3d::Identity();
210 YawCamera(rotation.y);
211 PitchCamera(rotation.x);
212 RollCamera(rotation.z);
213 }
214
215 void ZoomEvent(float amount) override;
216 void ZoomEventUpdate(float frameTime) override;
217
218 void SaveToJson(Json &jsonObj) override;
219 void LoadFromJson(const Json &jsonObj) override;
220
221 void Update() override;
222 void Reset() override;
223
224private:
225 double m_dist, m_distTo;
226 matrix3x3d m_sidOrient;
227};
228
229// Zoomable, fly by camera, always looks at the ship
231public:
233
234 Type GetType() const override { return FLYBY; }
235 const char *GetName() const override { return Lang::FLYBY_VIEW; }
236 bool IsExternal() const override { return true; }
237
238 void PitchCamera(float amount) override
239 {
240 const vector3d rotAxis = m_flybyOrient.VectorX();
241 m_flybyOrient = matrix3x3d::Rotate(M_PI / 4 * amount, rotAxis) * m_flybyOrient;
242 }
243
244 void YawCamera(float amount) override
245 {
246 const vector3d rotAxis = m_flybyOrient.VectorY();
247 m_flybyOrient = matrix3x3d::Rotate(M_PI / 4 * amount, rotAxis) * m_flybyOrient;
248 }
249
250 void RollCamera(float amount) override
251 {
252 m_roll += M_PI / 4 * amount;
253 }
254
255 void ZoomEvent(float amount) override;
256 void ZoomEventUpdate(float frameTime) override;
257
258 void SaveToJson(Json &jsonObj) override;
259 void LoadFromJson(const Json &jsonObj) override;
260
261 void Update() override;
262 void Reset() override;
263
264private:
265 double m_dist, m_distTo;
266 float m_roll;
267 matrix3x3d m_flybyOrient;
268 vector3d m_old_pos;
269 Frame *m_old_frame;
270};
271
272#endif
nlohmann::json Json
Definition Json.h:8
Definition CameraController.h:16
virtual void Update()
Definition CameraController.cpp:33
void SetPosition(const vector3d &pos)
Definition CameraController.h:37
virtual ~CameraController()
Definition CameraController.h:26
Type
Definition CameraController.h:18
@ INTERNAL
Definition CameraController.h:19
@ FLYBY
Definition CameraController.h:22
@ SIDEREAL
Definition CameraController.h:21
@ EXTERNAL
Definition CameraController.h:20
void SetOrient(const matrix3x3d &orient)
Definition CameraController.h:41
virtual bool IsExternal() const
Definition CameraController.h:34
virtual void LoadFromJson(const Json &jsonObj)
Definition CameraController.h:33
virtual void SaveToJson(Json &jsonObj)
Definition CameraController.h:32
const matrix3x3d & GetOrient() const
Definition CameraController.h:42
const Ship * GetShip() const
Definition CameraController.h:48
virtual void Reset()
Definition CameraController.cpp:27
virtual void OnDeactivated()
Definition CameraController.h:46
virtual void OnActivated()
Definition CameraController.h:45
vector3d GetPosition() const
Definition CameraController.h:38
virtual Type GetType() const =0
virtual const char * GetName() const
Definition CameraController.h:31
RefCountedPtr< CameraContext > m_camera
Definition CameraController.h:51
Definition CameraController.h:145
virtual void PitchCamera(float amount) override
Definition CameraController.h:153
void Reset() override
Definition CameraController.cpp:223
void ZoomEvent(float amount) override
Definition CameraController.cpp:211
virtual void SetRotationAngles(vector3f rotation) override
Definition CameraController.h:156
virtual void YawCamera(float amount) override
Definition CameraController.h:154
void ZoomEventUpdate(float frameTime) override
Animated zoom update (on each frame), primarily designed for mouse wheel.
Definition CameraController.cpp:218
bool IsExternal() const override
Definition CameraController.h:151
void SaveToJson(Json &jsonObj) override
Definition CameraController.cpp:288
Type GetType() const override
Definition CameraController.h:149
void Update() override
Definition CameraController.cpp:230
void LoadFromJson(const Json &jsonObj) override
Definition CameraController.cpp:299
const char * GetName() const override
Definition CameraController.h:150
Definition CameraController.h:230
void PitchCamera(float amount) override
Definition CameraController.h:238
void Update() override
Definition CameraController.cpp:405
void LoadFromJson(const Json &jsonObj) override
Definition CameraController.cpp:441
void ZoomEvent(float amount) override
Definition CameraController.cpp:386
void RollCamera(float amount) override
Definition CameraController.h:250
bool IsExternal() const override
Definition CameraController.h:236
void ZoomEventUpdate(float frameTime) override
Animated zoom update (on each frame), primarily designed for mouse wheel.
Definition CameraController.cpp:392
Type GetType() const override
Definition CameraController.h:234
const char * GetName() const override
Definition CameraController.h:235
void YawCamera(float amount) override
Definition CameraController.h:244
void Reset() override
Definition CameraController.cpp:398
void SaveToJson(Json &jsonObj) override
Definition CameraController.cpp:430
Definition Frame.h:28
Definition CameraController.h:80
const char * GetName() const override
Definition CameraController.h:97
void SetMode(Mode m)
Definition CameraController.cpp:140
void SetRotationAngles(vector3f rotation) override
Definition CameraController.h:116
bool GetSmoothingEnabled() const
Definition CameraController.h:100
Mode
Definition CameraController.h:82
@ MODE_FRONT
Definition CameraController.h:83
@ MODE_MAX
Definition CameraController.h:89
@ MODE_REAR
Definition CameraController.h:84
@ MODE_RIGHT
Definition CameraController.h:86
@ MODE_TOP
Definition CameraController.h:87
@ MODE_LEFT
Definition CameraController.h:85
@ MODE_BOTTOM
Definition CameraController.h:88
void LoadFromJson(const Json &jsonObj) override
Definition CameraController.cpp:182
void SetSmoothingEnabled(bool enabled)
Definition CameraController.cpp:135
void SaveToJson(Json &jsonObj) override
Definition CameraController.cpp:171
void YawCamera(float amount) override
Definition CameraController.h:114
void ZoomEvent(float amount) override
Definition CameraController.cpp:161
void PitchCamera(float amount) override
Definition CameraController.h:113
void OnDeactivated() override
Definition CameraController.cpp:195
void ZoomEventUpdate(float frameTime) override
Animated zoom update (on each frame), primarily designed for mouse wheel.
Definition CameraController.cpp:166
Type GetType() const override
Definition CameraController.h:96
void Update() override
Definition CameraController.cpp:108
void getRots(double &rotX, double &rotY)
Definition CameraController.cpp:129
Mode GetMode() const
Definition CameraController.h:103
void Reset() override
Definition CameraController.cpp:87
Definition CameraController.h:59
virtual void SetRotationAngles(vector3f rotation)
Definition CameraController.h:71
virtual void ZoomEventUpdate(float frameTime)
Animated zoom update (on each frame), primarily designed for mouse wheel.
Definition CameraController.h:77
virtual void PitchCamera(float amount)
Definition CameraController.h:67
MoveableCameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition CameraController.h:61
virtual void YawCamera(float amount)
Definition CameraController.h:68
virtual void RollCamera(float amount)
Definition CameraController.h:66
virtual void ZoomEvent(float amount)
Definition CameraController.h:75
Definition RefCounted.h:36
Definition Ship.h:64
Definition CameraController.h:180
void RollCamera(float amount) override
Definition CameraController.h:200
void Reset() override
Definition CameraController.cpp:334
void SaveToJson(Json &jsonObj) override
Definition CameraController.cpp:353
void Update() override
Definition CameraController.cpp:340
void ZoomEvent(float amount) override
Definition CameraController.cpp:322
void YawCamera(float amount) override
Definition CameraController.h:194
void SetRotationAngles(vector3f rotation) override
Definition CameraController.h:207
void LoadFromJson(const Json &jsonObj) override
Definition CameraController.cpp:363
Type GetType() const override
Definition CameraController.h:184
const char * GetName() const override
Definition CameraController.h:185
void PitchCamera(float amount) override
Definition CameraController.h:188
void ZoomEventUpdate(float frameTime) override
Animated zoom update (on each frame), primarily designed for mouse wheel.
Definition CameraController.cpp:328
bool IsExternal() const override
Definition CameraController.h:186
vector3< T > VectorZ() const
Definition matrix3x3.h:43
vector3< T > VectorX() const
Definition matrix3x3.h:41
static matrix3x3 Identity()
Definition matrix3x3.h:45
vector3< T > VectorY() const
Definition matrix3x3.h:42
static matrix3x3 Rotate(double ang, const vector3< double > &v)
Definition matrix3x3.h:87
T y
Definition vector3.h:18
T x
Definition vector3.h:18
T z
Definition vector3.h:18