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