Pyrogenesis  13997
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Renderer.h
Go to the documentation of this file.
1 /* Copyright (C) 2012 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 /*
19  * higher level interface on top of OpenGL to render basic objects:
20  * terrain, models, sprites, particles etc.
21  */
22 
23 #ifndef INCLUDED_RENDERER
24 #define INCLUDED_RENDERER
25 
26 #include "graphics/Camera.h"
27 #include "graphics/SColor.h"
28 #include "graphics/ShaderProgram.h"
29 #include "lib/res/handle.h"
30 #include "ps/Singleton.h"
31 
32 #include "graphics/ShaderDefines.h"
34 #include "renderer/Scene.h"
35 #include "renderer/TimeManager.h"
37 
38 // necessary declarations
39 class CLightEnv;
40 class CMaterial;
41 class CMaterialManager;
42 class CModel;
43 class CParticleManager;
44 class CPatch;
45 class CShaderManager;
46 class CSimulation2;
47 class CTextureManager;
48 class CTimeManager;
49 class RenderPathVertexShader;
50 class SkyManager;
51 class TerrainRenderer;
52 class WaterManager;
53 
54 // rendering modes
56 
57 // transparency modes
59 
60 // access to sole renderer object
61 #define g_Renderer CRenderer::GetSingleton()
62 
64 {
65  GLint x1, y1, x2, y2;
66 };
67 
68 ///////////////////////////////////////////////////////////////////////////////////////////
69 // CRenderer: base renderer class - primary interface to the rendering engine
70 struct CRendererInternals;
71 
72 class CRenderer :
73  public Singleton<CRenderer>,
74  private SceneCollector
75 {
76 public:
77  // various enumerations and renderer related constants
78  enum { NumAlphaMaps=14 };
79  enum Option {
94  };
95 
96  enum RenderPath {
97  // If no rendering path is configured explicitly, the renderer
98  // will choose the path when Open() is called.
100 
101  // Classic fixed function.
103 
104  // Use new ARB/GLSL system
106  };
107 
108  // stats class - per frame counts of number of draw calls, poly counts etc
109  struct Stats {
110  // set all stats to zero
111  void Reset() { memset(this, 0, sizeof(*this)); }
112  // number of draw calls per frame - total DrawElements + Begin/End immediate mode loops
113  size_t m_DrawCalls;
114  // number of terrain triangles drawn
116  // number of water triangles drawn
117  size_t m_WaterTris;
118  // number of (non-transparent) model triangles drawn
119  size_t m_ModelTris;
120  // number of overlay triangles drawn
122  // number of splat passes for alphamapping
124  // number of particles
125  size_t m_Particles;
126  };
127 
128  // renderer options
129  struct Options {
130  bool m_NoVBO;
131  bool m_Shadows;
132 
140 
152  bool m_ShowSky;
154  } m_Options;
155 
156  struct Caps {
157  bool m_VBO;
162  bool m_Shadows;
163  };
164 
165 public:
166  // constructor, destructor
167  CRenderer();
168  ~CRenderer();
169 
170  // open up the renderer: performs any necessary initialisation
171  bool Open(int width,int height);
172 
173  // resize renderer view
174  void Resize(int width,int height);
175 
176  // set/get boolean renderer option
177  void SetOptionBool(enum Option opt, bool value);
178  bool GetOptionBool(enum Option opt) const;
179  void SetRenderPath(RenderPath rp);
181  static CStr GetRenderPathName(RenderPath rp);
182  static RenderPath GetRenderPathByName(const CStr& name);
183 
184  // return view width
185  int GetWidth() const { return m_Width; }
186  // return view height
187  int GetHeight() const { return m_Height; }
188  // return view aspect ratio
189  float GetAspect() const { return float(m_Width)/float(m_Height); }
190 
191  // signal frame start
192  void BeginFrame();
193  // signal frame end
194  void EndFrame();
195 
196  /**
197  * Set simulation context for rendering purposes.
198  * Must be called at least once when the game has started and before
199  * frames are rendered.
200  */
201  void SetSimulation(CSimulation2* simulation);
202 
203  // set color used to clear screen in BeginFrame()
204  void SetClearColor(SColor4ub color);
205 
206  // trigger a reload of shaders (when parameters they depend on have changed)
207  void MakeShadersDirty();
208 
209  /**
210  * Set up the camera used for rendering the next scene; this includes
211  * setting OpenGL state like viewport, projection and modelview matrices.
212  *
213  * @param viewCamera this camera determines the eye position for rendering
214  * @param cullCamera this camera determines the frustum for culling in the renderer and
215  * for shadow calculations
216  */
217  void SetSceneCamera(const CCamera& viewCamera, const CCamera& cullCamera);
218 
219  // set the viewport
220  void SetViewport(const SViewPort &);
221 
222  /**
223  * Render the given scene immediately.
224  * @param scene a Scene object describing what should be rendered.
225  */
226  void RenderScene(Scene& scene);
227 
228  /**
229  * Return the scene that is currently being rendered.
230  * Only valid when the renderer is in a RenderScene call.
231  */
232  Scene& GetScene();
233 
234  /**
235  * Render text overlays on top of the scene.
236  * Assumes the caller has set up the GL environment for orthographic rendering
237  * with texturing and blending.
238  */
239  void RenderTextOverlays();
240 
241  // set the current lighting environment; (note: the passed pointer is just copied to a variable within the renderer,
242  // so the lightenv passed must be scoped such that it is not destructed until after the renderer is no longer rendering)
243  void SetLightEnv(CLightEnv* lightenv) {
244  m_LightEnv=lightenv;
245  }
246 
247  // set the mode to render subsequent terrain patches
249  // get the mode to render subsequent terrain patches
251 
252  // set the mode to render subsequent models
254  // get the mode to render subsequent models
256 
257  // debugging
258  void SetDisplayTerrainPriorities(bool enabled) { m_DisplayTerrainPriorities = enabled; }
259 
260  // bind a GL texture object to active unit
261  void BindTexture(int unit, unsigned int tex);
262 
263  // load the default set of alphamaps.
264  // return a negative error code if anything along the way fails.
265  // called via delay-load mechanism.
266  int LoadAlphaMaps();
267  void UnloadAlphaMaps();
268 
269  // return stats accumulated for current frame
270  Stats& GetStats() { return m_Stats; }
271 
272  // return the current light environment
273  const CLightEnv &GetLightEnv() { return *m_LightEnv; }
274 
275  // return the current view camera
276  const CCamera& GetViewCamera() const { return m_ViewCamera; }
277  // replace the current view camera
278  void SetViewCamera(const CCamera& camera) { m_ViewCamera = camera; }
279 
280  // return the current cull camera
281  const CCamera& GetCullCamera() const { return m_CullCamera; }
282 
283  /**
284  * GetWaterManager: Return the renderer's water manager.
285  *
286  * @return the WaterManager object used by the renderer
287  */
289 
290  /**
291  * GetSkyManager: Return the renderer's sky manager.
292  *
293  * @return the SkyManager object used by the renderer
294  */
296 
298 
300 
302 
304 
306 
308 
310 
312 
313  /**
314  * GetCapabilities: Return which OpenGL capabilities are available and enabled.
315  *
316  * @return capabilities structure
317  */
318  const Caps& GetCapabilities() const { return m_Caps; }
319 
320  static void RegisterScriptFunctions(ScriptInterface& scriptInterface);
321 
322 protected:
323  friend struct CRendererInternals;
324  friend class CVertexBuffer;
325  friend class CPatchRData;
326  friend class CDecalRData;
328  friend class ModelRenderer;
330  friend class SortModelRenderer;
336  friend class TerrainRenderer;
337 
338  //BEGIN: Implementation of SceneCollector
339  void Submit(CPatch* patch);
340  void Submit(SOverlayLine* overlay);
341  void Submit(SOverlayTexturedLine* overlay);
342  void Submit(SOverlaySprite* overlay);
343  void Submit(SOverlayQuad* overlay);
344  void Submit(CModelDecal* decal);
345  void Submit(CParticleEmitter* emitter);
347  //END: Implementation of SceneCollector
348 
349  // render any batched objects
350  void RenderSubmissions();
351 
352  // patch rendering stuff
353  void RenderPatches(const CShaderDefines& context, const CFrustum* frustum = 0);
354 
355  // model rendering stuff
356  void RenderModels(const CShaderDefines& context, const CFrustum* frustum = 0);
357  void RenderTransparentModels(const CShaderDefines& context, ETransparentMode transparentMode, const CFrustum* frustum = 0);
358 
359  void RenderSilhouettes(const CShaderDefines& context);
360 
361  void RenderParticles();
362 
363  // shadow rendering stuff
364  void RenderShadowMap(const CShaderDefines& context);
365 
366  // render water reflection and refraction textures
367  SScreenRect RenderReflections(const CShaderDefines& context, const CBoundingBoxAligned& scissor);
368  SScreenRect RenderRefractions(const CShaderDefines& context, const CBoundingBoxAligned& scissor);
369 
370  // debugging
371  void DisplayFrustum();
372 
373  // enable oblique frustum clipping with the given clip plane
374  void SetObliqueFrustumClipping(const CVector4D& clipPlane);
375 
376  void ReloadShaders();
378 
379  // hotloading
380  static Status ReloadChangedFileCB(void* param, const VfsPath& path);
381 
382  // RENDERER DATA:
383  /// Private data that is not needed by inline functions
385  // view width
386  int m_Width;
387  // view height
388  int m_Height;
389  // current terrain rendering mode
391  // current model rendering mode
393 
395 
396  /**
397  * m_ViewCamera: determines the eye position for rendering
398  *
399  * @see CGameView::m_ViewCamera
400  */
402 
403  /**
404  * m_CullCamera: determines the frustum for culling and shadowmap calculations
405  *
406  * @see CGameView::m_ViewCamera
407  */
409 
410  // only valid inside a call to RenderScene
412 
413  // color used to clear screen in BeginFrame
414  float m_ClearColor[4];
415  // current lighting setup
417  // ogl_tex handle of composite alpha map (all the alpha maps packed into one texture)
419  // coordinates of each (untransformed) alpha map within the packed texture
420  struct {
421  float u0,u1,v0,v1;
423  // card capabilities
425  // build card cap bits
426  void EnumCaps();
427  // per-frame renderer stats
429 
430  /**
431  * m_WaterManager: the WaterManager object used for water textures and settings
432  * (e.g. water color, water height)
433  */
435 
436  /**
437  * m_SkyManager: the SkyManager object used for sky textures and settings
438  */
440 
441  /**
442  * m_DisplayFrustum: Render the cull frustum and other data that may be interesting
443  * to evaluate culling and shadow map calculations
444  *
445  * Can be controlled from JS via renderer.displayFrustum
446  */
448 
449  /**
450  * Enable rendering of terrain tile priority text overlay, for debugging.
451  */
453 
454 public:
455  /**
456  * m_ShadowZBias: Z bias used when rendering shadows into a depth texture.
457  * This can be used to control shadowing artifacts.
458  *
459  * Can be accessed via JS as renderer.shadowZBias
460  * ShadowMap uses this for matrix calculation.
461  */
463 
464  /**
465  * m_ShadowMapSize: Size of shadow map, or 0 for default. Typically slow but useful
466  * for high-quality rendering. Changes don't take effect until the shadow map
467  * is regenerated.
468  *
469  * Can be accessed via JS as renderer.shadowMapSize
470  */
472 
473  /**
474  * m_SkipSubmit: Disable the actual submission of rendering commands to OpenGL.
475  * All state setup is still performed as usual.
476  *
477  * Can be accessed via JS as renderer.skipSubmit
478  */
480 };
481 
482 
483 #endif
Render animated models using a ShaderRenderModifier.
bool m_ARBProgram
Definition: Renderer.h:158
GLint y2
Definition: Renderer.h:65
ERenderMode m_TerrainRenderMode
Definition: Renderer.h:390
void SetDisplayTerrainPriorities(bool enabled)
Definition: Renderer.h:258
void SetObliqueFrustumClipping(const CVector4D &clipPlane)
Definition: Renderer.cpp:1085
void ReloadShaders()
Definition: Renderer.cpp:553
void SetClearColor(SColor4ub color)
Definition: Renderer.cpp:857
bool m_ARBProgramShadow
Definition: Renderer.h:143
size_t m_ModelTris
Definition: Renderer.h:119
int m_Height
Definition: Renderer.h:388
Line-based overlay, with world-space coordinates, rendered in the world potentially behind other obje...
Definition: Overlay.h:36
ERenderMode GetTerrainRenderMode() const
Definition: Renderer.h:250
CTimeManager & GetTimeManager()
Definition: Renderer.cpp:1997
Particle emitter.
void SetLightEnv(CLightEnv *lightenv)
Definition: Renderer.h:243
friend class ShaderInstancingModelRenderer
Definition: Renderer.h:335
size_t m_WaterTris
Definition: Renderer.h:117
void Resize(int width, int height)
Definition: Renderer.cpp:655
void EnumCaps()
Definition: Renderer.cpp:494
static RenderPath GetRenderPathByName(const CStr &name)
Definition: Renderer.cpp:817
Definition: Renderer.h:55
Billboard sprite overlay, with world-space coordinates, rendered on top of all other objects...
Definition: Overlay.h:137
CCamera m_CullCamera
m_CullCamera: determines the frustum for culling and shadowmap calculations
Definition: Renderer.h:408
void RecomputeSystemShaderDefines()
Definition: Renderer.cpp:537
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: Renderer.cpp:1677
bool m_ARBProgramShadow
Definition: Renderer.h:159
void SetViewport(const SViewPort &)
Definition: Renderer.cpp:1687
float v1
Definition: Renderer.h:421
friend class PolygonSortModelRenderer
Definition: Renderer.h:329
CShaderDefines m_SystemShaderDefines
Definition: Renderer.h:394
friend class FixedFunctionModelRenderer
Definition: Renderer.h:327
void RenderTransparentModels(const CShaderDefines &context, ETransparentMode transparentMode, const CFrustum *frustum=0)
Definition: Renderer.cpp:1020
bool m_DisplayTerrainPriorities
Enable rendering of terrain tile priority text overlay, for debugging.
Definition: Renderer.h:452
const Caps & GetCapabilities() const
GetCapabilities: Return which OpenGL capabilities are available and enabled.
Definition: Renderer.h:318
Public API for simulation system.
Definition: Simulation2.h:46
static CStr GetRenderPathName(RenderPath rp)
Definition: Renderer.cpp:807
CVertexBuffer: encapsulation of ARB_vertex_buffer_object, also supplying some additional functionalit...
Definition: VertexBuffer.h:40
This interface accepts renderable objects.
Definition: Scene.h:82
CCamera m_ViewCamera
m_ViewCamera: determines the eye position for rendering
Definition: Renderer.h:401
Render non-animated (but potentially moving) models using a ShaderRenderModifier. ...
GLint y1
Definition: Renderer.h:65
SkyManager * m_SkyManager
m_SkyManager: the SkyManager object used for sky textures and settings
Definition: Renderer.h:439
const CCamera & GetCullCamera() const
Definition: Renderer.h:281
CRendererInternals * m
Private data that is not needed by inline functions.
Definition: Renderer.h:384
bool m_WaterReflection
Definition: Renderer.h:138
float GetAspect() const
Definition: Renderer.h:189
float v0
Definition: Renderer.h:421
Texture manager with asynchronous loading and automatic DDS conversion/compression.
bool m_DisplayFrustum
m_DisplayFrustum: Render the cull frustum and other data that may be interesting to evaluate culling ...
Definition: Renderer.h:447
RenderPath m_RenderPath
Definition: Renderer.h:141
Handle m_hCompositeAlphaMap
Definition: Renderer.h:418
void SetTerrainRenderMode(ERenderMode mode)
Definition: Renderer.h:248
size_t m_OverlayTris
Definition: Renderer.h:121
CMaterialManager & GetMaterialManager()
Definition: Renderer.cpp:2002
CLightEnv * m_LightEnv
Definition: Renderer.h:416
Textured line overlay, with world-space coordinates, rendered in the world onto the terrain...
Definition: Overlay.h:62
void DisplayFrustum()
Definition: Renderer.cpp:1636
void SetViewCamera(const CCamera &camera)
Definition: Renderer.h:278
Definition: path.h:75
float m_ShadowZBias
m_ShadowZBias: Z bias used when rendering shadows into a depth texture.
Definition: Renderer.h:462
bool GetOptionBool(enum Option opt) const
Definition: Renderer.cpp:726
friend class RenderPathVertexShader
Definition: Renderer.h:331
Class ModelRenderer: Abstract base class for all model renders.
bool m_VertexShader
Definition: Renderer.h:160
size_t m_BlendSplats
Definition: Renderer.h:123
bool m_WaterCoastalWaves
Definition: Renderer.h:136
void SetSimulation(CSimulation2 *simulation)
Set simulation context for rendering purposes.
Definition: Renderer.cpp:850
Definition: Camera.h:39
int m_ShadowMapSize
m_ShadowMapSize: Size of shadow map, or 0 for default.
Definition: Renderer.h:471
void UnloadAlphaMaps()
Definition: Renderer.cpp:1947
int GetWidth() const
Definition: Renderer.h:185
bool m_WaterRefraction
Definition: Renderer.h:137
Definition: Patch.h:48
i64 Status
Error handling system.
Definition: status.h:171
static Status ReloadChangedFileCB(void *param, const VfsPath &path)
Definition: Renderer.cpp:1955
i64 Handle
`handle&#39; representing a reference to a resource (sound, texture, etc.)
Definition: handle.h:41
void Submit(CPatch *patch)
Submit a terrain patch that is part of the scene.
Definition: Renderer.cpp:1692
const CLightEnv & GetLightEnv()
Definition: Renderer.h:273
GLint x2
Definition: Renderer.h:65
int LoadAlphaMaps()
Definition: Renderer.cpp:1803
RenderPath GetRenderPath() const
Definition: Renderer.h:180
static void RegisterScriptFunctions(ScriptInterface &scriptInterface)
SScreenRect RenderReflections(const CShaderDefines &context, const CBoundingBoxAligned &scissor)
Definition: Renderer.cpp:1121
void EndFrame()
Definition: Renderer.cpp:1603
void RenderParticles()
Definition: Renderer.cpp:1386
CTextureManager & GetTextureManager()
Definition: Renderer.cpp:1977
void RenderSilhouettes(const CShaderDefines &context)
Definition: Renderer.cpp:1284
Represents a mapping of name strings to value strings, for use with #if and #ifdef and similar condit...
float u1
Definition: Renderer.h:421
TerrainRenderer & GetTerrainRenderer()
Definition: Renderer.cpp:1992
void MakeShadersDirty()
Definition: Renderer.cpp:1972
struct CRenderer::@49 m_AlphaMapCoords[NumAlphaMaps]
float u0
Definition: Renderer.h:421
size_t m_Particles
Definition: Renderer.h:125
friend class HWLightingModelRenderer
Definition: Renderer.h:332
int GetHeight() const
Definition: Renderer.h:187
Struct CRendererInternals: Truly hide data that is supposed to be hidden in this structure so it won&#39;...
Definition: Renderer.cpp:235
Rectangular single-quad terrain overlay, in world space coordinates.
Definition: Overlay.h:149
ERenderMode
Definition: Renderer.h:55
WaterManager * m_WaterManager
m_WaterManager: the WaterManager object used for water textures and settings (e.g.
Definition: Renderer.h:434
CShaderManager & GetShaderManager()
Definition: Renderer.cpp:1982
friend class SortModelRenderer
Definition: Renderer.h:330
GLint x1
Definition: Renderer.h:65
bool Open(int width, int height)
Definition: Renderer.cpp:608
static size_t model
Definition: x86_x64.cpp:211
Scene & GetScene()
Return the scene that is currently being rendered.
Definition: Renderer.cpp:1775
WaterManager * GetWaterManager()
GetWaterManager: Return the renderer&#39;s water manager.
Definition: Renderer.h:288
CParticleManager & GetParticleManager()
Definition: Renderer.cpp:1987
ERenderMode GetModelRenderMode() const
Definition: Renderer.h:255
ETransparentMode
Definition: Renderer.h:58
SkyManager * GetSkyManager()
GetSkyManager: Return the renderer&#39;s sky manager.
Definition: Renderer.h:295
void RenderShadowMap(const CShaderDefines &context)
Definition: Renderer.cpp:865
size_t m_TerrainTris
Definition: Renderer.h:115
This interface describes a scene to the renderer.
Definition: Scene.h:51
void SubmitNonRecursive(CModel *model)
Submit a model that is part of the scene, without submitting attached models.
Definition: Renderer.cpp:1727
CShaderDefines GetSystemShaderDefines()
Definition: Renderer.h:307
ERenderMode m_ModelRenderMode
Definition: Renderer.h:392
void SetRenderPath(RenderPath rp)
Definition: Renderer.cpp:769
Class TerrainRenderer: Render everything related to the terrain, especially patches and water...
float m_ClearColor[4]
Definition: Renderer.h:414
Abstraction around a SpiderMonkey JSContext.
void SetOptionBool(enum Option opt, bool value)
Definition: Renderer.cpp:669
void RenderScene(Scene &scene)
Render the given scene immediately.
Definition: Renderer.cpp:1758
Definition: Model.h:50
int m_Width
Definition: Renderer.h:386
const CCamera & GetViewCamera() const
Definition: Renderer.h:276
void RenderModels(const CShaderDefines &context, const CFrustum *frustum=0)
Definition: Renderer.cpp:979
SScreenRect RenderRefractions(const CShaderDefines &context, const CBoundingBoxAligned &scissor)
Definition: Renderer.cpp:1208
Class CLightEnv: description of a lighting environment - contains all the necessary parameters for re...
Definition: LightEnv.h:36
bool m_FragmentShader
Definition: Renderer.h:161
Stats m_Stats
Definition: Renderer.h:428
bool m_SkipSubmit
m_SkipSubmit: Disable the actual submission of rendering commands to OpenGL.
Definition: Renderer.h:479
Stats & GetStats()
Definition: Renderer.h:270
void RenderTextOverlays()
Render text overlays on top of the scene.
Definition: Renderer.cpp:1663
void SetModelRenderMode(ERenderMode mode)
Definition: Renderer.h:253
Shader manager: loads and caches shader programs.
Definition: ShaderManager.h:42
Scene * m_CurrentScene
Definition: Renderer.h:411
size_t m_DrawCalls
Definition: Renderer.h:113
void BeginFrame()
Definition: Renderer.cpp:833
void BindTexture(int unit, unsigned int tex)
Definition: Renderer.cpp:1783
Caps m_Caps
Definition: Renderer.h:424
struct CRenderer::Options m_Options
void RenderPatches(const CShaderDefines &context, const CFrustum *frustum=0)
Definition: Renderer.cpp:900
CPostprocManager & GetPostprocManager()
Definition: Renderer.cpp:2007
Class WaterManager: Maintain water settings and textures.
Definition: WaterManager.h:49
void RenderSubmissions()
Definition: Renderer.cpp:1423
Class SkyManager: Maintain sky settings and textures, and render the sky.
Definition: SkyManager.h:30