Pyrogenesis  trunk
Renderer.h
Go to the documentation of this file.
1 /* Copyright (C) 2023 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
19 #define INCLUDED_RENDERER
20 
21 #include "graphics/Camera.h"
22 #include "graphics/ShaderDefines.h"
24 #include "ps/containers/Span.h"
25 #include "ps/Singleton.h"
29 #include "renderer/Scene.h"
30 
31 #include <memory>
32 
33 class CDebugRenderer;
34 class CFontManager;
35 class CPostprocManager;
36 class CSceneRenderer;
37 class CShaderManager;
38 class CTextureManager;
39 class CTimeManager;
40 
41 #define g_Renderer CRenderer::GetSingleton()
42 
43 /**
44  * Higher level interface on top of the whole frame rendering. It does know
45  * what should be rendered and via which renderer but shouldn't know how to
46  * render a particular area, like UI or scene.
47  */
48 class CRenderer : public Singleton<CRenderer>
49 {
50 public:
51  // stats class - per frame counts of number of draw calls, poly counts etc
52  struct Stats
53  {
54  // set all stats to zero
55  void Reset() { memset(this, 0, sizeof(*this)); }
56  // number of draw calls per frame - total DrawElements + Begin/End immediate mode loops
57  size_t m_DrawCalls;
58  // number of terrain triangles drawn
59  size_t m_TerrainTris;
60  // number of water triangles drawn
61  size_t m_WaterTris;
62  // number of (non-transparent) model triangles drawn
63  size_t m_ModelTris;
64  // number of overlay triangles drawn
65  size_t m_OverlayTris;
66  // number of splat passes for alphamapping
67  size_t m_BlendSplats;
68  // number of particles
69  size_t m_Particles;
70  };
71 
72  enum class ScreenShotType
73  {
74  NONE,
75  DEFAULT,
76  BIG
77  };
78 
79 public:
80  CRenderer();
81  ~CRenderer();
82 
83  // open up the renderer: performs any necessary initialisation
84  bool Open(int width, int height);
85 
86  // resize renderer view
87  void Resize(int width, int height);
88 
89  // return view width
90  int GetWidth() const { return m_Width; }
91  // return view height
92  int GetHeight() const { return m_Height; }
93 
94  void RenderFrame(bool needsPresent);
95 
96  // signal frame start
97  void BeginFrame();
98  // signal frame end
99  void EndFrame();
100 
101  // trigger a reload of shaders (when parameters they depend on have changed)
102  void MakeShadersDirty();
103 
104  // return stats accumulated for current frame
105  Stats& GetStats() { return m_Stats; }
106 
108 
110 
112 
114 
116 
118 
120 
121  /**
122  * Performs a complete frame without presenting to force loading all needed
123  * resources. It's used for the first frame on a game start.
124  * TODO: It might be better to preload resources without a complete frame
125  * rendering.
126  */
128 
129  /**
130  * Makes a screenshot on the next RenderFrame according of the given
131  * screenshot type.
132  */
133  void MakeScreenShotOnNextFrame(ScreenShotType screenShotType);
134 
136 
137  /**
138  * Returns a cached vertex input layout. The renderer owns the layout to be
139  * able to share it between different clients. As backend should have
140  * as few different layouts as possible.
141  * The function isn't cheap so it should be called as rarely as possible.
142  * TODO: we need to make VertexArray less error prone by passing layout.
143  */
146 
147 protected:
148  friend class CPatchRData;
149  friend class CDecalRData;
153  friend class CRenderingOptions;
154 
155  bool ShouldRender() const;
156 
157  void RenderFrameImpl(const bool renderGUI, const bool renderLogger);
158  void RenderFrame2D(const bool renderGUI, const bool renderLogger);
159  void RenderScreenShot(const bool needsPresent);
160  void RenderBigScreenShot(const bool needsPresent);
161 
162  // SetRenderPath: Select the preferred render path.
163  // This may only be called before Open(), because the layout of vertex arrays and other
164  // data may depend on the chosen render path.
165  void SetRenderPath(RenderPath rp);
166 
167  void ReloadShaders();
168 
169  // Private data that is not needed by inline functions.
170  class Internals;
171  std::unique_ptr<Internals> m;
172  // view width
173  int m_Width = 0;
174  // view height
175  int m_Height = 0;
176 
177  // per-frame renderer stats
179 
181 
183 };
184 
185 #endif // INCLUDED_RENDERER
Render animated models using a ShaderRenderModifier.
Definition: HWLightingModelRenderer.h:33
~CRenderer()
Definition: Renderer.cpp:337
Definition: DecalRData.h:35
void ReloadShaders()
Definition: Renderer.cpp:347
size_t m_ModelTris
Definition: Renderer.h:63
void PreloadResourcesBeforeNextFrame()
Performs a complete frame without presenting to force loading all needed resources.
Definition: Renderer.cpp:871
int m_Height
Definition: Renderer.h:175
std::unique_ptr< Internals > m
Definition: Renderer.h:170
Renderer::Backend::IDeviceCommandContext * GetDeviceCommandContext()
Definition: Renderer.cpp:881
CTimeManager & GetTimeManager()
Definition: Renderer.cpp:846
int GetWidth() const
Definition: Renderer.h:90
void RenderFrameImpl(const bool renderGUI, const bool renderLogger)
Definition: Renderer.cpp:465
size_t m_WaterTris
Definition: Renderer.h:61
void Resize(int width, int height)
Definition: Renderer.cpp:376
CDebugRenderer & GetDebugRenderer()
Definition: Renderer.cpp:861
#define DEFAULT(name)
Definition: mocks_test.cpp:29
IVertexInputLayout stores precompiled list of vertex attributes.
Definition: IShaderProgram.h:73
CFontManager & GetFontManager()
Definition: Renderer.cpp:866
ScreenShotType m_ScreenShotType
Definition: Renderer.h:182
CRenderer()
Definition: Renderer.cpp:309
int GetHeight() const
Definition: Renderer.h:92
Definition: RenderingOptions.h:68
Render non-animated (but potentially moving) models using a ShaderRenderModifier. ...
Definition: InstancingModelRenderer.h:35
Definition: TimeManager.h:21
Definition: SceneRenderer.h:51
Definition: DebugRenderer.h:38
Texture manager with asynchronous loading and automatic DDS conversion/compression.
Definition: TextureManager.h:72
Renderer::Backend::IVertexInputLayout * GetVertexInputLayout(const PS::span< const Renderer::Backend::SVertexAttributeFormat > attributes)
Returns a cached vertex input layout.
Definition: Renderer.cpp:886
size_t m_OverlayTris
Definition: Renderer.h:65
void RenderBigScreenShot(const bool needsPresent)
Definition: Renderer.cpp:689
void MakeScreenShotOnNextFrame(ScreenShotType screenShotType)
Makes a screenshot on the next RenderFrame according of the given screenshot type.
Definition: Renderer.cpp:876
bool ShouldRender() const
Definition: Renderer.cpp:421
RenderPath
Definition: RenderingOptions.h:35
size_t m_BlendSplats
Definition: Renderer.h:67
Definition: PatchRData.h:41
Font manager: loads and caches bitmap fonts.
Definition: FontManager.h:30
Definition: Renderer.h:52
void EndFrame()
Definition: Renderer.cpp:823
CTextureManager & GetTextureManager()
Definition: Renderer.cpp:836
void MakeShadersDirty()
Definition: Renderer.cpp:830
size_t m_Particles
Definition: Renderer.h:69
friend class HWLightingModelRenderer
Definition: Renderer.h:150
CShaderManager & GetShaderManager()
Definition: Renderer.cpp:841
bool Open(int width, int height)
Definition: Renderer.cpp:355
size_t m_TerrainTris
Definition: Renderer.h:59
Definition: PostprocManager.h:31
void RenderFrame2D(const bool renderGUI, const bool renderLogger)
Definition: Renderer.cpp:603
void Reset()
Definition: Renderer.h:55
void SetRenderPath(RenderPath rp)
Definition: Renderer.cpp:386
Higher level interface on top of the whole frame rendering.
Definition: Renderer.h:48
Template base class for singletons.
Definition: Singleton.h:33
ScreenShotType
Definition: Renderer.h:72
void RenderScreenShot(const bool needsPresent)
Definition: Renderer.cpp:641
bool m_ShouldPreloadResourcesBeforeNextFrame
Definition: Renderer.h:180
int m_Width
Definition: Renderer.h:173
void RenderFrame(bool needsPresent)
Definition: Renderer.cpp:426
Stats m_Stats
Definition: Renderer.h:178
Definition: IDeviceCommandContext.h:40
Stats & GetStats()
Definition: Renderer.h:105
Struct CRendererInternals: Truly hide data that is supposed to be hidden in this structure so it won&#39;...
Definition: Renderer.cpp:242
Shader manager: loads and caches shader programs.
Definition: ShaderManager.h:37
CSceneRenderer & GetSceneRenderer()
Definition: Renderer.cpp:856
size_t m_DrawCalls
Definition: Renderer.h:57
Simplifed version of std::span (C++20) as we don&#39;t support the original one yet.
Definition: Span.h:36
void BeginFrame()
Definition: Renderer.cpp:810
CPostprocManager & GetPostprocManager()
Definition: Renderer.cpp:851