Pioneer
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 
14 class Ship;
15 
17 public:
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 
50 protected:
52 
53 private:
54  const Ship *m_ship;
55  vector3d m_pos;
56  matrix3x3d m_orient;
57 };
58 
60 public:
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 
81 public:
82  enum Mode {
89  MODE_MAX
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 
125 private:
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
146 public:
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 
171 private:
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
181 public:
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 
224 private:
225  double m_dist, m_distTo;
226  matrix3x3d m_sidOrient;
227 };
228 
229 // Zoomable, fly by camera, always looks at the ship
231 public:
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 
264 private:
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 const char * GetName() const
Definition: CameraController.h:31
virtual void LoadFromJson(const Json &jsonObj)
Definition: CameraController.h:33
virtual void SaveToJson(Json &jsonObj)
Definition: CameraController.h:32
virtual void Reset()
Definition: CameraController.cpp:27
const Ship * GetShip() const
Definition: CameraController.h:48
CameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition: CameraController.cpp:19
virtual void OnDeactivated()
Definition: CameraController.h:46
const matrix3x3d & GetOrient() const
Definition: CameraController.h:42
virtual void OnActivated()
Definition: CameraController.h:45
vector3d GetPosition() const
Definition: CameraController.h:38
virtual Type GetType() const =0
RefCountedPtr< CameraContext > m_camera
Definition: CameraController.h:51
Definition: CameraController.h:145
ExternalCameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition: CameraController.cpp:200
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
const char * GetName() const override
Definition: CameraController.h:150
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
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
const char * GetName() const override
Definition: CameraController.h:235
FlyByCameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition: CameraController.cpp:377
Type GetType() const override
Definition: CameraController.h:234
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
InternalCameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition: CameraController.cpp:49
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: 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
void PitchCamera(float amount) override
Definition: CameraController.h:188
SiderealCameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition: CameraController.cpp:314
const char * GetName() const override
Definition: CameraController.h:185
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 > VectorY() const
Definition: matrix3x3.h:42
static matrix3x3 Identity()
Definition: matrix3x3.h:45
static matrix3x3 Rotate(double ang, const vector3< double > &v)
Definition: matrix3x3.h:87
vector3< T > VectorZ() const
Definition: matrix3x3.h:43
vector3< T > VectorX() const
Definition: matrix3x3.h:41
T y
Definition: vector3.h:18
T x
Definition: vector3.h:18
T z
Definition: vector3.h:18