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 #include "IrrCompileConfig.h"
\r
9 #ifdef _IRR_COMPILE_WITH_OGLES1_
\r
11 #include "COGLESDriver.h"
\r
12 #include "IMaterialRenderer.h"
\r
19 //! Base class for all internal OGLES1 material renderers
\r
20 class COGLES1MaterialRenderer : public IMaterialRenderer
\r
25 COGLES1MaterialRenderer(video::COGLES1Driver* driver) : Driver(driver)
\r
31 video::COGLES1Driver* Driver;
\r
35 //! Solid material renderer
\r
36 class COGLES1MaterialRenderer_SOLID : public COGLES1MaterialRenderer
\r
40 COGLES1MaterialRenderer_SOLID(video::COGLES1Driver* d)
\r
41 : COGLES1MaterialRenderer(d) {}
\r
43 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
44 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
46 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
48 if (resetAllRenderstates || (material.MaterialType != lastMaterial.MaterialType))
\r
50 // thanks to Murphy, the following line removed some
\r
51 // bugs with several OGLES1 implementations.
\r
52 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
58 //! Generic Texture Blend
\r
59 class COGLES1MaterialRenderer_ONETEXTURE_BLEND : public COGLES1MaterialRenderer
\r
63 COGLES1MaterialRenderer_ONETEXTURE_BLEND(video::COGLES1Driver* d)
\r
64 : COGLES1MaterialRenderer(d) {}
\r
66 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
67 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
69 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
71 // if (material.MaterialType != lastMaterial.MaterialType ||
\r
72 // material.MaterialTypeParam != lastMaterial.MaterialTypeParam ||
\r
73 // resetAllRenderstates)
\r
75 E_BLEND_FACTOR srcRGBFact,dstRGBFact,srcAlphaFact,dstAlphaFact;
\r
76 E_MODULATE_FUNC modulate;
\r
78 unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulate, alphaSource, material.MaterialTypeParam);
\r
80 Driver->getCacheHandler()->setBlend(true);
\r
82 if (Driver->queryFeature(EVDF_BLEND_SEPARATE))
\r
84 Driver->getCacheHandler()->setBlendFuncSeparate(Driver->getGLBlend(srcRGBFact), Driver->getGLBlend(dstRGBFact),
\r
85 Driver->getGLBlend(srcAlphaFact), Driver->getGLBlend(dstAlphaFact));
\r
89 Driver->getCacheHandler()->setBlendFunc(Driver->getGLBlend(srcRGBFact), Driver->getGLBlend(dstRGBFact));
\r
92 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
93 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
94 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
\r
95 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
\r
97 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, (f32) modulate );
\r
99 glEnable(GL_ALPHA_TEST);
\r
100 glAlphaFunc(GL_GREATER, 0.f);
\r
102 if (textureBlendFunc_hasAlpha(srcRGBFact) || textureBlendFunc_hasAlpha(dstRGBFact) ||
\r
103 textureBlendFunc_hasAlpha(srcAlphaFact) || textureBlendFunc_hasAlpha(dstAlphaFact))
\r
105 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
\r
106 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
\r
108 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR);
\r
113 virtual void OnUnsetMaterial()
\r
115 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
116 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.f );
\r
117 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
\r
119 Driver->getCacheHandler()->setBlend(false);
\r
120 glDisable(GL_ALPHA_TEST);
\r
123 //! Returns if the material is transparent.
\r
124 /** Is not always transparent, but mostly. */
\r
125 virtual bool isTransparent() const
\r
132 u32 getGLBlend ( E_BLEND_FACTOR factor ) const
\r
137 case EBF_ZERO: r = GL_ZERO; break;
\r
138 case EBF_ONE: r = GL_ONE; break;
\r
139 case EBF_DST_COLOR: r = GL_DST_COLOR; break;
\r
140 case EBF_ONE_MINUS_DST_COLOR: r = GL_ONE_MINUS_DST_COLOR; break;
\r
141 case EBF_SRC_COLOR: r = GL_SRC_COLOR; break;
\r
142 case EBF_ONE_MINUS_SRC_COLOR: r = GL_ONE_MINUS_SRC_COLOR; break;
\r
143 case EBF_SRC_ALPHA: r = GL_SRC_ALPHA; break;
\r
144 case EBF_ONE_MINUS_SRC_ALPHA: r = GL_ONE_MINUS_SRC_ALPHA; break;
\r
145 case EBF_DST_ALPHA: r = GL_DST_ALPHA; break;
\r
146 case EBF_ONE_MINUS_DST_ALPHA: r = GL_ONE_MINUS_DST_ALPHA; break;
\r
147 case EBF_SRC_ALPHA_SATURATE: r = GL_SRC_ALPHA_SATURATE; break;
\r
154 //! Solid 2 layer material renderer
\r
155 class COGLES1MaterialRenderer_SOLID_2_LAYER : public COGLES1MaterialRenderer
\r
159 COGLES1MaterialRenderer_SOLID_2_LAYER(video::COGLES1Driver* d)
\r
160 : COGLES1MaterialRenderer(d) {}
\r
162 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
163 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
165 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
167 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
169 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
171 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
172 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
173 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
\r
174 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR);
\r
175 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
\r
176 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
\r
177 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
178 glTexEnvf(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_PRIMARY_COLOR);
\r
179 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
\r
184 virtual void OnUnsetMaterial()
\r
186 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
188 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
189 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
190 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR);
\r
191 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE0);
\r
197 //! Transparent add color material renderer
\r
198 class COGLES1MaterialRenderer_TRANSPARENT_ADD_COLOR : public COGLES1MaterialRenderer
\r
202 COGLES1MaterialRenderer_TRANSPARENT_ADD_COLOR(video::COGLES1Driver* d)
\r
203 : COGLES1MaterialRenderer(d) {}
\r
205 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
206 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
208 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
210 Driver->getCacheHandler()->setBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
\r
211 Driver->getCacheHandler()->setBlend(true);
\r
213 if ((material.MaterialType != lastMaterial.MaterialType) || resetAllRenderstates)
\r
214 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
217 virtual void OnUnsetMaterial()
\r
219 Driver->getCacheHandler()->setBlend(false);
\r
222 //! Returns if the material is transparent.
\r
223 virtual bool isTransparent() const
\r
230 //! Transparent vertex alpha material renderer
\r
231 class COGLES1MaterialRenderer_TRANSPARENT_VERTEX_ALPHA : public COGLES1MaterialRenderer
\r
235 COGLES1MaterialRenderer_TRANSPARENT_VERTEX_ALPHA(video::COGLES1Driver* d)
\r
236 : COGLES1MaterialRenderer(d) {}
\r
238 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
239 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
241 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
243 Driver->getCacheHandler()->setBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
\r
244 Driver->getCacheHandler()->setBlend(true);
\r
246 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
248 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
250 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
\r
251 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR );
\r
253 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
254 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR );
\r
255 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
259 virtual void OnUnsetMaterial()
\r
262 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
263 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
\r
264 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE );
\r
265 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_PREVIOUS );
\r
266 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
267 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE );
\r
268 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
\r
270 Driver->getCacheHandler()->setBlend(false);
\r
273 //! Returns if the material is transparent.
\r
274 virtual bool isTransparent() const
\r
281 //! Transparent alpha channel material renderer
\r
282 class COGLES1MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL : public COGLES1MaterialRenderer
\r
286 COGLES1MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL(video::COGLES1Driver* d)
\r
287 : COGLES1MaterialRenderer(d) {}
\r
289 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
290 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
292 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
294 Driver->getCacheHandler()->setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
\r
295 Driver->getCacheHandler()->setBlend(true);
\r
297 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates
\r
298 || material.MaterialTypeParam != lastMaterial.MaterialTypeParam )
\r
300 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
301 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
302 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
\r
303 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
\r
305 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
\r
306 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
\r
308 glEnable(GL_ALPHA_TEST);
\r
310 glAlphaFunc(GL_GREATER, material.MaterialTypeParam);
\r
314 virtual void OnUnsetMaterial()
\r
316 glDisable(GL_ALPHA_TEST);
\r
317 Driver->getCacheHandler()->setBlend(false);
\r
320 //! Returns if the material is transparent.
\r
321 virtual bool isTransparent() const
\r
329 //! Transparent alpha channel material renderer
\r
330 class COGLES1MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF : public COGLES1MaterialRenderer
\r
334 COGLES1MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF(video::COGLES1Driver* d)
\r
335 : COGLES1MaterialRenderer(d) {}
\r
337 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
338 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
340 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
342 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
344 glEnable(GL_ALPHA_TEST);
\r
345 glAlphaFunc(GL_GREATER, 0.5f);
\r
346 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
350 virtual void OnUnsetMaterial()
\r
352 glDisable(GL_ALPHA_TEST);
\r
355 //! Returns if the material is transparent.
\r
356 virtual bool isTransparent() const
\r
358 return false; // this material is not really transparent because it does no blending.
\r
363 //! material renderer for all kinds of lightmaps
\r
364 class COGLES1MaterialRenderer_LIGHTMAP : public COGLES1MaterialRenderer
\r
368 COGLES1MaterialRenderer_LIGHTMAP(video::COGLES1Driver* d)
\r
369 : COGLES1MaterialRenderer(d) {}
\r
371 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
372 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
374 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
376 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
380 switch (material.MaterialType)
\r
382 case EMT_LIGHTMAP_LIGHTING:
\r
383 case EMT_LIGHTMAP_LIGHTING_M2:
\r
384 case EMT_LIGHTMAP_LIGHTING_M4:
\r
385 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
387 case EMT_LIGHTMAP_ADD:
\r
389 case EMT_LIGHTMAP_M2:
\r
390 case EMT_LIGHTMAP_M4:
\r
392 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
\r
396 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
400 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
401 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
403 if (material.MaterialType == EMT_LIGHTMAP_ADD)
\r
404 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
\r
406 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
408 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
\r
409 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
411 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
\r
412 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
\r
413 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_PREVIOUS);
\r
415 switch (material.MaterialType)
\r
417 case EMT_LIGHTMAP_M4:
\r
418 case EMT_LIGHTMAP_LIGHTING_M4:
\r
419 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 4.0f);
\r
421 case EMT_LIGHTMAP_M2:
\r
422 case EMT_LIGHTMAP_LIGHTING_M2:
\r
423 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 2.0f);
\r
426 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.0f);
\r
432 virtual void OnUnsetMaterial()
\r
434 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
436 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
437 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.f );
\r
438 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
439 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE0);
\r
440 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
445 class COGLES1MaterialRenderer_DETAIL_MAP : public COGLES1MaterialRenderer
\r
448 COGLES1MaterialRenderer_DETAIL_MAP(video::COGLES1Driver* d) : COGLES1MaterialRenderer(d)
\r
452 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
453 bool resetAllRenderstates, IMaterialRendererServices* services) override
\r
455 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
457 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
459 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
460 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
461 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD_SIGNED);
\r
462 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
\r
463 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
467 void OnUnsetMaterial() override
\r
469 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
470 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
471 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE0);
\r
476 //! sphere map material renderer
\r
477 class COGLES1MaterialRenderer_SPHERE_MAP : public COGLES1MaterialRenderer
\r
481 COGLES1MaterialRenderer_SPHERE_MAP(video::COGLES1Driver* d)
\r
482 : COGLES1MaterialRenderer(d) {}
\r
484 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
485 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
487 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
489 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
491 // glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
492 // glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
494 // glEnable(GL_TEXTURE_GEN_S);
\r
495 // glEnable(GL_TEXTURE_GEN_T);
\r
499 virtual void OnUnsetMaterial()
\r
501 // glDisable(GL_TEXTURE_GEN_S);
\r
502 // glDisable(GL_TEXTURE_GEN_T);
\r
507 //! reflection 2 layer material renderer
\r
508 class COGLES1MaterialRenderer_REFLECTION_2_LAYER : public COGLES1MaterialRenderer
\r
512 COGLES1MaterialRenderer_REFLECTION_2_LAYER(video::COGLES1Driver* d)
\r
513 : COGLES1MaterialRenderer(d) {}
\r
515 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
516 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
518 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
520 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
522 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
524 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
525 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
526 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
527 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
\r
528 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
531 // glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
532 // glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
533 // glEnable(GL_TEXTURE_GEN_S);
\r
534 // glEnable(GL_TEXTURE_GEN_T);
\r
538 virtual void OnUnsetMaterial()
\r
540 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
542 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
543 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
545 // glDisable(GL_TEXTURE_GEN_S);
\r
546 // glDisable(GL_TEXTURE_GEN_T);
\r
547 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
549 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE0);
\r
555 //! reflection 2 layer material renderer
\r
556 class COGLES1MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER : public COGLES1MaterialRenderer
\r
560 COGLES1MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER(video::COGLES1Driver* d)
\r
561 : COGLES1MaterialRenderer(d) {}
\r
563 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
\r
564 bool resetAllRenderstates, IMaterialRendererServices* services)
\r
566 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
\r
568 Driver->getCacheHandler()->setBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
\r
569 Driver->getCacheHandler()->setBlend(true);
\r
571 if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
\r
573 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
575 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
576 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
\r
577 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
\r
578 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
\r
579 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
\r
581 // glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
582 // glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
\r
583 // glEnable(GL_TEXTURE_GEN_S);
\r
584 // glEnable(GL_TEXTURE_GEN_T);
\r
588 virtual void OnUnsetMaterial()
\r
590 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
592 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE1);
\r
593 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
\r
595 // glDisable(GL_TEXTURE_GEN_S);
\r
596 // glDisable(GL_TEXTURE_GEN_T);
\r
597 if (Driver->queryFeature(EVDF_MULTITEXTURE))
\r
599 Driver->getCacheHandler()->setActiveTexture(GL_TEXTURE0);
\r
601 Driver->getCacheHandler()->setBlend(false);
\r
604 //! Returns if the material is transparent.
\r
605 virtual bool isTransparent() const
\r
611 } // end namespace video
\r
612 } // end namespace irr
\r