Pyrogenesis  trunk
RenderModifiers.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 /*
19  * RenderModifiers can affect the fragment stage behaviour of some
20  * ModelRenderers. This file defines some common RenderModifiers in
21  * addition to the base class.
22  *
23  * TODO: See comment in CRendererInternals::Models - we no longer use multiple
24  * subclasses of RenderModifier, so most of the stuff here is unnecessary
25  * abstraction which should probably be cleaned up.
26  */
27 
28 #ifndef INCLUDED_RENDERMODIFIERS
29 #define INCLUDED_RENDERMODIFIERS
30 
31 #include "ModelRenderer.h"
32 #include "graphics/Color.h"
33 #include "graphics/ShaderProgram.h"
35 #include "graphics/Texture.h"
36 
37 class CLightEnv;
38 class CModel;
39 class ShadowMap;
40 
41 /**
42  * Class RenderModifier: Some ModelRenderer implementations provide vertex
43  * management behaviour but allow fragment stages to be modified by a plugged in
44  * RenderModifier.
45  *
46  * You should use RenderModifierPtr when referencing RenderModifiers.
47  */
49 {
50 public:
52  virtual ~RenderModifier() { }
53 
54  /**
55  * BeginPass: Setup OpenGL for the given rendering pass.
56  *
57  * Must be implemented by derived classes.
58  */
59  virtual void BeginPass(
60  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
62 
63  /**
64  * PrepareModel: Called before rendering the given model.
65  *
66  * Default behaviour does nothing.
67  *
68  * @param model The model that is about to be rendered.
69  */
70  virtual void PrepareModel(
71  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
72  CModel* model) = 0;
73 };
74 
75 
76 /**
77  * Class LitRenderModifier: Abstract base class for RenderModifiers that apply
78  * a shadow map.
79  * LitRenderModifiers expect the diffuse brightness in the primary color (instead of ambient + diffuse).
80  */
82 {
83 public:
86 
87  /**
88  * SetShadowMap: Set the shadow map that will be used for rendering.
89  * Must be called by the user of the RenderModifier.
90  *
91  * The shadow map must be non-null and use depth texturing, or subsequent rendering
92  * using this RenderModifier will fail.
93  *
94  * @param shadow the shadow map
95  */
96  void SetShadowMap(const ShadowMap* shadow);
97 
98  /**
99  * SetLightEnv: Set the light environment that will be used for rendering.
100  * Must be called by the user of the RenderModifier.
101  *
102  * @param lightenv the light environment (must be non-null)
103  */
104  void SetLightEnv(const CLightEnv* lightenv);
105 
106  const ShadowMap* GetShadowMap() const { return m_Shadow; }
107  const CLightEnv* GetLightEnv() const { return m_LightEnv; }
108 
109 private:
112 };
113 
114 /**
115  * A RenderModifier that sets uniforms and textures appropriately for rendering models.
116  */
118 {
119 public:
121 
122  // Implementation
123  void BeginPass(
124  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
125  Renderer::Backend::IShaderProgram* shader) override;
126  void PrepareModel(
127  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
128  CModel* model) override;
129 
130 private:
131  int32_t m_BindingInstancingTransform = -1;
132  int32_t m_BindingShadingColor = -1;
133  int32_t m_BindingPlayerColor = -1;
134 
135  CColor m_ShadingColor, m_PlayerColor;
136 };
137 
138 #endif // INCLUDED_RENDERMODIFIERS
virtual ~RenderModifier()
Definition: RenderModifiers.h:52
const CLightEnv * GetLightEnv() const
Definition: RenderModifiers.h:107
Definition: Color.h:42
Class ShadowMap: Maintain the shadow map texture and perform necessary OpenGL setup, including matrix calculations.
Definition: ShadowMap.h:38
const ShadowMap * GetShadowMap() const
Definition: RenderModifiers.h:106
const CLightEnv * m_LightEnv
Definition: RenderModifiers.h:111
CColor m_ShadingColor
Definition: RenderModifiers.h:135
virtual void PrepareModel(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, CModel *model)=0
PrepareModel: Called before rendering the given model.
virtual void BeginPass(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, Renderer::Backend::IShaderProgram *shader)=0
BeginPass: Setup OpenGL for the given rendering pass.
IShaderProgram is a container for multiple shaders of different types.
Definition: IShaderProgram.h:80
const ShadowMap * m_Shadow
Definition: RenderModifiers.h:110
A RenderModifier that sets uniforms and textures appropriately for rendering models.
Definition: RenderModifiers.h:117
Class RenderModifier: Some ModelRenderer implementations provide vertex management behaviour but allo...
Definition: RenderModifiers.h:48
Definition: Model.h:46
RenderModifier()
Definition: RenderModifiers.h:51
Class CLightEnv: description of a lighting environment - contains all the necessary parameters for re...
Definition: LightEnv.h:36
Definition: IDeviceCommandContext.h:40
Class LitRenderModifier: Abstract base class for RenderModifiers that apply a shadow map...
Definition: RenderModifiers.h:81