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
5 #include "COGLES2FixedPipelineRenderer.h"
\r
7 #ifdef _IRR_COMPILE_WITH_OGLES2_
\r
9 #include "IVideoDriver.h"
\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
26 void COGLES2MaterialBaseCB::OnSetMaterial(const SMaterial& material)
\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
35 FogEnable = material.FogEnable ? 1 : 0;
\r
37 Thickness = (material.Thickness > 0.f) ? material.Thickness : 1.f;
\r
40 void COGLES2MaterialBaseCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
\r
42 IVideoDriver* driver = services->getVideoDriver();
\r
44 if (FirstUpdateBase)
\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
63 FirstUpdateBase = false;
\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
70 core::matrix4 Matrix = P * V * W;
\r
71 services->setPixelShaderConstant(WVPMatrixID, Matrix.pointer(), 16);
\r
74 services->setPixelShaderConstant(WVMatrixID, Matrix.pointer(), 16);
\r
76 Matrix.makeInverse();
\r
77 services->setPixelShaderConstant(NMatrixID, Matrix.getTransposed().pointer(), 16);
\r
79 services->setPixelShaderConstant(FogEnableID, &FogEnable, 1);
\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
88 driver->getFog(TempColor, TempType, FogStart, FogEnd, FogDensity, TempPerFragment, TempRange);
\r
90 FogType = (s32)TempType;
\r
91 FogColor = SColorf(TempColor);
\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
100 services->setPixelShaderConstant(ThicknessID, &Thickness, 1);
\r
103 // EMT_SOLID + EMT_TRANSPARENT_ADD_COLOR + EMT_TRANSPARENT_ALPHA_CHANNEL + EMT_TRANSPARENT_VERTEX_ALPHA
\r
105 COGLES2MaterialSolidCB::COGLES2MaterialSolidCB() :
\r
106 FirstUpdate(true), TMatrix0ID(-1), AlphaRefID(-1), TextureUsage0ID(-1), TextureUnit0ID(-1), AlphaRef(0.5f), TextureUsage0(0), TextureUnit0(0)
\r
110 void COGLES2MaterialSolidCB::OnSetMaterial(const SMaterial& material)
\r
112 COGLES2MaterialBaseCB::OnSetMaterial(material);
\r
114 AlphaRef = material.MaterialTypeParam;
\r
115 TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;
\r
118 void COGLES2MaterialSolidCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
\r
120 COGLES2MaterialBaseCB::OnSetConstants(services, userData);
\r
122 IVideoDriver* driver = services->getVideoDriver();
\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
131 FirstUpdate = false;
\r
134 core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);
\r
135 services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);
\r
137 services->setPixelShaderConstant(AlphaRefID, &AlphaRef, 1);
\r
138 services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);
\r
139 services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);
\r
142 // EMT_SOLID_2_LAYER + EMT_DETAIL_MAP
\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
150 void COGLES2MaterialSolid2CB::OnSetMaterial(const SMaterial& material)
\r
152 COGLES2MaterialBaseCB::OnSetMaterial(material);
\r
154 TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;
\r
155 TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0;
\r
158 void COGLES2MaterialSolid2CB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
\r
160 COGLES2MaterialBaseCB::OnSetConstants(services, userData);
\r
162 IVideoDriver* driver = services->getVideoDriver();
\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
173 FirstUpdate = false;
\r
176 core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);
\r
177 services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);
\r
179 Matrix = driver->getTransform(ETS_TEXTURE_1);
\r
180 services->setPixelShaderConstant(TMatrix1ID, Matrix.pointer(), 16);
\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
188 // EMT_LIGHTMAP + EMT_LIGHTMAP_ADD + EMT_LIGHTMAP_M2 + EMT_LIGHTMAP_M4
\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
196 void COGLES2MaterialLightmapCB::OnSetMaterial(const SMaterial& material)
\r
198 COGLES2MaterialBaseCB::OnSetMaterial(material);
\r
200 TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;
\r
201 TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0;
\r
204 void COGLES2MaterialLightmapCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
\r
206 COGLES2MaterialBaseCB::OnSetConstants(services, userData);
\r
208 IVideoDriver* driver = services->getVideoDriver();
\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
220 FirstUpdate = false;
\r
223 core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);
\r
224 services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);
\r
226 Matrix = driver->getTransform(ETS_TEXTURE_1);
\r
227 services->setPixelShaderConstant(TMatrix1ID, Matrix.pointer(), 16);
\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
236 // EMT_SPHERE_MAP + EMT_REFLECTION_2_LAYER + EMT_TRANSPARENT_REFLECTION_2_LAYER
\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
244 void COGLES2MaterialReflectionCB::OnSetMaterial(const SMaterial& material)
\r
246 COGLES2MaterialBaseCB::OnSetMaterial(material);
\r
248 TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;
\r
249 TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0;
\r
252 void COGLES2MaterialReflectionCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
\r
254 COGLES2MaterialBaseCB::OnSetConstants(services, userData);
\r
256 IVideoDriver* driver = services->getVideoDriver();
\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
266 FirstUpdate = false;
\r
269 core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);
\r
270 services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);
\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
278 // EMT_ONETEXTURE_BLEND
\r
280 COGLES2MaterialOneTextureBlendCB::COGLES2MaterialOneTextureBlendCB() :
\r
281 FirstUpdate(true), TMatrix0ID(-1), BlendTypeID(-1), TextureUsage0ID(-1), TextureUnit0ID(-1), BlendType(0), TextureUsage0(0), TextureUnit0(0)
\r
285 void COGLES2MaterialOneTextureBlendCB::OnSetMaterial(const SMaterial& material)
\r
287 COGLES2MaterialBaseCB::OnSetMaterial(material);
\r
291 E_BLEND_FACTOR srcRGBFact,dstRGBFact,srcAlphaFact,dstAlphaFact;
\r
292 E_MODULATE_FUNC modulate;
\r
294 unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulate, alphaSource, material.MaterialTypeParam);
\r
296 if (textureBlendFunc_hasAlpha(srcRGBFact) || textureBlendFunc_hasAlpha(dstRGBFact) || textureBlendFunc_hasAlpha(srcAlphaFact) || textureBlendFunc_hasAlpha(dstAlphaFact))
\r
298 if (alphaSource == EAS_VERTEX_COLOR)
\r
302 else if (alphaSource == EAS_TEXTURE)
\r
308 TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;
\r
311 void COGLES2MaterialOneTextureBlendCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
\r
313 COGLES2MaterialBaseCB::OnSetConstants(services, userData);
\r
315 IVideoDriver* driver = services->getVideoDriver();
\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
324 FirstUpdate = false;
\r
327 core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);
\r
328 services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);
\r
330 services->setPixelShaderConstant(BlendTypeID, &BlendType, 1);
\r
331 services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);
\r
332 services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);
\r