1
// Copyright (C) 2002-2011 Nikolaus Gebhardt
2
// This file is part of the "Irrlicht Engine".
3
// For conditions of distribution and use, see copyright notice in irrlicht.h
5
#ifndef __C_OPENGL_MATERIAL_RENDERER_H_INCLUDED__
6
#define __C_OPENGL_MATERIAL_RENDERER_H_INCLUDED__
8
#include "IrrCompileConfig.h"
9
#ifdef _IRR_COMPILE_WITH_OPENGL_
11
#include "COpenGLDriver.h"
12
#include "IMaterialRenderer.h"
19
//! Base class for all internal OpenGL material renderers
20
class COpenGLMaterialRenderer : public IMaterialRenderer
25
COpenGLMaterialRenderer(video::COpenGLDriver* driver) : Driver(driver)
31
video::COpenGLDriver* Driver;
35
//! Solid material renderer
36
class COpenGLMaterialRenderer_SOLID : public COpenGLMaterialRenderer
40
COpenGLMaterialRenderer_SOLID(video::COpenGLDriver* d)
41
: COpenGLMaterialRenderer(d) {}
43
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
44
bool resetAllRenderstates, IMaterialRendererServices* services)
46
Driver->disableTextures(1);
47
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
49
if (resetAllRenderstates || (material.MaterialType != lastMaterial.MaterialType))
51
// thanks to Murphy, the following line removed some
52
// bugs with several OpenGL implementations.
53
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
59
//! Generic Texture Blend
60
class COpenGLMaterialRenderer_ONETEXTURE_BLEND : public COpenGLMaterialRenderer
64
COpenGLMaterialRenderer_ONETEXTURE_BLEND(video::COpenGLDriver* d)
65
: COpenGLMaterialRenderer(d) {}
67
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
68
bool resetAllRenderstates, IMaterialRendererServices* services)
70
Driver->disableTextures(1);
71
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
73
// if (material.MaterialType != lastMaterial.MaterialType ||
74
// material.MaterialTypeParam != lastMaterial.MaterialTypeParam ||
75
// resetAllRenderstates)
77
E_BLEND_FACTOR srcFact,dstFact;
78
E_MODULATE_FUNC modulate;
80
unpack_texureBlendFunc(srcFact, dstFact, modulate, alphaSource, material.MaterialTypeParam);
82
#ifdef GL_ARB_texture_env_combine
83
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
84
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
85
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
86
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
87
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, (f32) modulate );
89
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
90
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE);
91
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
92
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
93
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, (f32) modulate );
96
glBlendFunc(Driver->getGLBlend(srcFact), Driver->getGLBlend(dstFact));
97
glEnable(GL_ALPHA_TEST);
98
glAlphaFunc(GL_GREATER, 0.f);
101
if ( textureBlendFunc_hasAlpha(srcFact) || textureBlendFunc_hasAlpha(dstFact) )
103
if (alphaSource==EAS_VERTEX_COLOR)
105
#ifdef GL_ARB_texture_env_combine
106
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
107
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PRIMARY_COLOR_ARB);
109
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE);
110
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_PRIMARY_COLOR_EXT);
113
else if (alphaSource==EAS_TEXTURE)
115
#ifdef GL_ARB_texture_env_combine
116
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
117
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE);
119
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE);
120
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_TEXTURE);
125
#ifdef GL_ARB_texture_env_combine
126
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE);
127
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PRIMARY_COLOR_ARB);
128
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_TEXTURE);
130
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_MODULATE);
131
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_PRIMARY_COLOR_EXT);
132
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, GL_TEXTURE);
139
virtual void OnUnsetMaterial()
141
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
142
#ifdef GL_ARB_texture_env_combine
143
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE);
144
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1.f );
145
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
147
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_MODULATE);
148
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1.f );
149
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
153
glDisable(GL_ALPHA_TEST);
156
//! Returns if the material is transparent.
157
/** Is not always transparent, but mostly. */
158
virtual bool isTransparent() const
165
//! Solid 2 layer material renderer
166
class COpenGLMaterialRenderer_SOLID_2_LAYER : public COpenGLMaterialRenderer
170
COpenGLMaterialRenderer_SOLID_2_LAYER(video::COpenGLDriver* d)
171
: COpenGLMaterialRenderer(d) {}
173
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
174
bool resetAllRenderstates, IMaterialRendererServices* services)
176
Driver->disableTextures(2);
177
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
179
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
181
if (Driver->queryFeature(EVDF_MULTITEXTURE))
183
Driver->extGlActiveTexture(GL_TEXTURE1_ARB);
184
#ifdef GL_ARB_texture_env_combine
185
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
186
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
187
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PRIMARY_COLOR_ARB);
188
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE);
189
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
190
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
191
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR);
192
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA);
194
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
195
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE);
196
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_PRIMARY_COLOR_EXT);
197
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_INTERPOLATE);
198
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
199
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
200
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE2_RGB_EXT, GL_PRIMARY_COLOR);
201
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_EXT, GL_SRC_ALPHA);
207
virtual void OnUnsetMaterial()
209
if (Driver->queryFeature(EVDF_MULTITEXTURE))
211
Driver->extGlActiveTexture(GL_TEXTURE1_ARB);
212
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
213
#ifdef GL_ARB_texture_env_combine
214
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR);
216
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_EXT, GL_SRC_COLOR);
218
Driver->extGlActiveTexture(GL_TEXTURE0_ARB);
224
//! Transparent add color material renderer
225
class COpenGLMaterialRenderer_TRANSPARENT_ADD_COLOR : public COpenGLMaterialRenderer
229
COpenGLMaterialRenderer_TRANSPARENT_ADD_COLOR(video::COpenGLDriver* d)
230
: COpenGLMaterialRenderer(d) {}
232
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
233
bool resetAllRenderstates, IMaterialRendererServices* services)
235
Driver->disableTextures(1);
236
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
238
if ((material.MaterialType != lastMaterial.MaterialType) || resetAllRenderstates)
240
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
241
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
246
virtual void OnUnsetMaterial()
251
//! Returns if the material is transparent.
252
virtual bool isTransparent() const
259
//! Transparent vertex alpha material renderer
260
class COpenGLMaterialRenderer_TRANSPARENT_VERTEX_ALPHA : public COpenGLMaterialRenderer
264
COpenGLMaterialRenderer_TRANSPARENT_VERTEX_ALPHA(video::COpenGLDriver* d)
265
: COpenGLMaterialRenderer(d) {}
267
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
268
bool resetAllRenderstates, IMaterialRendererServices* services)
270
Driver->disableTextures(1);
271
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
273
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
275
#ifdef GL_ARB_texture_env_combine
276
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
277
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
278
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PRIMARY_COLOR_ARB);
279
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
280
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
281
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
283
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
284
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE);
285
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_PRIMARY_COLOR_EXT );
286
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE);
287
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
288
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
290
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
295
virtual void OnUnsetMaterial()
298
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
299
#ifdef GL_ARB_texture_env_combine
300
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE );
301
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE );
303
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_MODULATE );
304
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_TEXTURE );
309
//! Returns if the material is transparent.
310
virtual bool isTransparent() const
317
//! Transparent alpha channel material renderer
318
class COpenGLMaterialRenderer_TRANSPARENT_ALPHA_CHANNEL : public COpenGLMaterialRenderer
322
COpenGLMaterialRenderer_TRANSPARENT_ALPHA_CHANNEL(video::COpenGLDriver* d)
323
: COpenGLMaterialRenderer(d) {}
325
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
326
bool resetAllRenderstates, IMaterialRendererServices* services)
328
Driver->disableTextures(1);
329
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
331
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates
332
|| material.MaterialTypeParam != lastMaterial.MaterialTypeParam )
334
#ifdef GL_ARB_texture_env_combine
335
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
336
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
337
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
338
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
339
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
340
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE);
342
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
343
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE);
344
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
345
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
346
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE);
347
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_TEXTURE);
349
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
351
glEnable(GL_ALPHA_TEST);
353
glAlphaFunc(GL_GREATER, material.MaterialTypeParam);
357
virtual void OnUnsetMaterial()
359
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
360
#ifdef GL_ARB_texture_env_combine
361
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE );
363
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_MODULATE );
365
glDisable(GL_ALPHA_TEST);
369
//! Returns if the material is transparent.
370
virtual bool isTransparent() const
377
//! Transparent alpha channel material renderer
378
class COpenGLMaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF : public COpenGLMaterialRenderer
382
COpenGLMaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF(video::COpenGLDriver* d)
383
: COpenGLMaterialRenderer(d) {}
385
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
386
bool resetAllRenderstates, IMaterialRendererServices* services)
388
Driver->disableTextures(1);
389
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
391
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
393
glEnable(GL_ALPHA_TEST);
394
glAlphaFunc(GL_GREATER, 0.5f);
395
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
399
virtual void OnUnsetMaterial()
401
glDisable(GL_ALPHA_TEST);
404
//! Returns if the material is transparent.
405
virtual bool isTransparent() const
407
return false; // this material is not really transparent because it does no blending.
412
//! material renderer for all kinds of lightmaps
413
class COpenGLMaterialRenderer_LIGHTMAP : public COpenGLMaterialRenderer
417
COpenGLMaterialRenderer_LIGHTMAP(video::COpenGLDriver* d)
418
: COpenGLMaterialRenderer(d) {}
420
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
421
bool resetAllRenderstates, IMaterialRendererServices* services)
423
Driver->disableTextures(2);
424
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
426
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
430
switch (material.MaterialType)
432
case EMT_LIGHTMAP_LIGHTING:
433
case EMT_LIGHTMAP_LIGHTING_M2:
434
case EMT_LIGHTMAP_LIGHTING_M4:
435
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
437
case EMT_LIGHTMAP_ADD:
439
case EMT_LIGHTMAP_M2:
440
case EMT_LIGHTMAP_M4:
442
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
446
if (Driver->queryFeature(EVDF_MULTITEXTURE))
450
Driver->extGlActiveTexture(GL_TEXTURE1_ARB);
451
#ifdef GL_ARB_texture_env_combine
452
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
454
if (material.MaterialType == EMT_LIGHTMAP_ADD)
455
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD);
457
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
459
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
460
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
461
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE);
462
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE);
463
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_PREVIOUS_ARB);
465
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
467
if (material.MaterialType == EMT_LIGHTMAP_ADD)
468
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_ADD);
470
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE);
472
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
473
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
474
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_MODULATE);
475
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_TEXTURE);
476
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, GL_PREVIOUS_EXT);
479
switch (material.MaterialType)
481
case EMT_LIGHTMAP_M4:
482
case EMT_LIGHTMAP_LIGHTING_M4:
483
#ifdef GL_ARB_texture_env_combine
484
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 4.0f);
486
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 4.0f);
489
case EMT_LIGHTMAP_M2:
490
case EMT_LIGHTMAP_LIGHTING_M2:
491
#ifdef GL_ARB_texture_env_combine
492
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 2.0f);
494
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 2.0f);
498
#ifdef GL_ARB_texture_env_combine
499
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1.0f);
501
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1.0f);
504
Driver->extGlActiveTexture(GL_TEXTURE0_ARB);
509
virtual void OnUnsetMaterial()
511
if (Driver->queryFeature(EVDF_MULTITEXTURE))
513
Driver->extGlActiveTexture(GL_TEXTURE1_ARB);
514
#ifdef GL_ARB_texture_env_combine
515
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1.f );
517
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1.f );
519
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
520
Driver->extGlActiveTexture(GL_TEXTURE0_ARB);
521
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
528
//! detail map material renderer
529
class COpenGLMaterialRenderer_DETAIL_MAP : public COpenGLMaterialRenderer
533
COpenGLMaterialRenderer_DETAIL_MAP(video::COpenGLDriver* d)
534
: COpenGLMaterialRenderer(d) {}
536
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
537
bool resetAllRenderstates, IMaterialRendererServices* services)
539
Driver->disableTextures(2);
540
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
542
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
544
// diffuse map is default modulated
546
// detail map on second layer
547
if (Driver->queryFeature(EVDF_MULTITEXTURE))
549
Driver->extGlActiveTexture(GL_TEXTURE1_ARB);
550
#ifdef GL_ARB_texture_env_combine
551
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
552
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD_SIGNED_ARB);
553
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
554
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
556
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
557
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_ADD_SIGNED_EXT);
558
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
559
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
565
virtual void OnUnsetMaterial()
567
if (Driver->queryFeature(EVDF_MULTITEXTURE))
569
Driver->extGlActiveTexture(GL_TEXTURE1_ARB);
570
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
571
Driver->extGlActiveTexture(GL_TEXTURE0_ARB);
577
//! sphere map material renderer
578
class COpenGLMaterialRenderer_SPHERE_MAP : public COpenGLMaterialRenderer
582
COpenGLMaterialRenderer_SPHERE_MAP(video::COpenGLDriver* d)
583
: COpenGLMaterialRenderer(d) {}
585
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
586
bool resetAllRenderstates, IMaterialRendererServices* services)
588
Driver->disableTextures(1);
589
// texture needs to be flipped for OpenGL
590
core::matrix4 tmp = Driver->getTransform(ETS_TEXTURE_0);
592
Driver->setTransform(ETS_TEXTURE_0, tmp);
593
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
595
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
597
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
598
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
600
glEnable(GL_TEXTURE_GEN_S);
601
glEnable(GL_TEXTURE_GEN_T);
605
virtual void OnUnsetMaterial()
607
glDisable(GL_TEXTURE_GEN_S);
608
glDisable(GL_TEXTURE_GEN_T);
613
//! reflection 2 layer material renderer
614
class COpenGLMaterialRenderer_REFLECTION_2_LAYER : public COpenGLMaterialRenderer
618
COpenGLMaterialRenderer_REFLECTION_2_LAYER(video::COpenGLDriver* d)
619
: COpenGLMaterialRenderer(d) {}
621
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
622
bool resetAllRenderstates, IMaterialRendererServices* services)
624
Driver->disableTextures(2);
625
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
627
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
629
if (Driver->queryFeature(EVDF_MULTITEXTURE))
631
Driver->extGlActiveTexture(GL_TEXTURE1_ARB);
632
#ifdef GL_ARB_texture_env_combine
633
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
634
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
635
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
636
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
638
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
639
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE);
640
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
641
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
644
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
645
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
646
glEnable(GL_TEXTURE_GEN_S);
647
glEnable(GL_TEXTURE_GEN_T);
651
virtual void OnUnsetMaterial()
653
if (Driver->queryFeature(EVDF_MULTITEXTURE))
655
Driver->extGlActiveTexture(GL_TEXTURE1_ARB);
656
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
658
glDisable(GL_TEXTURE_GEN_S);
659
glDisable(GL_TEXTURE_GEN_T);
660
if (Driver->queryFeature(EVDF_MULTITEXTURE))
662
Driver->extGlActiveTexture(GL_TEXTURE0_ARB);
668
//! reflection 2 layer material renderer
669
class COpenGLMaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER : public COpenGLMaterialRenderer
673
COpenGLMaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER(video::COpenGLDriver* d)
674
: COpenGLMaterialRenderer(d) {}
676
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
677
bool resetAllRenderstates, IMaterialRendererServices* services)
679
Driver->disableTextures(2);
680
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
682
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
684
#ifdef GL_ARB_texture_env_combine
685
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
686
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
687
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
688
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
689
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
690
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB);
692
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
693
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE);
694
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
695
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
696
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE);
697
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_PREVIOUS_ARB);
699
if (Driver->queryFeature(EVDF_MULTITEXTURE))
701
Driver->extGlActiveTexture(GL_TEXTURE1_ARB);
702
#ifdef GL_ARB_texture_env_combine
703
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
704
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
705
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
706
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
707
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
708
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB);
710
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
711
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE);
712
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
713
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
714
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE);
715
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_PREVIOUS_ARB);
718
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
719
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
720
glEnable(GL_TEXTURE_GEN_S);
721
glEnable(GL_TEXTURE_GEN_T);
723
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
728
virtual void OnUnsetMaterial()
730
if (Driver->queryFeature(EVDF_MULTITEXTURE))
732
Driver->extGlActiveTexture(GL_TEXTURE1_ARB);
733
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
735
glDisable(GL_TEXTURE_GEN_S);
736
glDisable(GL_TEXTURE_GEN_T);
737
if (Driver->queryFeature(EVDF_MULTITEXTURE))
739
Driver->extGlActiveTexture(GL_TEXTURE0_ARB);
744
//! Returns if the material is transparent.
745
virtual bool isTransparent() const
751
} // end namespace video
752
} // end namespace irr