Pyrogenesis  trunk
SceneRenderer.h
Go to the documentation of this file.
1 /* Copyright (C) 2022 Wildfire Games.
2  * This file is part of 0 A.D.
3  *
4  * 0 A.D. is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * 0 A.D. is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef INCLUDED_RENDERER_SCENERENDERER
19 #define INCLUDED_RENDERER_SCENERENDERER
20 
21 #include "graphics/Camera.h"
22 #include "graphics/ShaderDefines.h"
25 #include "ps/Singleton.h"
28 #include "renderer/Scene.h"
29 
30 #include <memory>
31 
32 class CCanvas2D;
33 class CLightEnv;
34 class CMaterial;
35 class CMaterialManager;
36 class CModel;
37 class CParticleManager;
38 class CPatch;
39 class CSimulation2;
40 class ShadowMap;
41 class SkyManager;
42 class TerrainRenderer;
43 class WaterManager;
44 
45 // rendering modes
47 
48 // transparency modes
50 
52 {
53 public:
54  enum CullGroup
55  {
66  };
67 
70 
71  void Initialize();
72  void Resize(int width, int height);
73 
74  void BeginFrame();
75  void EndFrame();
76 
77  /**
78  * Set simulation context for rendering purposes.
79  * Must be called at least once when the game has started and before
80  * frames are rendered.
81  */
82  void SetSimulation(CSimulation2* simulation);
83 
84  // trigger a reload of shaders (when parameters they depend on have changed)
85  void MakeShadersDirty();
86 
87  /**
88  * Set up the camera used for rendering the next scene; this includes
89  * setting OpenGL state like viewport, projection and modelview matrices.
90  *
91  * @param viewCamera this camera determines the eye position for rendering
92  * @param cullCamera this camera determines the frustum for culling in the renderer and
93  * for shadow calculations
94  */
95  void SetSceneCamera(const CCamera& viewCamera, const CCamera& cullCamera);
96 
97  /**
98  * Enumerate and submit all objects of the given scene which should be rendered.
99  * Must be called before RenderScene.
100  */
101  void PrepareScene(
102  Renderer::Backend::IDeviceCommandContext* deviceCommandContext, Scene& scene);
103 
104  /**
105  * Render submitted objects of the previously given scene.
106  */
107  void RenderScene(
108  Renderer::Backend::IDeviceCommandContext* deviceCommandContext);
109 
110  /**
111  * Render overlays of the previously given scene.
112  * Must be called after RenderScene.
113  */
114  void RenderSceneOverlays(
115  Renderer::Backend::IDeviceCommandContext* deviceCommandContext);
116 
117  /**
118  * Return the scene that is currently being rendered.
119  * Only valid when the renderer is in a RenderScene call.
120  */
121  Scene& GetScene();
122 
123  /**
124  * Render text overlays on top of the scene.
125  * Assumes the caller has set up the GL environment for orthographic rendering
126  * with texturing and blending.
127  */
128  void RenderTextOverlays(CCanvas2D& canvas);
129 
130  // set the current lighting environment; (note: the passed pointer is just copied to a variable within the renderer,
131  // so the lightenv passed must be scoped such that it is not destructed until after the renderer is no longer rendering)
132  void SetLightEnv(CLightEnv* lightenv)
133  {
134  m_LightEnv = lightenv;
135  }
136 
137  // set the mode to render subsequent terrain patches
139  // get the mode to render subsequent terrain patches
141 
142  // set the mode to render subsequent water patches
144  // get the mode to render subsequent water patches
146 
147  // set the mode to render subsequent models
149  // get the mode to render subsequent models
151 
152  // Get the mode to render subsequent overlays.
154  // Set the mode to render subsequent overlays.
156 
157  // debugging
158  void SetDisplayTerrainPriorities(bool enabled) { m_DisplayTerrainPriorities = enabled; }
159 
160  // return the current light environment
161  const CLightEnv &GetLightEnv() { return *m_LightEnv; }
162 
163  // return the current view camera
164  const CCamera& GetViewCamera() const { return m_ViewCamera; }
165  // replace the current view camera
166  void SetViewCamera(const CCamera& camera) { m_ViewCamera = camera; }
167 
168  // return the current cull camera
169  const CCamera& GetCullCamera() const { return m_CullCamera; }
170 
171  /**
172  * GetWaterManager: Return the renderer's water manager.
173  *
174  * @return the WaterManager object used by the renderer
175  */
177 
178  /**
179  * GetSkyManager: Return the renderer's sky manager.
180  *
181  * @return the SkyManager object used by the renderer
182  */
184 
186 
188 
190 
192 
193  /**
194  * Resets the render state to default, that was before a game started
195  */
196  void ResetState();
197 
198  void ReloadShaders();
199 
200 protected:
201  void Submit(CPatch* patch) override;
202  void Submit(SOverlayLine* overlay) override;
203  void Submit(SOverlayTexturedLine* overlay) override;
204  void Submit(SOverlaySprite* overlay) override;
205  void Submit(SOverlayQuad* overlay) override;
206  void Submit(CModelDecal* decal) override;
207  void Submit(CParticleEmitter* emitter) override;
208  void Submit(SOverlaySphere* overlay) override;
209  void SubmitNonRecursive(CModel* model) override;
210 
211  /**
212  * Update and upload all needed data for submitted objects.
213  */
214  void PrepareSubmissions(
215  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
216  const CBoundingBoxAligned& waterScissor);
217 
218  // render any batched objects
219  void RenderSubmissions(
220  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
221  const CBoundingBoxAligned& waterScissor);
222 
223  // patch rendering stuff
224  void RenderPatches(
225  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
226  const CShaderDefines& context, int cullGroup);
227 
228  // model rendering stuff
229  void RenderModels(
230  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
231  const CShaderDefines& context, int cullGroup);
233  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
234  const CShaderDefines& context, int cullGroup, ETransparentMode transparentMode);
235 
236  void RenderSilhouettes(
237  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
238  const CShaderDefines& context);
239 
240  void RenderParticles(
241  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
242  int cullGroup);
243 
244  // shadow rendering stuff
245  void RenderShadowMap(
246  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
247  const CShaderDefines& context);
248 
249  // render water reflection and refraction textures
250  void RenderReflections(
251  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
252  const CShaderDefines& context, const CBoundingBoxAligned& scissor);
253  void RenderRefractions(
254  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
255  const CShaderDefines& context, const CBoundingBoxAligned& scissor);
256 
257  void ComputeReflectionCamera(CCamera& camera, const CBoundingBoxAligned& scissor) const;
258  void ComputeRefractionCamera(CCamera& camera, const CBoundingBoxAligned& scissor) const;
259 
260  // debugging
261  void DisplayFrustum();
262 
263  // enable oblique frustum clipping with the given clip plane
264  void SetObliqueFrustumClipping(CCamera& camera, const CVector4D& clipPlane) const;
265 
266  // Private data that is not needed by inline functions.
267  class Internals;
268  std::unique_ptr<Internals> m;
269 
270  // Current terrain rendering mode.
272  // Current water rendering mode.
274  // Current model rendering mode.
276  // Current overlay rendering mode.
278 
279  /**
280  * m_ViewCamera: determines the eye position for rendering
281  *
282  * @see CGameView::m_ViewCamera
283  */
285 
286  /**
287  * m_CullCamera: determines the frustum for culling and shadowmap calculations
288  *
289  * @see CGameView::m_ViewCamera
290  */
292 
293  // only valid inside a call to RenderScene
296 
298 
299  // current lighting setup
301 
302  /**
303  * Enable rendering of terrain tile priority text overlay, for debugging.
304  */
306 };
307 
308 #endif // INCLUDED_RENDERER_SCENERENDERER
void PrepareSubmissions(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, const CBoundingBoxAligned &waterScissor)
Update and upload all needed data for submitted objects.
Definition: SceneRenderer.cpp:772
void SetDisplayTerrainPriorities(bool enabled)
Definition: SceneRenderer.h:158
ERenderMode GetTerrainRenderMode() const
Definition: SceneRenderer.h:140
Line-based overlay, with world-space coordinates, rendered in the world potentially behind other obje...
Definition: Overlay.h:38
void ResetState()
Resets the render state to default, that was before a game started.
Definition: SceneRenderer.cpp:1202
Particle emitter.
Definition: ParticleEmitter.h:68
void RenderShadowMap(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, const CShaderDefines &context)
Definition: SceneRenderer.cpp:298
void ReloadShaders()
Definition: SceneRenderer.cpp:213
void MakeShadersDirty()
Definition: SceneRenderer.cpp:1167
void SetLightEnv(CLightEnv *lightenv)
Definition: SceneRenderer.h:132
CCamera m_ViewCamera
m_ViewCamera: determines the eye position for rendering
Definition: SceneRenderer.h:284
CBoundingBoxAligned m_WaterScissor
Definition: SceneRenderer.h:297
void SetSimulation(CSimulation2 *simulation)
Set simulation context for rendering purposes.
Definition: SceneRenderer.cpp:292
void RenderParticles(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, int cullGroup)
Definition: SceneRenderer.cpp:754
ERenderMode m_WaterRenderMode
Definition: SceneRenderer.h:273
Definition: SceneRenderer.h:61
Definition: SceneRenderer.h:59
int m_CurrentCullGroup
Definition: SceneRenderer.h:295
CullGroup
Definition: SceneRenderer.h:54
Billboard sprite overlay, with world-space coordinates, rendered on top of all other objects...
Definition: Overlay.h:147
Definition: SceneRenderer.h:49
void RenderTransparentModels(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, const CShaderDefines &context, int cullGroup, ETransparentMode transparentMode)
Definition: SceneRenderer.cpp:392
Class ShadowMap: Maintain the shadow map texture and perform necessary OpenGL setup, including matrix calculations.
Definition: ShadowMap.h:38
ERenderMode GetModelRenderMode() const
Definition: SceneRenderer.h:150
void SetModelRenderMode(ERenderMode mode)
Definition: SceneRenderer.h:148
Struct CSceneRendererInternals: Truly hide data that is supposed to be hidden in this structure so it...
Definition: SceneRenderer.cpp:75
Definition: SceneRenderer.h:46
Definition: Material.h:28
Public API for simulation system.
Definition: Simulation2.h:46
Definition: SceneRenderer.h:64
Definition: Vector4D.h:30
This interface accepts renderable objects.
Definition: Scene.h:89
~CSceneRenderer()
Definition: SceneRenderer.cpp:205
void ComputeRefractionCamera(CCamera &camera, const CBoundingBoxAligned &scissor) const
Definition: SceneRenderer.cpp:509
const CCamera & GetViewCamera() const
Definition: SceneRenderer.h:164
Definition: SceneRenderer.h:51
void SetWaterRenderMode(ERenderMode mode)
Definition: SceneRenderer.h:143
ERenderMode m_ModelRenderMode
Definition: SceneRenderer.h:275
void RenderSceneOverlays(Renderer::Backend::IDeviceCommandContext *deviceCommandContext)
Render overlays of the previously given scene.
Definition: SceneRenderer.cpp:1145
Textured line overlay, with world-space coordinates, rendered in the world onto the terrain...
Definition: Overlay.h:65
Definition: SceneRenderer.h:60
std::unique_ptr< Internals > m
Definition: SceneRenderer.h:267
void ComputeReflectionCamera(CCamera &camera, const CBoundingBoxAligned &scissor) const
Definition: SceneRenderer.cpp:464
void RenderSilhouettes(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, const CShaderDefines &context)
Definition: SceneRenderer.cpp:701
void SetObliqueFrustumClipping(CCamera &camera, const CVector4D &clipPlane) const
Definition: SceneRenderer.cpp:431
void PrepareScene(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, Scene &scene)
Enumerate and submit all objects of the given scene which should be rendered.
Definition: SceneRenderer.cpp:1063
Definition: SceneRenderer.h:56
Definition: Canvas2D.h:35
Scene * m_CurrentScene
Definition: SceneRenderer.h:294
CLightEnv * m_LightEnv
Definition: SceneRenderer.h:300
Definition: Camera.h:41
void DisplayFrustum()
Definition: SceneRenderer.cpp:933
Definition: SceneRenderer.h:46
Definition: Patch.h:48
ERenderMode m_OverlayRenderMode
Definition: SceneRenderer.h:277
void Initialize()
Definition: SceneRenderer.cpp:267
ETransparentMode
Definition: SceneRenderer.h:49
Definition: ParticleManager.h:30
void RenderSubmissions(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, const CBoundingBoxAligned &waterScissor)
Definition: SceneRenderer.cpp:843
TerrainRenderer & GetTerrainRenderer()
Definition: SceneRenderer.cpp:1187
void RenderRefractions(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, const CShaderDefines &context, const CBoundingBoxAligned &scissor)
Definition: SceneRenderer.cpp:624
CMaterialManager & GetMaterialManager()
Definition: SceneRenderer.cpp:1192
Represents a mapping of name strings to value strings, for use with #if and #ifdef and similar condit...
Definition: ShaderDefines.h:146
void BeginFrame()
Definition: SceneRenderer.cpp:285
Definition: SceneRenderer.h:58
Rectangular single-quad terrain overlay, in world space coordinates.
Definition: Overlay.h:160
ShadowMap & GetShadowMap()
Definition: SceneRenderer.cpp:1197
Definition: SceneRenderer.h:49
Definition: Decal.h:49
Definition: SceneRenderer.h:65
void RenderTextOverlays(CCanvas2D &canvas)
Render text overlays on top of the scene.
Definition: SceneRenderer.cpp:940
Definition: BoundingBoxAligned.h:33
void RenderModels(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, const CShaderDefines &context, int cullGroup)
Definition: SceneRenderer.cpp:369
void EndFrame()
Definition: SceneRenderer.cpp:916
CSceneRenderer()
Definition: SceneRenderer.cpp:189
void SetViewCamera(const CCamera &camera)
Definition: SceneRenderer.h:166
bool m_DisplayTerrainPriorities
Enable rendering of terrain tile priority text overlay, for debugging.
Definition: SceneRenderer.h:305
This interface describes a scene to the renderer.
Definition: Scene.h:53
void Resize(int width, int height)
Definition: SceneRenderer.cpp:277
void RenderPatches(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, const CShaderDefines &context, int cullGroup)
Definition: SceneRenderer.cpp:339
const CLightEnv & GetLightEnv()
Definition: SceneRenderer.h:161
Definition: SceneRenderer.h:63
Class TerrainRenderer: Render everything related to the terrain, especially patches and water...
Definition: TerrainRenderer.h:48
Definition: SceneRenderer.h:46
ERenderMode
Definition: SceneRenderer.h:46
void Submit(CPatch *patch) override
Submit a terrain patch that is part of the scene.
Definition: SceneRenderer.cpp:960
ERenderMode GetOverlayRenderMode() const
Definition: SceneRenderer.h:153
const CCamera & GetCullCamera() const
Definition: SceneRenderer.h:169
Definition: MaterialManager.h:25
Definition: Model.h:46
SkyManager & GetSkyManager()
GetSkyManager: Return the renderer&#39;s sky manager.
Definition: SceneRenderer.cpp:1177
CParticleManager & GetParticleManager()
Definition: SceneRenderer.cpp:1182
WaterManager & GetWaterManager()
GetWaterManager: Return the renderer&#39;s water manager.
Definition: SceneRenderer.cpp:1172
Definition: SceneRenderer.h:57
CCamera m_CullCamera
m_CullCamera: determines the frustum for culling and shadowmap calculations
Definition: SceneRenderer.h:291
void SetTerrainRenderMode(ERenderMode mode)
Definition: SceneRenderer.h:138
void SetSceneCamera(const CCamera &viewCamera, const CCamera &cullCamera)
Set up the camera used for rendering the next scene; this includes setting OpenGL state like viewport...
Definition: SceneRenderer.cpp:951
Class CLightEnv: description of a lighting environment - contains all the necessary parameters for re...
Definition: LightEnv.h:36
void RenderReflections(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, const CShaderDefines &context, const CBoundingBoxAligned &scissor)
Definition: SceneRenderer.cpp:547
Scene & GetScene()
Return the scene that is currently being rendered.
Definition: SceneRenderer.cpp:1161
Definition: SceneRenderer.h:62
Definition: IDeviceCommandContext.h:40
void RenderScene(Renderer::Backend::IDeviceCommandContext *deviceCommandContext)
Render submitted objects of the previously given scene.
Definition: SceneRenderer.cpp:1138
void SubmitNonRecursive(CModel *model) override
Submit a model that is part of the scene, without submitting attached models.
Definition: SceneRenderer.cpp:1024
Definition: Overlay.h:168
ERenderMode m_TerrainRenderMode
Definition: SceneRenderer.h:271
ERenderMode GetWaterRenderMode() const
Definition: SceneRenderer.h:145
Definition: SceneRenderer.h:49
void SetOverlayRenderMode(ERenderMode mode)
Definition: SceneRenderer.h:155
Class WaterManager: Maintain rendering-related water settings and textures Anything that affects game...
Definition: WaterManager.h:47
Class SkyManager: Maintain sky settings and textures, and render the sky.
Definition: SkyManager.h:37