source: ps/trunk/source/renderer/SceneRenderer.h@ 27232

Last change on this file since 27232 was 27232, checked in by Vladislav Belov, 21 months ago

Moves post processing out of scene rendering to avoid framebuffer pass duplicate.

Comments By: phosit, Stan

Differential Revision: https://code.wildfiregames.com/D4827

  • Property svn:eol-style set to native
File size: 9.3 KB
Line 
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"
23#include "graphics/ShaderProgramPtr.h"
24#include "maths/BoundingBoxAligned.h"
25#include "ps/Singleton.h"
26#include "renderer/backend/IDeviceCommandContext.h"
27#include "renderer/RenderingOptions.h"
28#include "renderer/Scene.h"
29
30#include <memory>
31
32class CCanvas2D;
33class CLightEnv;
34class CMaterial;
35class CMaterialManager;
36class CModel;
37class CParticleManager;
38class CPatch;
39class CSimulation2;
40class ShadowMap;
41class SkyManager;
42class TerrainRenderer;
43class WaterManager;
44
45// rendering modes
46enum ERenderMode { WIREFRAME, SOLID, EDGED_FACES };
47
48// transparency modes
49enum ETransparentMode { TRANSPARENT, TRANSPARENT_OPAQUE, TRANSPARENT_BLEND };
50
51class CSceneRenderer : public SceneCollector
52{
53public:
54 enum CullGroup
55 {
56 CULL_DEFAULT,
57 CULL_SHADOWS_CASCADE_0,
58 CULL_SHADOWS_CASCADE_1,
59 CULL_SHADOWS_CASCADE_2,
60 CULL_SHADOWS_CASCADE_3,
61 CULL_REFLECTIONS,
62 CULL_REFRACTIONS,
63 CULL_SILHOUETTE_OCCLUDER,
64 CULL_SILHOUETTE_CASTER,
65 CULL_MAX
66 };
67
68 CSceneRenderer();
69 ~CSceneRenderer();
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
138 void SetTerrainRenderMode(ERenderMode mode) { m_TerrainRenderMode = mode; }
139 // get the mode to render subsequent terrain patches
140 ERenderMode GetTerrainRenderMode() const { return m_TerrainRenderMode; }
141
142 // set the mode to render subsequent water patches
143 void SetWaterRenderMode(ERenderMode mode) { m_WaterRenderMode = mode; }
144 // get the mode to render subsequent water patches
145 ERenderMode GetWaterRenderMode() const { return m_WaterRenderMode; }
146
147 // set the mode to render subsequent models
148 void SetModelRenderMode(ERenderMode mode) { m_ModelRenderMode = mode; }
149 // get the mode to render subsequent models
150 ERenderMode GetModelRenderMode() const { return m_ModelRenderMode; }
151
152 // Get the mode to render subsequent overlays.
153 ERenderMode GetOverlayRenderMode() const { return m_OverlayRenderMode; }
154 // Set the mode to render subsequent overlays.
155 void SetOverlayRenderMode(ERenderMode mode) { m_OverlayRenderMode = mode; }
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 */
176 WaterManager& GetWaterManager();
177
178 /**
179 * GetSkyManager: Return the renderer's sky manager.
180 *
181 * @return the SkyManager object used by the renderer
182 */
183 SkyManager& GetSkyManager();
184
185 CParticleManager& GetParticleManager();
186
187 TerrainRenderer& GetTerrainRenderer();
188
189 CMaterialManager& GetMaterialManager();
190
191 ShadowMap& GetShadowMap();
192
193 /**
194 * Resets the render state to default, that was before a game started
195 */
196 void ResetState();
197
198 void ReloadShaders();
199
200protected:
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);
232 void RenderTransparentModels(
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.
271 ERenderMode m_TerrainRenderMode;
272 // Current water rendering mode.
273 ERenderMode m_WaterRenderMode;
274 // Current model rendering mode.
275 ERenderMode m_ModelRenderMode;
276 // Current overlay rendering mode.
277 ERenderMode m_OverlayRenderMode;
278
279 /**
280 * m_ViewCamera: determines the eye position for rendering
281 *
282 * @see CGameView::m_ViewCamera
283 */
284 CCamera m_ViewCamera;
285
286 /**
287 * m_CullCamera: determines the frustum for culling and shadowmap calculations
288 *
289 * @see CGameView::m_ViewCamera
290 */
291 CCamera m_CullCamera;
292
293 // only valid inside a call to RenderScene
294 Scene* m_CurrentScene;
295 int m_CurrentCullGroup;
296
297 CBoundingBoxAligned m_WaterScissor;
298
299 // current lighting setup
300 CLightEnv* m_LightEnv;
301
302 /**
303 * Enable rendering of terrain tile priority text overlay, for debugging.
304 */
305 bool m_DisplayTerrainPriorities;
306};
307
308#endif // INCLUDED_RENDERER_SCENERENDERER
Note: See TracBrowser for help on using the repository browser.