Line data Source code
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"
34 : #include "graphics/ShaderTechnique.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 : */
48 : class RenderModifier
49 : {
50 : public:
51 0 : RenderModifier() { }
52 0 : 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,
61 : Renderer::Backend::IShaderProgram* shader) = 0;
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 : */
81 : class LitRenderModifier : public RenderModifier
82 : {
83 : public:
84 : LitRenderModifier();
85 : ~LitRenderModifier();
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 0 : const ShadowMap* GetShadowMap() const { return m_Shadow; }
107 0 : const CLightEnv* GetLightEnv() const { return m_LightEnv; }
108 :
109 : private:
110 : const ShadowMap* m_Shadow;
111 : const CLightEnv* m_LightEnv;
112 : };
113 :
114 : /**
115 : * A RenderModifier that sets uniforms and textures appropriately for rendering models.
116 : */
117 0 : class ShaderRenderModifier : public LitRenderModifier
118 : {
119 : public:
120 : ShaderRenderModifier();
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
|