Pioneer
Loading...
Searching...
No Matches
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
14class Body;
15class Frame;
16
17namespace Graphics {
18 class Material;
19 class Renderer;
20} // namespace Graphics
21
22class CameraContext : public RefCounted {
23public:
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
64private:
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
80class Camera {
81public:
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
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
120private:
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
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
void SetCameraPosition(const vector3d &pos)
Definition Camera.h:44
float GetZFar() const
Definition Camera.h:32
const Graphics::Frustum & GetFrustum() const
Definition Camera.h:53
void SetCameraFrame(FrameId frame)
Definition Camera.h:39
float GetHeight() const
Definition Camera.h:29
Definition Camera.h:90
const Graphics::Light & GetLight() const
Definition Camera.h:97
LightSource(const Body *b, Graphics::Light &light)
Definition Camera.h:92
const Body * GetBody() const
Definition Camera.h:96
Definition Camera.h:80
int GetNumLightSources() const
Definition Camera.h:118
void Draw(const Body *excludeBody=nullptr)
Definition Camera.cpp:222
const std::vector< LightSource > & GetLightSources() const
Definition Camera.h:117
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 CameraContext * GetContext() const
Definition Camera.h:84
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:36
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