1 // Copyright (C) 2014 Patryk Nadrowski
2 // This file is part of the "Irrlicht Engine".
3 // For conditions of distribution and use, see copyright notice in Irrlicht.h
5 #include "FixedPipelineRenderer.h"
7 #include "IVideoDriver.h"
16 COpenGL3MaterialBaseCB::COpenGL3MaterialBaseCB() :
17 FirstUpdateBase(true), WVPMatrixID(-1), WVMatrixID(-1), NMatrixID(-1), GlobalAmbientID(-1), MaterialAmbientID(-1), MaterialDiffuseID(-1), MaterialEmissiveID(-1), MaterialSpecularID(-1), MaterialShininessID(-1),
18 FogEnableID(-1), FogTypeID(-1), FogColorID(-1), FogStartID(-1),
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)),
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)
24 void COpenGL3MaterialBaseCB::OnSetMaterial(const SMaterial& material)
26 LightEnable = material.Lighting;
27 MaterialAmbient = SColorf(material.AmbientColor);
28 MaterialDiffuse = SColorf(material.DiffuseColor);
29 MaterialEmissive = SColorf(material.EmissiveColor);
30 MaterialSpecular = SColorf(material.SpecularColor);
31 MaterialShininess = material.Shininess;
33 FogEnable = material.FogEnable ? 1 : 0;
35 Thickness = (material.Thickness > 0.f) ? material.Thickness : 1.f;
38 void COpenGL3MaterialBaseCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
40 IVideoDriver* driver = services->getVideoDriver();
44 WVPMatrixID = services->getVertexShaderConstantID("uWVPMatrix");
45 WVMatrixID = services->getVertexShaderConstantID("uWVMatrix");
46 NMatrixID = services->getVertexShaderConstantID("uNMatrix");
47 GlobalAmbientID = services->getVertexShaderConstantID("uGlobalAmbient");
48 MaterialAmbientID = services->getVertexShaderConstantID("uMaterialAmbient");
49 MaterialDiffuseID = services->getVertexShaderConstantID("uMaterialDiffuse");
50 MaterialEmissiveID = services->getVertexShaderConstantID("uMaterialEmissive");
51 MaterialSpecularID = services->getVertexShaderConstantID("uMaterialSpecular");
52 MaterialShininessID = services->getVertexShaderConstantID("uMaterialShininess");
53 FogEnableID = services->getVertexShaderConstantID("uFogEnable");
54 FogTypeID = services->getVertexShaderConstantID("uFogType");
55 FogColorID = services->getVertexShaderConstantID("uFogColor");
56 FogStartID = services->getVertexShaderConstantID("uFogStart");
57 FogEndID = services->getVertexShaderConstantID("uFogEnd");
58 FogDensityID = services->getVertexShaderConstantID("uFogDensity");
59 ThicknessID = services->getVertexShaderConstantID("uThickness");
61 FirstUpdateBase = false;
64 const core::matrix4 W = driver->getTransform(ETS_WORLD);
65 const core::matrix4 V = driver->getTransform(ETS_VIEW);
66 const core::matrix4 P = driver->getTransform(ETS_PROJECTION);
68 core::matrix4 Matrix = P * V * W;
69 services->setPixelShaderConstant(WVPMatrixID, Matrix.pointer(), 16);
72 services->setPixelShaderConstant(WVMatrixID, Matrix.pointer(), 16);
75 services->setPixelShaderConstant(NMatrixID, Matrix.getTransposed().pointer(), 16);
77 services->setPixelShaderConstant(FogEnableID, &FogEnable, 1);
82 E_FOG_TYPE TempType = EFT_FOG_LINEAR;
83 bool TempPerFragment = false;
84 bool TempRange = false;
86 driver->getFog(TempColor, TempType, FogStart, FogEnd, FogDensity, TempPerFragment, TempRange);
88 FogType = (s32)TempType;
89 FogColor = SColorf(TempColor);
91 services->setPixelShaderConstant(FogTypeID, &FogType, 1);
92 services->setPixelShaderConstant(FogColorID, reinterpret_cast<f32*>(&FogColor), 4);
93 services->setPixelShaderConstant(FogStartID, &FogStart, 1);
94 services->setPixelShaderConstant(FogEndID, &FogEnd, 1);
95 services->setPixelShaderConstant(FogDensityID, &FogDensity, 1);
98 services->setPixelShaderConstant(ThicknessID, &Thickness, 1);
101 // EMT_SOLID + EMT_TRANSPARENT_ADD_COLOR + EMT_TRANSPARENT_ALPHA_CHANNEL + EMT_TRANSPARENT_VERTEX_ALPHA
103 COpenGL3MaterialSolidCB::COpenGL3MaterialSolidCB() :
104 FirstUpdate(true), TMatrix0ID(-1), AlphaRefID(-1), TextureUsage0ID(-1), TextureUnit0ID(-1), AlphaRef(0.5f), TextureUsage0(0), TextureUnit0(0)
108 void COpenGL3MaterialSolidCB::OnSetMaterial(const SMaterial& material)
110 COpenGL3MaterialBaseCB::OnSetMaterial(material);
112 AlphaRef = material.MaterialTypeParam;
113 TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;
116 void COpenGL3MaterialSolidCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
118 COpenGL3MaterialBaseCB::OnSetConstants(services, userData);
120 IVideoDriver* driver = services->getVideoDriver();
124 TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0");
125 AlphaRefID = services->getVertexShaderConstantID("uAlphaRef");
126 TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0");
127 TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0");
132 core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);
133 services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);
135 services->setPixelShaderConstant(AlphaRefID, &AlphaRef, 1);
136 services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);
137 services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);
140 // EMT_SOLID_2_LAYER + EMT_DETAIL_MAP
142 COpenGL3MaterialSolid2CB::COpenGL3MaterialSolid2CB() :
143 FirstUpdate(true), TMatrix0ID(-1), TMatrix1ID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1),
144 TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1)
148 void COpenGL3MaterialSolid2CB::OnSetMaterial(const SMaterial& material)
150 COpenGL3MaterialBaseCB::OnSetMaterial(material);
152 TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;
153 TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0;
156 void COpenGL3MaterialSolid2CB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
158 COpenGL3MaterialBaseCB::OnSetConstants(services, userData);
160 IVideoDriver* driver = services->getVideoDriver();
164 TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0");
165 TMatrix1ID = services->getVertexShaderConstantID("uTMatrix1");
166 TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0");
167 TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1");
168 TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0");
169 TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1");
174 core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);
175 services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);
177 Matrix = driver->getTransform(E_TRANSFORMATION_STATE(ETS_TEXTURE_0 + 1));
178 services->setPixelShaderConstant(TMatrix1ID, Matrix.pointer(), 16);
180 services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);
181 services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1);
182 services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);
183 services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1);
186 // EMT_LIGHTMAP + EMT_LIGHTMAP_ADD + EMT_LIGHTMAP_M2 + EMT_LIGHTMAP_M4
188 COpenGL3MaterialLightmapCB::COpenGL3MaterialLightmapCB(float modulate) :
189 FirstUpdate(true), TMatrix0ID(-1), TMatrix1ID(-1), ModulateID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1),
190 Modulate(modulate), TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1)
194 void COpenGL3MaterialLightmapCB::OnSetMaterial(const SMaterial& material)
196 COpenGL3MaterialBaseCB::OnSetMaterial(material);
198 TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;
199 TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0;
202 void COpenGL3MaterialLightmapCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
204 COpenGL3MaterialBaseCB::OnSetConstants(services, userData);
206 IVideoDriver* driver = services->getVideoDriver();
210 TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0");
211 TMatrix1ID = services->getVertexShaderConstantID("uTMatrix1");
212 ModulateID = services->getVertexShaderConstantID("uModulate");
213 TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0");
214 TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1");
215 TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0");
216 TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1");
221 core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);
222 services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);
224 Matrix = driver->getTransform(E_TRANSFORMATION_STATE(ETS_TEXTURE_0 + 1));
225 services->setPixelShaderConstant(TMatrix1ID, Matrix.pointer(), 16);
227 services->setPixelShaderConstant(ModulateID, &Modulate, 1);
228 services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);
229 services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1);
230 services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);
231 services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1);
234 // EMT_SPHERE_MAP + EMT_REFLECTION_2_LAYER + EMT_TRANSPARENT_REFLECTION_2_LAYER
236 COpenGL3MaterialReflectionCB::COpenGL3MaterialReflectionCB() :
237 FirstUpdate(true), TMatrix0ID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1),
238 TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1)
242 void COpenGL3MaterialReflectionCB::OnSetMaterial(const SMaterial& material)
244 COpenGL3MaterialBaseCB::OnSetMaterial(material);
246 TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;
247 TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0;
250 void COpenGL3MaterialReflectionCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
252 COpenGL3MaterialBaseCB::OnSetConstants(services, userData);
254 IVideoDriver* driver = services->getVideoDriver();
258 TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0");
259 TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0");
260 TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1");
261 TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0");
262 TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1");
267 core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);
268 services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);
270 services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);
271 services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1);
272 services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);
273 services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1);
276 // EMT_ONETEXTURE_BLEND
278 COpenGL3MaterialOneTextureBlendCB::COpenGL3MaterialOneTextureBlendCB() :
279 FirstUpdate(true), TMatrix0ID(-1), BlendTypeID(-1), TextureUsage0ID(-1), TextureUnit0ID(-1), BlendType(0), TextureUsage0(0), TextureUnit0(0)
283 void COpenGL3MaterialOneTextureBlendCB::OnSetMaterial(const SMaterial& material)
285 COpenGL3MaterialBaseCB::OnSetMaterial(material);
289 E_BLEND_FACTOR srcRGBFact,dstRGBFact,srcAlphaFact,dstAlphaFact;
290 E_MODULATE_FUNC modulate;
292 unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulate, alphaSource, material.MaterialTypeParam);
294 if (textureBlendFunc_hasAlpha(srcRGBFact) || textureBlendFunc_hasAlpha(dstRGBFact) || textureBlendFunc_hasAlpha(srcAlphaFact) || textureBlendFunc_hasAlpha(dstAlphaFact))
296 if (alphaSource == EAS_VERTEX_COLOR)
300 else if (alphaSource == EAS_TEXTURE)
306 TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0;
309 void COpenGL3MaterialOneTextureBlendCB::OnSetConstants(IMaterialRendererServices* services, s32 userData)
311 COpenGL3MaterialBaseCB::OnSetConstants(services, userData);
313 IVideoDriver* driver = services->getVideoDriver();
317 TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0");
318 BlendTypeID = services->getVertexShaderConstantID("uBlendType");
319 TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0");
320 TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0");
325 core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0);
326 services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16);
328 services->setPixelShaderConstant(BlendTypeID, &BlendType, 1);
329 services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1);
330 services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1);