1 // Copyright (C) 2002-2008 Nikolaus Gebhardt
\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 #ifndef __C_OGLES1_MATERIAL_RENDERER_H_INCLUDED__
\r
6 #define __C_OGLES1_MATERIAL_RENDERER_H_INCLUDED__
\r
8 #ifdef _IRR_COMPILE_WITH_OGLES1_
\r
10 #include "COGLESDriver.h"
\r
11 #include "IMaterialRenderer.h"
\r
18 //! Base class for all internal OGLES1 material renderers
\r
19 class COGLES1MaterialRenderer : public IMaterialRenderer
\r
24 COGLES1MaterialRenderer(video::COGLES1Driver* driver) : Driver(driver)
\r
30 video::COGLES1Driver* Driver;
\r
34 //! Solid material renderer
\r
35 class COGLES1MaterialRenderer_SOLID : public COGLES1MaterialRenderer
\r
39 COGLES1MaterialRenderer_SOLID(video::COGLES1Driver* d)
\r
40 : COGLES1MaterialRenderer(d) {}
\r
42 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
43 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
45 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
47 if (resetAllRenderstates || (material.MaterialType != lastMaterial.MaterialType))
\r
49 // thanks to Murphy, the following line removed some
\r
50 // bugs with several OGLES1 implementations.
\r
51 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
57 //! Generic Texture Blend
\r
58 class COGLES1MaterialRenderer_ONETEXTURE_BLEND : public COGLES1MaterialRenderer
\r
62 COGLES1MaterialRenderer_ONETEXTURE_BLEND(video::COGLES1Driver* d)
\r
63 : COGLES1MaterialRenderer(d) {}
\r
65 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
66 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
68 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
70 // if (material.MaterialType != lastMaterial.MaterialType ||
\r
71 // material.MaterialTypeParam != lastMaterial.MaterialTypeParam ||
\r
72 // resetAllRenderstates)
\r
74 E_BLEND_FACTOR srcRGBFact,dstRGBFact,srcAlphaFact,dstAlphaFact;
\r
75 E_MODULATE_FUNC modulate;
\r
77 unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulate, alphaSource, material.MaterialTypeParam);
\r
79 Driver->getCacheHandler()->setBlend(true);
\r
81 if (Driver->queryFeature(EVDF_BLEND_SEPARATE))
\r
83 Driver->getCacheHandler()->setBlendFuncSeparate(Driver->getGLBlend(srcRGBFact), Driver->getGLBlend(dstRGBFact),
\r
84 Driver->getGLBlend(srcAlphaFact), Driver->getGLBlend(dstAlphaFact));
\r
88 Driver->getCacheHandler()->setBlendFunc(Driver->getGLBlend(srcRGBFact), Driver->getGLBlend(dstRGBFact));
\r
91 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
92 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
93 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
\r
94 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
\r
96 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, (f32) modulate );
\r
98 glEnable(GL_ALPHA_TEST);
\r
99 glAlphaFunc(GL_GREATER, 0.f);
\r
101 if (textureBlendFunc_hasAlpha(srcRGBFact) || textureBlendFunc_hasAlpha(dstRGBFact) ||
\r
102 textureBlendFunc_hasAlpha(srcAlphaFact) || textureBlendFunc_hasAlpha(dstAlphaFact))
\r
104 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
\r
105 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
\r
107 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR);
\r
112 virtual void OnUnsetMaterial()
\r
114 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
115 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.f );
\r
116 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
\r
118 Driver->getCacheHandler()->setBlend(false);
\r
119 glDisable(GL_ALPHA_TEST);
\r
122 //! Returns if the material is transparent.
\r
123 /** Is not always transparent, but mostly. */
\r
124 virtual bool isTransparent() const
\r
131 u32 getGLBlend ( E_BLEND_FACTOR factor ) const
\r
136 case EBF_ZERO: r = GL_ZERO; break;
\r
137 case EBF_ONE: r = GL_ONE; break;
\r
138 case EBF_DST_COLOR: r = GL_DST_COLOR; break;
\r
139 case EBF_ONE_MINUS_DST_COLOR: r = GL_ONE_MINUS_DST_COLOR; break;
\r
140 case EBF_SRC_COLOR: r = GL_SRC_COLOR; break;
\r
141 case EBF_ONE_MINUS_SRC_COLOR: r = GL_ONE_MINUS_SRC_COLOR; break;
\r
142 case EBF_SRC_ALPHA: r = GL_SRC_ALPHA; break;
\r
143 case EBF_ONE_MINUS_SRC_ALPHA: r = GL_ONE_MINUS_SRC_ALPHA; break;
\r
144 case EBF_DST_ALPHA: r = GL_DST_ALPHA; break;
\r
145 case EBF_ONE_MINUS_DST_ALPHA: r = GL_ONE_MINUS_DST_ALPHA; break;
\r
146 case EBF_SRC_ALPHA_SATURATE: r = GL_SRC_ALPHA_SATURATE; break;
\r
153 //! Solid 2 layer material renderer
\r
154 class COGLES1MaterialRenderer_SOLID_2_LAYER : public COGLES1MaterialRenderer
\r
158 COGLES1MaterialRenderer_SOLID_2_LAYER(video::COGLES1Driver* d)
\r
159 : COGLES1MaterialRenderer(d) {}
\r
161 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
162 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
164 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
166 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
168 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
170 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
171 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
172 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
\r
173 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR);
\r
174 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
\r
175 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
\r
176 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
177 glTexEnvf(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_PRIMARY_COLOR);
\r
178 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
\r
183 virtual void OnUnsetMaterial()
\r
185 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
187 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
188 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
189 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR);
\r
190 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE0);
\r
196 //! Transparent add color material renderer
\r
197 class COGLES1MaterialRenderer_TRANSPARENT_ADD_COLOR : public COGLES1MaterialRenderer
\r
201 COGLES1MaterialRenderer_TRANSPARENT_ADD_COLOR(video::COGLES1Driver* d)
\r
202 : COGLES1MaterialRenderer(d) {}
\r
204 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
205 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
207 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
209 Driver->getCacheHandler()->setBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
\r
210 Driver->getCacheHandler()->setBlend(true);
\r
212 if ((material.MaterialType != lastMaterial.MaterialType) || resetAllRenderstates)
\r
213 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
216 virtual void OnUnsetMaterial()
\r
218 Driver->getCacheHandler()->setBlend(false);
\r
221 //! Returns if the material is transparent.
\r
222 virtual bool isTransparent() const
\r
229 //! Transparent vertex alpha material renderer
\r
230 class COGLES1MaterialRenderer_TRANSPARENT_VERTEX_ALPHA : public COGLES1MaterialRenderer
\r
234 COGLES1MaterialRenderer_TRANSPARENT_VERTEX_ALPHA(video::COGLES1Driver* d)
\r
235 : COGLES1MaterialRenderer(d) {}
\r
237 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
238 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
240 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
242 Driver->getCacheHandler()->setBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
\r
243 Driver->getCacheHandler()->setBlend(true);
\r
245 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
247 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
249 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
\r
250 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR );
\r
252 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
253 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR );
\r
254 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
258 virtual void OnUnsetMaterial()
\r
261 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
262 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
\r
263 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE );
\r
264 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_PREVIOUS );
\r
265 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
266 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE );
\r
267 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
\r
269 Driver->getCacheHandler()->setBlend(false);
\r
272 //! Returns if the material is transparent.
\r
273 virtual bool isTransparent() const
\r
280 //! Transparent alpha channel material renderer
\r
281 class COGLES1MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL : public COGLES1MaterialRenderer
\r
285 COGLES1MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL(video::COGLES1Driver* d)
\r
286 : COGLES1MaterialRenderer(d) {}
\r
288 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
289 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
291 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
293 Driver->getCacheHandler()->setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
\r
294 Driver->getCacheHandler()->setBlend(true);
\r
296 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates
\r
297 || material.MaterialTypeParam != lastMaterial.MaterialTypeParam )
\r
299 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
300 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
301 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
\r
302 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
\r
304 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
\r
305 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
\r
307 glEnable(GL_ALPHA_TEST);
\r
309 glAlphaFunc(GL_GREATER, material.MaterialTypeParam);
\r
313 virtual void OnUnsetMaterial()
\r
315 glDisable(GL_ALPHA_TEST);
\r
316 Driver->getCacheHandler()->setBlend(false);
\r
319 //! Returns if the material is transparent.
\r
320 virtual bool isTransparent() const
\r
328 //! Transparent alpha channel material renderer
\r
329 class COGLES1MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF : public COGLES1MaterialRenderer
\r
333 COGLES1MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF(video::COGLES1Driver* d)
\r
334 : COGLES1MaterialRenderer(d) {}
\r
336 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
337 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
339 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
341 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
343 glEnable(GL_ALPHA_TEST);
\r
344 glAlphaFunc(GL_GREATER, 0.5f);
\r
345 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
349 virtual void OnUnsetMaterial()
\r
351 glDisable(GL_ALPHA_TEST);
\r
354 //! Returns if the material is transparent.
\r
355 virtual bool isTransparent() const
\r
357 return false; // this material is not really transparent because it does no blending.
\r
362 //! material renderer for all kinds of lightmaps
\r
363 class COGLES1MaterialRenderer_LIGHTMAP : public COGLES1MaterialRenderer
\r
367 COGLES1MaterialRenderer_LIGHTMAP(video::COGLES1Driver* d)
\r
368 : COGLES1MaterialRenderer(d) {}
\r
370 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
371 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
373 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
375 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
379 switch (material.MaterialType)
\r
381 case EMT_LIGHTMAP_LIGHTING:
\r
382 case EMT_LIGHTMAP_LIGHTING_M2:
\r
383 case EMT_LIGHTMAP_LIGHTING_M4:
\r
384 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
386 case EMT_LIGHTMAP_ADD:
\r
388 case EMT_LIGHTMAP_M2:
\r
389 case EMT_LIGHTMAP_M4:
\r
391 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
\r
395 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
399 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
400 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
402 if (material.MaterialType == EMT_LIGHTMAP_ADD)
\r
403 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
\r
405 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
407 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
\r
408 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
410 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
\r
411 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
\r
412 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_PREVIOUS);
\r
414 switch (material.MaterialType)
\r
416 case EMT_LIGHTMAP_M4:
\r
417 case EMT_LIGHTMAP_LIGHTING_M4:
\r
418 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 4.0f);
\r
420 case EMT_LIGHTMAP_M2:
\r
421 case EMT_LIGHTMAP_LIGHTING_M2:
\r
422 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 2.0f);
\r
425 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.0f);
\r
431 virtual void OnUnsetMaterial()
\r
433 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
435 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
436 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.f );
\r
437 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
438 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE0);
\r
439 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
444 class COGLES1MaterialRenderer_DETAIL_MAP : public COGLES1MaterialRenderer
\r
447 COGLES1MaterialRenderer_DETAIL_MAP(video::COGLES1Driver* d) : COGLES1MaterialRenderer(d)
\r
451 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
452 bool resetAllRenderstates, IMaterialRendererServices* services) override
\r
454 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
456 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
458 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
459 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
460 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD_SIGNED);
\r
461 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
\r
462 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
466 void OnUnsetMaterial() override
\r
468 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
469 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
470 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE0);
\r
475 //! sphere map material renderer
\r
476 class COGLES1MaterialRenderer_SPHERE_MAP : public COGLES1MaterialRenderer
\r
480 COGLES1MaterialRenderer_SPHERE_MAP(video::COGLES1Driver* d)
\r
481 : COGLES1MaterialRenderer(d) {}
\r
483 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
484 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
486 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
488 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
490 // glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
491 // glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
493 // glEnable(GL_TEXTURE_GEN_S);
\r
494 // glEnable(GL_TEXTURE_GEN_T);
\r
498 virtual void OnUnsetMaterial()
\r
500 // glDisable(GL_TEXTURE_GEN_S);
\r
501 // glDisable(GL_TEXTURE_GEN_T);
\r
506 //! reflection 2 layer material renderer
\r
507 class COGLES1MaterialRenderer_REFLECTION_2_LAYER : public COGLES1MaterialRenderer
\r
511 COGLES1MaterialRenderer_REFLECTION_2_LAYER(video::COGLES1Driver* d)
\r
512 : COGLES1MaterialRenderer(d) {}
\r
514 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
515 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
517 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
519 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
521 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
523 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
524 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
525 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
526 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
\r
527 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
530 // glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
531 // glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
532 // glEnable(GL_TEXTURE_GEN_S);
\r
533 // glEnable(GL_TEXTURE_GEN_T);
\r
537 virtual void OnUnsetMaterial()
\r
539 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
541 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
542 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
544 // glDisable(GL_TEXTURE_GEN_S);
\r
545 // glDisable(GL_TEXTURE_GEN_T);
\r
546 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
548 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE0);
\r
554 //! reflection 2 layer material renderer
\r
555 class COGLES1MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER : public COGLES1MaterialRenderer
\r
559 COGLES1MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER(video::COGLES1Driver* d)
\r
560 : COGLES1MaterialRenderer(d) {}
\r
562 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
563 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
565 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
567 Driver->getCacheHandler()->setBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
\r
568 Driver->getCacheHandler()->setBlend(true);
\r
570 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
572 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
574 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
575 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
576 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
577 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
\r
578 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
580 // glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
581 // glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
582 // glEnable(GL_TEXTURE_GEN_S);
\r
583 // glEnable(GL_TEXTURE_GEN_T);
\r
587 virtual void OnUnsetMaterial()
\r
589 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
591 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
592 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
594 // glDisable(GL_TEXTURE_GEN_S);
\r
595 // glDisable(GL_TEXTURE_GEN_T);
\r
596 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
598 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE0);
\r
600 Driver->getCacheHandler()->setBlend(false);
\r
603 //! Returns if the material is transparent.
\r
604 virtual bool isTransparent() const
\r
610 } // end namespace video
\r
611 } // end namespace irr
\r