Pioneer
CameraController.h
Go to the documentation of this file.
1 // Copyright © 2008-2021 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 
46  const Ship *GetShip() const { return m_ship; }
47 
48 protected:
50 
51 private:
52  const Ship *m_ship;
53  vector3d m_pos;
54  matrix3x3d m_orient;
55 };
56 
58 public:
60  CameraController(camera, ship) {}
61 
62  // Rotate the camera in a specific axis.
63  // `amount` is in radians and should be pre-multiplied by the frame delta.
64  virtual void RollCamera(float amount) {}
65  virtual void PitchCamera(float amount) {}
66  virtual void YawCamera(float amount) {}
67 
68  // Manually set the camera's rotation angle.
69  virtual void SetRotationAngles(vector3f rotation) {}
70 
73  virtual void ZoomEvent(float amount) {}
75  virtual void ZoomEventUpdate(float frameTime) {}
76 };
77 
79 public:
80  enum Mode {
87  MODE_MAX
88  };
89 
91  void Reset() override;
92  void Update() override;
93 
94  Type GetType() const override { return INTERNAL; }
95  const char *GetName() const override { return m_name; }
96 
97  void SetMode(Mode m);
98  Mode GetMode() const { return m_mode; }
99 
100  void SaveToJson(Json &jsonObj) override;
101  void LoadFromJson(const Json &jsonObj) override;
102 
103  void PitchCamera(float amount) override { m_rotX += amount; }
104  void YawCamera(float amount) override { m_rotY += amount; }
105 
106  void SetRotationAngles(vector3f rotation) override
107  {
108  m_rotX = rotation.x;
109  m_rotY = rotation.y;
110  }
111 
112  // TODO: remove this and replace with a better function.
113  void getRots(double &rotX, double &rotY);
114 
115 private:
116  Mode m_mode;
117  const char *m_name;
118 
119  matrix3x3d m_initOrient[MODE_MAX];
120  vector3d m_initPos[MODE_MAX];
121 
122  double m_rotX; //vertical rot
123  double m_rotY; //horizontal rot
124  matrix3x3d m_viewOrient;
125 };
126 
127 // Zoomable, rotatable orbit camera, always looks at the ship
129 public:
131 
132  Type GetType() const override { return EXTERNAL; }
133  const char *GetName() const override { return Lang::EXTERNAL_VIEW; }
134  bool IsExternal() const override { return true; }
135 
136  virtual void PitchCamera(float amount) override { m_rotX += amount; }
137  virtual void YawCamera(float amount) override { m_rotY += amount; }
138 
139  virtual void SetRotationAngles(vector3f rotation) override
140  {
141  m_rotX = rotation.x;
142  m_rotY = rotation.y;
143  }
144 
145  void ZoomEvent(float amount) override;
146  void ZoomEventUpdate(float frameTime) override;
147 
148  void SaveToJson(Json &jsonObj) override;
149  void LoadFromJson(const Json &jsonObj) override;
150 
151  void Update() override;
152  void Reset() override;
153 
154 private:
155  double m_dist, m_distTo;
156  double m_rotX; //vertical rot
157  double m_rotY; //horizontal rot
158  matrix3x3d m_extOrient;
159  Quaternionf m_smoothed_ship_orient;
160 };
161 
162 // Much like external camera, but does not turn when the ship turns
164 public:
166 
167  Type GetType() const override { return SIDEREAL; }
168  const char *GetName() const override { return Lang::SIDEREAL_VIEW; }
169  bool IsExternal() const override { return true; }
170 
171  void PitchCamera(float amount) override
172  {
173  const vector3d rotAxis = m_sidOrient.VectorX();
174  m_sidOrient = matrix3x3d::Rotate(M_PI / 4 * amount, rotAxis) * m_sidOrient;
175  }
176 
177  void YawCamera(float amount) override
178  {
179  const vector3d rotAxis = m_sidOrient.VectorY();
180  m_sidOrient = matrix3x3d::Rotate(M_PI / 4 * amount, rotAxis) * m_sidOrient;
181  }
182 
183  void RollCamera(float amount) override
184  {
185  const vector3d rotAxis = m_sidOrient.VectorZ();
186  m_sidOrient = matrix3x3d::Rotate(M_PI / 4 * amount, rotAxis) * m_sidOrient;
187  }
188 
189  // Apply in YXZ order because euler angles are non-ideal.
190  void SetRotationAngles(vector3f rotation) override
191  {
192  m_sidOrient = matrix3x3d::Identity();
193  YawCamera(rotation.y);
194  PitchCamera(rotation.x);
195  RollCamera(rotation.z);
196  }
197 
198  void ZoomEvent(float amount) override;
199  void ZoomEventUpdate(float frameTime) override;
200 
201  void SaveToJson(Json &jsonObj) override;
202  void LoadFromJson(const Json &jsonObj) override;
203 
204  void Update() override;
205  void Reset() override;
206 
207 private:
208  double m_dist, m_distTo;
209  matrix3x3d m_sidOrient;
210 };
211 
212 // Zoomable, fly by camera, always looks at the ship
214 public:
216 
217  Type GetType() const override { return FLYBY; }
218  const char *GetName() const override { return Lang::FLYBY_VIEW; }
219  bool IsExternal() const override { return true; }
220 
221  void PitchCamera(float amount) override
222  {
223  const vector3d rotAxis = m_flybyOrient.VectorX();
224  m_flybyOrient = matrix3x3d::Rotate(M_PI / 4 * amount, rotAxis) * m_flybyOrient;
225  }
226 
227  void YawCamera(float amount) override
228  {
229  const vector3d rotAxis = m_flybyOrient.VectorY();
230  m_flybyOrient = matrix3x3d::Rotate(M_PI / 4 * amount, rotAxis) * m_flybyOrient;
231  }
232 
233  void RollCamera(float amount) override
234  {
235  m_roll += M_PI / 4 * amount;
236  }
237 
238  void ZoomEvent(float amount) override;
239  void ZoomEventUpdate(float frameTime) override;
240 
241  void SaveToJson(Json &jsonObj) override;
242  void LoadFromJson(const Json &jsonObj) override;
243 
244  void Update() override;
245  void Reset() override;
246 
247 private:
248  double m_dist, m_distTo;
249  float m_roll;
250  matrix3x3d m_flybyOrient;
251  vector3d m_old_pos;
252  Frame *m_old_frame;
253 };
254 
255 #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:46
CameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition: CameraController.cpp:19
const matrix3x3d & GetOrient() const
Definition: CameraController.h:42
vector3d GetPosition() const
Definition: CameraController.h:38
virtual Type GetType() const =0
RefCountedPtr< CameraContext > m_camera
Definition: CameraController.h:49
Definition: CameraController.h:128
ExternalCameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition: CameraController.cpp:164
virtual void PitchCamera(float amount) override
Definition: CameraController.h:136
void Reset() override
Definition: CameraController.cpp:187
void ZoomEvent(float amount) override
Definition: CameraController.cpp:175
virtual void SetRotationAngles(vector3f rotation) override
Definition: CameraController.h:139
virtual void YawCamera(float amount) override
Definition: CameraController.h:137
const char * GetName() const override
Definition: CameraController.h:133
void ZoomEventUpdate(float frameTime) override
Animated zoom update (on each frame), primarily designed for mouse wheel.
Definition: CameraController.cpp:182
bool IsExternal() const override
Definition: CameraController.h:134
void SaveToJson(Json &jsonObj) override
Definition: CameraController.cpp:252
Type GetType() const override
Definition: CameraController.h:132
void Update() override
Definition: CameraController.cpp:194
void LoadFromJson(const Json &jsonObj) override
Definition: CameraController.cpp:263
Definition: CameraController.h:213
void PitchCamera(float amount) override
Definition: CameraController.h:221
void Update() override
Definition: CameraController.cpp:369
void LoadFromJson(const Json &jsonObj) override
Definition: CameraController.cpp:405
void ZoomEvent(float amount) override
Definition: CameraController.cpp:350
void RollCamera(float amount) override
Definition: CameraController.h:233
bool IsExternal() const override
Definition: CameraController.h:219
void ZoomEventUpdate(float frameTime) override
Animated zoom update (on each frame), primarily designed for mouse wheel.
Definition: CameraController.cpp:356
const char * GetName() const override
Definition: CameraController.h:218
FlyByCameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition: CameraController.cpp:341
Type GetType() const override
Definition: CameraController.h:217
void YawCamera(float amount) override
Definition: CameraController.h:227
void Reset() override
Definition: CameraController.cpp:362
void SaveToJson(Json &jsonObj) override
Definition: CameraController.cpp:394
Definition: Frame.h:28
Definition: CameraController.h:78
const char * GetName() const override
Definition: CameraController.h:95
void SetMode(Mode m)
Definition: CameraController.cpp:119
void SetRotationAngles(vector3f rotation) override
Definition: CameraController.h:106
Mode
Definition: CameraController.h:80
@ MODE_FRONT
Definition: CameraController.h:81
@ MODE_MAX
Definition: CameraController.h:87
@ MODE_REAR
Definition: CameraController.h:82
@ MODE_RIGHT
Definition: CameraController.h:84
@ MODE_TOP
Definition: CameraController.h:85
@ MODE_LEFT
Definition: CameraController.h:83
@ MODE_BOTTOM
Definition: CameraController.h:86
void LoadFromJson(const Json &jsonObj) override
Definition: CameraController.cpp:151
InternalCameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition: CameraController.cpp:49
void SaveToJson(Json &jsonObj) override
Definition: CameraController.cpp:140
void YawCamera(float amount) override
Definition: CameraController.h:104
void PitchCamera(float amount) override
Definition: CameraController.h:103
Type GetType() const override
Definition: CameraController.h:94
void Update() override
Definition: CameraController.cpp:102
void getRots(double &rotX, double &rotY)
Definition: CameraController.cpp:113
Mode GetMode() const
Definition: CameraController.h:98
void Reset() override
Definition: CameraController.cpp:81
Definition: CameraController.h:57
virtual void SetRotationAngles(vector3f rotation)
Definition: CameraController.h:69
virtual void ZoomEventUpdate(float frameTime)
Animated zoom update (on each frame), primarily designed for mouse wheel.
Definition: CameraController.h:75
virtual void PitchCamera(float amount)
Definition: CameraController.h:65
MoveableCameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition: CameraController.h:59
virtual void YawCamera(float amount)
Definition: CameraController.h:66
virtual void RollCamera(float amount)
Definition: CameraController.h:64
virtual void ZoomEvent(float amount)
Definition: CameraController.h:73
Definition: Ship.h:64
Definition: CameraController.h:163
void RollCamera(float amount) override
Definition: CameraController.h:183
void Reset() override
Definition: CameraController.cpp:298
void SaveToJson(Json &jsonObj) override
Definition: CameraController.cpp:317
void Update() override
Definition: CameraController.cpp:304
void ZoomEvent(float amount) override
Definition: CameraController.cpp:286
void YawCamera(float amount) override
Definition: CameraController.h:177
void SetRotationAngles(vector3f rotation) override
Definition: CameraController.h:190
void LoadFromJson(const Json &jsonObj) override
Definition: CameraController.cpp:327
Type GetType() const override
Definition: CameraController.h:167
void PitchCamera(float amount) override
Definition: CameraController.h:171
SiderealCameraController(RefCountedPtr< CameraContext > camera, const Ship *ship)
Definition: CameraController.cpp:278
const char * GetName() const override
Definition: CameraController.h:168
void ZoomEventUpdate(float frameTime) override
Animated zoom update (on each frame), primarily designed for mouse wheel.
Definition: CameraController.cpp:292
bool IsExternal() const override
Definition: CameraController.h:169
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