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