]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/OpenGL/FixedPipelineRenderer.cpp
bcf99ac685cafd75b660331aef86cccf90724726
[irrlicht.git] / source / Irrlicht / OpenGL / FixedPipelineRenderer.cpp
1 // Copyright (C) 2014 Patryk Nadrowski\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in Irrlicht.h\r
4 \r
5 #include "FixedPipelineRenderer.h"\r
6 \r
7 #include "IVideoDriver.h"\r
8 \r
9 namespace irr\r
10 {\r
11 namespace video\r
12 {\r
13 \r
14 // Base callback\r
15 \r
16 COpenGL3MaterialBaseCB::COpenGL3MaterialBaseCB() :\r
17         FirstUpdateBase(true), WVPMatrixID(-1), WVMatrixID(-1), NMatrixID(-1), GlobalAmbientID(-1), MaterialAmbientID(-1), MaterialDiffuseID(-1), MaterialEmissiveID(-1), MaterialSpecularID(-1), MaterialShininessID(-1),\r
18         FogEnableID(-1), FogTypeID(-1), FogColorID(-1), FogStartID(-1),\r
19         FogEndID(-1), FogDensityID(-1), ThicknessID(-1), LightEnable(false), MaterialAmbient(SColorf(0.f, 0.f, 0.f)), MaterialDiffuse(SColorf(0.f, 0.f, 0.f)), MaterialEmissive(SColorf(0.f, 0.f, 0.f)), MaterialSpecular(SColorf(0.f, 0.f, 0.f)),\r
20         MaterialShininess(0.f), FogEnable(0), FogType(1), FogColor(SColorf(0.f, 0.f, 0.f, 1.f)), FogStart(0.f), FogEnd(0.f), FogDensity(0.f), Thickness(1.f)\r
21 {\r
22 }\r
23 \r
24 void COpenGL3MaterialBaseCB::OnSetMaterial(const SMaterial& material)\r
25 {\r
26         LightEnable = material.Lighting;\r
27         MaterialAmbient = SColorf(material.AmbientColor);\r
28         MaterialDiffuse = SColorf(material.DiffuseColor);\r
29         MaterialEmissive = SColorf(material.EmissiveColor);\r
30         MaterialSpecular = SColorf(material.SpecularColor);\r
31         MaterialShininess = material.Shininess;\r
32 \r
33         FogEnable = material.FogEnable ? 1 : 0;\r
34 \r
35         Thickness = (material.Thickness > 0.f) ? material.Thickness : 1.f;\r
36 }\r
37 \r
38 void COpenGL3MaterialBaseCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)\r
39 {\r
40         IVideoDriver* driver = services->getVideoDriver();\r
41 \r
42         if (FirstUpdateBase)\r
43         {\r
44                 WVPMatrixID = services->getVertexShaderConstantID("uWVPMatrix");\r
45                 WVMatrixID = services->getVertexShaderConstantID("uWVMatrix");\r
46                 NMatrixID = services->getVertexShaderConstantID("uNMatrix");\r
47                 GlobalAmbientID = services->getVertexShaderConstantID("uGlobalAmbient");\r
48                 MaterialAmbientID = services->getVertexShaderConstantID("uMaterialAmbient");\r
49                 MaterialDiffuseID = services->getVertexShaderConstantID("uMaterialDiffuse");\r
50                 MaterialEmissiveID = services->getVertexShaderConstantID("uMaterialEmissive");\r
51                 MaterialSpecularID = services->getVertexShaderConstantID("uMaterialSpecular");\r
52                 MaterialShininessID = services->getVertexShaderConstantID("uMaterialShininess");\r
53                 FogEnableID = services->getVertexShaderConstantID("uFogEnable");\r
54                 FogTypeID = services->getVertexShaderConstantID("uFogType");\r
55                 FogColorID = services->getVertexShaderConstantID("uFogColor");\r
56                 FogStartID = services->getVertexShaderConstantID("uFogStart");\r
57                 FogEndID = services->getVertexShaderConstantID("uFogEnd");\r
58                 FogDensityID = services->getVertexShaderConstantID("uFogDensity");\r
59                 ThicknessID = services->getVertexShaderConstantID("uThickness");\r
60 \r
61                 FirstUpdateBase = false;\r
62         }\r
63 \r
64         const core::matrix4 W = driver->getTransform(ETS_WORLD);\r
65         const core::matrix4 V = driver->getTransform(ETS_VIEW);\r
66         const core::matrix4 P = driver->getTransform(ETS_PROJECTION);\r
67 \r
68         core::matrix4 Matrix = P * V * W;\r
69         services->setPixelShaderConstant(WVPMatrixID, Matrix.pointer(), 16);\r
70 \r
71         Matrix = V * W;\r
72         services->setPixelShaderConstant(WVMatrixID, Matrix.pointer(), 16);\r
73 \r
74         Matrix.makeInverse();\r
75         services->setPixelShaderConstant(NMatrixID, Matrix.getTransposed().pointer(), 16);\r
76 \r
77         services->setPixelShaderConstant(FogEnableID, &FogEnable, 1);\r
78 \r
79         if (FogEnable)\r
80         {\r
81                 SColor TempColor(0);\r
82                 E_FOG_TYPE TempType = EFT_FOG_LINEAR;\r
83                 bool TempPerFragment = false;\r
84                 bool TempRange = false;\r
85 \r
86                 driver->getFog(TempColor, TempType, FogStart, FogEnd, FogDensity, TempPerFragment, TempRange);\r
87 \r
88                 FogType = (s32)TempType;\r
89                 FogColor = SColorf(TempColor);\r
90 \r
91                 services->setPixelShaderConstant(FogTypeID, &FogType, 1);\r
92                 services->setPixelShaderConstant(FogColorID, reinterpret_cast<f32*>(&FogColor), 4);\r
93                 services->setPixelShaderConstant(FogStartID, &FogStart, 1);\r
94                 services->setPixelShaderConstant(FogEndID, &FogEnd, 1);\r
95                 services->setPixelShaderConstant(FogDensityID, &FogDensity, 1);\r
96         }\r
97 \r
98         services->setPixelShaderConstant(ThicknessID, &Thickness, 1);\r
99 }\r
100 \r
101 // EMT_SOLID + EMT_TRANSPARENT_ADD_COLOR + EMT_TRANSPARENT_ALPHA_CHANNEL + EMT_TRANSPARENT_VERTEX_ALPHA\r
102 \r
103 COpenGL3MaterialSolidCB::COpenGL3MaterialSolidCB() :\r
104         FirstUpdate(true), TMatrix0ID(-1), AlphaRefID(-1), TextureUsage0ID(-1), TextureUnit0ID(-1), AlphaRef(0.5f), TextureUsage0(0), TextureUnit0(0)\r
105 {\r
106 }\r
107 \r
108 void COpenGL3MaterialSolidCB::OnSetMaterial(const SMaterial& material)\r
109 {\r
110         COpenGL3MaterialBaseCB::OnSetMaterial(material);\r
111 \r
112         AlphaRef = material.MaterialTypeParam;\r
113         TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;\r
114 }\r
115 \r
116 void COpenGL3MaterialSolidCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)\r
117 {\r
118         COpenGL3MaterialBaseCB::OnSetConstants(services, userData);\r
119 \r
120         IVideoDriver* driver = services->getVideoDriver();\r
121 \r
122         if (FirstUpdate)\r
123         {\r
124                 TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0");\r
125                 AlphaRefID = services->getVertexShaderConstantID("uAlphaRef");\r
126                 TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0");\r
127                 TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0");\r
128 \r
129                 FirstUpdate = false;\r
130         }\r
131 \r
132         core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);\r
133         services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);\r
134 \r
135         services->setPixelShaderConstant(AlphaRefID, &AlphaRef, 1);\r
136         services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);\r
137         services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);\r
138 }\r
139 \r
140 // EMT_SOLID_2_LAYER + EMT_DETAIL_MAP\r
141 \r
142 COpenGL3MaterialSolid2CB::COpenGL3MaterialSolid2CB() :\r
143         FirstUpdate(true), TMatrix0ID(-1), TMatrix1ID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1),\r
144         TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1)\r
145 {\r
146 }\r
147 \r
148 void COpenGL3MaterialSolid2CB::OnSetMaterial(const SMaterial& material)\r
149 {\r
150         COpenGL3MaterialBaseCB::OnSetMaterial(material);\r
151 \r
152         TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;\r
153         TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0;\r
154 }\r
155 \r
156 void COpenGL3MaterialSolid2CB::OnSetConstants(IMaterialRendererServices* services, s32 userData)\r
157 {\r
158         COpenGL3MaterialBaseCB::OnSetConstants(services, userData);\r
159 \r
160         IVideoDriver* driver = services->getVideoDriver();\r
161 \r
162         if (FirstUpdate)\r
163         {\r
164                 TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0");\r
165                 TMatrix1ID = services->getVertexShaderConstantID("uTMatrix1");\r
166                 TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0");\r
167                 TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1");\r
168                 TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0");\r
169                 TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1");\r
170 \r
171                 FirstUpdate = false;\r
172         }\r
173 \r
174         core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);\r
175         services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);\r
176 \r
177         Matrix = driver->getTransform(E_TRANSFORMATION_STATE(ETS_TEXTURE_0 + 1));\r
178         services->setPixelShaderConstant(TMatrix1ID, Matrix.pointer(), 16);\r
179 \r
180         services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);\r
181         services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1);\r
182         services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);\r
183         services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1);\r
184 }\r
185 \r
186 // EMT_LIGHTMAP + EMT_LIGHTMAP_ADD + EMT_LIGHTMAP_M2 + EMT_LIGHTMAP_M4\r
187 \r
188 COpenGL3MaterialLightmapCB::COpenGL3MaterialLightmapCB(float modulate) :\r
189         FirstUpdate(true), TMatrix0ID(-1), TMatrix1ID(-1), ModulateID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1),\r
190         Modulate(modulate), TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1)\r
191 {\r
192 }\r
193 \r
194 void COpenGL3MaterialLightmapCB::OnSetMaterial(const SMaterial& material)\r
195 {\r
196         COpenGL3MaterialBaseCB::OnSetMaterial(material);\r
197 \r
198         TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;\r
199         TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0;\r
200 }\r
201 \r
202 void COpenGL3MaterialLightmapCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)\r
203 {\r
204         COpenGL3MaterialBaseCB::OnSetConstants(services, userData);\r
205 \r
206         IVideoDriver* driver = services->getVideoDriver();\r
207 \r
208         if (FirstUpdate)\r
209         {\r
210                 TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0");\r
211                 TMatrix1ID = services->getVertexShaderConstantID("uTMatrix1");\r
212                 ModulateID = services->getVertexShaderConstantID("uModulate");\r
213                 TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0");\r
214                 TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1");\r
215                 TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0");\r
216                 TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1");\r
217 \r
218                 FirstUpdate = false;\r
219         }\r
220 \r
221         core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);\r
222         services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);\r
223 \r
224         Matrix = driver->getTransform(E_TRANSFORMATION_STATE(ETS_TEXTURE_0 + 1));\r
225         services->setPixelShaderConstant(TMatrix1ID, Matrix.pointer(), 16);\r
226 \r
227         services->setPixelShaderConstant(ModulateID, &Modulate, 1);\r
228         services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);\r
229         services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1);\r
230         services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);\r
231         services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1);\r
232 }\r
233 \r
234 // EMT_SPHERE_MAP + EMT_REFLECTION_2_LAYER + EMT_TRANSPARENT_REFLECTION_2_LAYER\r
235 \r
236 COpenGL3MaterialReflectionCB::COpenGL3MaterialReflectionCB() :\r
237         FirstUpdate(true), TMatrix0ID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1),\r
238         TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1)\r
239 {\r
240 }\r
241 \r
242 void COpenGL3MaterialReflectionCB::OnSetMaterial(const SMaterial& material)\r
243 {\r
244         COpenGL3MaterialBaseCB::OnSetMaterial(material);\r
245 \r
246         TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;\r
247         TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0;\r
248 }\r
249 \r
250 void COpenGL3MaterialReflectionCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)\r
251 {\r
252         COpenGL3MaterialBaseCB::OnSetConstants(services, userData);\r
253 \r
254         IVideoDriver* driver = services->getVideoDriver();\r
255 \r
256         if (FirstUpdate)\r
257         {\r
258                 TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0");\r
259                 TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0");\r
260                 TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1");\r
261                 TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0");\r
262                 TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1");\r
263 \r
264                 FirstUpdate = false;\r
265         }\r
266 \r
267         core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);\r
268         services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);\r
269 \r
270         services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);\r
271         services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1);\r
272         services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);\r
273         services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1);\r
274 }\r
275 \r
276 // EMT_ONETEXTURE_BLEND\r
277 \r
278 COpenGL3MaterialOneTextureBlendCB::COpenGL3MaterialOneTextureBlendCB() :\r
279         FirstUpdate(true), TMatrix0ID(-1), BlendTypeID(-1), TextureUsage0ID(-1), TextureUnit0ID(-1), BlendType(0), TextureUsage0(0), TextureUnit0(0)\r
280 {\r
281 }\r
282 \r
283 void COpenGL3MaterialOneTextureBlendCB::OnSetMaterial(const SMaterial& material)\r
284 {\r
285         COpenGL3MaterialBaseCB::OnSetMaterial(material);\r
286 \r
287         BlendType = 0;\r
288 \r
289         E_BLEND_FACTOR srcRGBFact,dstRGBFact,srcAlphaFact,dstAlphaFact;\r
290         E_MODULATE_FUNC modulate;\r
291         u32 alphaSource;\r
292         unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulate, alphaSource, material.MaterialTypeParam);\r
293 \r
294         if (textureBlendFunc_hasAlpha(srcRGBFact) || textureBlendFunc_hasAlpha(dstRGBFact) || textureBlendFunc_hasAlpha(srcAlphaFact) || textureBlendFunc_hasAlpha(dstAlphaFact))\r
295         {\r
296                 if (alphaSource == EAS_VERTEX_COLOR)\r
297                 {\r
298                         BlendType = 1;\r
299                 }\r
300                 else if (alphaSource == EAS_TEXTURE)\r
301                 {\r
302                         BlendType = 2;\r
303                 }\r
304         }\r
305 \r
306         TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;\r
307 }\r
308 \r
309 void COpenGL3MaterialOneTextureBlendCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)\r
310 {\r
311         COpenGL3MaterialBaseCB::OnSetConstants(services, userData);\r
312 \r
313         IVideoDriver* driver = services->getVideoDriver();\r
314 \r
315         if (FirstUpdate)\r
316         {\r
317                 TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0");\r
318                 BlendTypeID = services->getVertexShaderConstantID("uBlendType");\r
319                 TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0");\r
320                 TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0");\r
321 \r
322                 FirstUpdate = false;\r
323         }\r
324 \r
325         core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);\r
326         services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);\r
327 \r
328         services->setPixelShaderConstant(BlendTypeID, &BlendType, 1);\r
329         services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);\r
330         services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);\r
331 }\r
332 \r
333 }\r
334 }\r