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