Pioneer
Camera.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 _CAMERA_H
5 #define _CAMERA_H
6 
7 #include "Color.h"
8 #include "FrameId.h"
9 #include "graphics/Frustum.h"
10 #include "graphics/Light.h"
11 #include "matrix4x4.h"
12 #include "vector3.h"
13 
14 class Body;
15 class Frame;
16 
17 namespace Graphics {
18  class Material;
19  class Renderer;
20 } // namespace Graphics
21 
22 class CameraContext : public RefCounted {
23 public:
24  // camera for rendering to width x height with view frustum properties
25  CameraContext(float width, float height, float fovAng, float zNear, float zFar);
27 
28  float GetWidth() const { return m_width; }
29  float GetHeight() const { return m_height; }
30  float GetFovAng() const { return m_fovAng; }
31  float GetZNear() const { return m_zNear; }
32  float GetZFar() const { return m_zFar; }
33 
34  // Set the field of view of this camera context.
35  // Should be called before ApplyDrawTransforms.
36  void SetFovAng(float newAng);
37 
38  // frame to position the camera relative to
39  void SetCameraFrame(FrameId frame) { m_frame = frame; }
40  // return the parent frame of this camera
41  FrameId GetCameraFrame() const { return m_frame; }
42 
43  // camera position relative to the frame origin
44  void SetCameraPosition(const vector3d &pos) { m_pos = pos; }
45 
46  // camera orientation relative to the frame origin
47  void SetCameraOrient(const matrix3x3d &orient) { m_orient = orient; }
48 
49  const vector3d GetCameraPos() const { return m_pos; }
50  const matrix3x3d &GetCameraOrient() const { return m_orient; }
51 
52  // get the frustum. use for projection
53  const Graphics::Frustum &GetFrustum() const { return m_frustum; }
54 
55  // generate and destroy the camere frame, used mostly to transform things to camera space
56  void BeginFrame();
57  void EndFrame();
58 
59  FrameId GetTempFrame() const { return m_camFrame; }
60 
61  // apply projection and modelview transforms to the renderer
63 
64 private:
65  float m_width;
66  float m_height;
67  float m_fovAng;
68  float m_zNear;
69  float m_zFar;
70 
71  Graphics::Frustum m_frustum;
72 
73  FrameId m_frame;
74  vector3d m_pos;
75  matrix3x3d m_orient;
76 
77  FrameId m_camFrame;
78 };
79 
80 class Camera {
81 public:
83 
84  const CameraContext *GetContext() const { return m_context.Get(); }
85 
86  void Update();
87  void Draw(const Body *excludeBody = nullptr);
88 
89  // camera-specific light with attached source body
90  class LightSource {
91  public:
92  LightSource(const Body *b, Graphics::Light &light) :
93  m_body(b),
94  m_light(light) {}
95 
96  const Body *GetBody() const { return m_body; }
97  const Graphics::Light &GetLight() const { return m_light; }
98 
99  private:
100  const Body *m_body;
101  Graphics::Light m_light;
102  };
103 
104  struct Shadow {
106  float srad;
107  float lrad;
108 
109  bool operator<(const Shadow &other) const { return srad / lrad < other.srad / other.lrad; }
110  };
111 
112  void CalcShadows(const int lightNum, const Body *b, std::vector<Shadow> &shadowsOut) const;
113  float ShadowedIntensity(const int lightNum, const Body *b) const;
114  void PrincipalShadows(const Body *b, const int n, std::vector<Shadow> &shadowsOut) const;
115 
116  // lights with properties in camera space
117  const std::vector<LightSource> &GetLightSources() const { return m_lightSources; }
118  int GetNumLightSources() const { return static_cast<Uint32>(m_lightSources.size()); }
119 
120 private:
122  Graphics::Renderer *m_renderer;
123 
124  std::unique_ptr<Graphics::Material> m_billboardMaterial;
125 
126  // temp attrs for sorting and drawing
127  struct BodyAttrs {
128  Body *body;
129 
130  // camera position and orientation relative to the body
131  vector3d viewCoords;
132  matrix4x4d viewTransform;
133 
134  // body distance from camera
135  double camDist;
136 
137  // body flags. DRAW_LAST is the interesting one
138  Uint32 bodyFlags;
139 
140  // if true, draw object as billboard of billboardSize at billboardPos
141  bool billboard;
142  vector3f billboardPos;
143  float billboardSize;
144  Color billboardColor;
145 
146  // for sorting. "should a be drawn before b?"
147  // NOTE: Add below function (thus an indirection) in order
148  // to decouple Camera from Body.h
149  static bool sort_BodyAttrs(const BodyAttrs &a, const BodyAttrs &b);
150  friend bool operator<(const BodyAttrs &a, const BodyAttrs &b)
151  {
152  return sort_BodyAttrs(a, b);
153  };
154  };
155 
156  std::list<BodyAttrs> m_sortedBodies;
157  std::vector<LightSource> m_lightSources;
158 };
159 
160 #endif
Definition: Body.h:57
Definition: Camera.h:22
float GetZNear() const
Definition: Camera.h:31
float GetFovAng() const
Definition: Camera.h:30
FrameId GetCameraFrame() const
Definition: Camera.h:41
void BeginFrame()
Definition: Camera.cpp:52
void EndFrame()
Definition: Camera.cpp:70
FrameId GetTempFrame() const
Definition: Camera.h:59
~CameraContext()
Definition: Camera.cpp:40
CameraContext(float width, float height, float fovAng, float zNear, float zFar)
Definition: Camera.cpp:26
void SetFovAng(float newAng)
Definition: Camera.cpp:46
const vector3d GetCameraPos() const
Definition: Camera.h:49
void SetCameraOrient(const matrix3x3d &orient)
Definition: Camera.h:47
float GetWidth() const
Definition: Camera.h:28
const matrix3x3d & GetCameraOrient() const
Definition: Camera.h:50
void ApplyDrawTransforms(Graphics::Renderer *r)
Definition: Camera.cpp:80
const Graphics::Frustum & GetFrustum() const
Definition: Camera.h:53
void SetCameraPosition(const vector3d &pos)
Definition: Camera.h:44
float GetZFar() const
Definition: Camera.h:32
void SetCameraFrame(FrameId frame)
Definition: Camera.h:39
float GetHeight() const
Definition: Camera.h:29
Definition: Camera.h:90
const Body * GetBody() const
Definition: Camera.h:96
const Graphics::Light & GetLight() const
Definition: Camera.h:97
LightSource(const Body *b, Graphics::Light &light)
Definition: Camera.h:92
Definition: Camera.h:80
const CameraContext * GetContext() const
Definition: Camera.h:84
Camera(RefCountedPtr< CameraContext > context, Graphics::Renderer *renderer)
Definition: Camera.cpp:105
int GetNumLightSources() const
Definition: Camera.h:118
void Draw(const Body *excludeBody=nullptr)
Definition: Camera.cpp:222
void Update()
Definition: Camera.cpp:148
void PrincipalShadows(const Body *b, const int n, std::vector< Shadow > &shadowsOut) const
Definition: Camera.cpp:407
float ShadowedIntensity(const int lightNum, const Body *b) const
Definition: Camera.cpp:395
const std::vector< LightSource > & GetLightSources() const
Definition: Camera.h:117
void CalcShadows(const int lightNum, const Body *b, std::vector< Shadow > &shadowsOut) const
Definition: Camera.cpp:314
Definition: Frame.h:28
Definition: Frustum.h:17
Definition: Light.h:14
Definition: Renderer.h:44
Definition: RefCounted.h:11
T * Get() const
Definition: SmartPtr.h:37
Definition: Background.h:14
Definition: Camera.h:104
float srad
Definition: Camera.h:106
bool operator<(const Shadow &other) const
Definition: Camera.h:109
float lrad
Definition: Camera.h:107
vector3d centre
Definition: Camera.h:105
Definition: Color.h:66
Definition: FrameId.h:9