2ba228a486
The whole implementation of the new driver was provided by the folks from Amundis (http://amundis.fr/index.php?lang=en). There are more projects to come from them. Many thanks to Thibault and his colleagues for providing the code for inclusion in the engine. Please note that you have to remove not only the OpenGL driver (automatically done in IrrCompileConfig once the ogl-es driver is enabled there), but also the linking against the opengl32.lib in the project files. Otherwise no rendering will happen. Also note that the driver currently does not support all features of the engine. Some materials are not fully working, the shadow system seems to be missing, and the mipmapping is broken. These things will be fixed in future bug fixes. git-svn-id: http://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@3370 dfc29bdd-3216-0410-991c-e03cc46cb475
599 lines
25 KiB
C++
599 lines
25 KiB
C++
// Copyright (C) 2009-2010 Amundis
|
|
// Heavily based on the OpenGL driver implemented by Nikolaus Gebhardt
|
|
// and OpenGL ES driver implemented by Christian Stehno
|
|
// This file is part of the "Irrlicht Engine".
|
|
// For conditions of distribution and use, see copyright notice in Irrlicht.h
|
|
#ifndef __C_OGLES2_MATERIAL_RENDERER_H_INCLUDED__
|
|
#define __C_OGLES2_MATERIAL_RENDERER_H_INCLUDED__
|
|
|
|
#include "IrrCompileConfig.h"
|
|
#ifdef _IRR_COMPILE_WITH_OGLES2_
|
|
|
|
#include "COGLES2SLMaterialRenderer.h"
|
|
#include "COGLES2FixedPipelineShader.h"
|
|
|
|
namespace irr
|
|
{
|
|
namespace video
|
|
{
|
|
|
|
//! Base class for all internal OGLES2 material renderers
|
|
class COGLES2MaterialRenderer : public IMaterialRenderer
|
|
{
|
|
public:
|
|
|
|
//! Constructor
|
|
COGLES2MaterialRenderer( video::COGLES2Driver* driver ) :
|
|
Driver( driver ),
|
|
FixedPipeline( driver->fixedPipeline() )
|
|
{
|
|
}
|
|
|
|
virtual bool OnRender( IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype )
|
|
{
|
|
return FixedPipeline->OnRender( service, vtxtype );
|
|
}
|
|
|
|
protected:
|
|
|
|
video::COGLES2Driver* Driver;
|
|
COGLES2FixedPipelineShader* FixedPipeline;
|
|
};
|
|
|
|
//! Solid material renderer
|
|
class COGLES2MaterialRenderer_SOLID : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_SOLID( video::COGLES2Driver* d ) :
|
|
COGLES2MaterialRenderer( d )
|
|
{
|
|
}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
if ( resetAllRenderstates || ( material.MaterialType != lastMaterial.MaterialType ) )
|
|
{
|
|
FixedPipeline->useProgram();
|
|
FixedPipeline->setRenderMode( EMT_SOLID );
|
|
}
|
|
FixedPipeline->setMaterial( material );
|
|
Driver->disableTextures( 1 );
|
|
Driver->setTexture( 0, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
|
|
|
|
}
|
|
};
|
|
|
|
|
|
//! Generic Texture Blend
|
|
class COGLES2MaterialRenderer_ONETEXTURE_BLEND : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_ONETEXTURE_BLEND( video::COGLES2Driver* d )
|
|
: COGLES2MaterialRenderer( d ) {}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
Driver->disableTextures( 1 );
|
|
Driver->setTexture( 0, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
FixedPipeline->setMaterial( material );
|
|
FixedPipeline->useProgram();
|
|
|
|
// if (material.MaterialType != lastMaterial.MaterialType ||
|
|
// material.MaterialTypeParam != lastMaterial.MaterialTypeParam ||
|
|
// resetAllRenderstates)
|
|
{
|
|
E_BLEND_FACTOR srcFact, dstFact;
|
|
E_MODULATE_FUNC modulate;
|
|
u32 alphaSource;
|
|
unpack_texureBlendFunc( srcFact, dstFact, modulate, alphaSource, material.MaterialTypeParam );
|
|
|
|
//TODO : OpenGL ES 2.0 Port glTexEnvf
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
|
|
//rgbModulatePreviousTexture
|
|
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, (f32) modulate );
|
|
|
|
//glBlendFunc( getGLBlend(srcFact), getGLBlend(dstFact) );
|
|
FixedPipeline->enableAlphaTest();
|
|
FixedPipeline->setAlphaValue( 0.f );
|
|
Driver->enableBlend();
|
|
Driver->blendFunc( srcFact, dstFact );
|
|
|
|
if ( textureBlendFunc_hasAlpha( srcFact ) || textureBlendFunc_hasAlpha( dstFact ) )
|
|
{
|
|
//TODO : OpenGL ES 2.0 Port glTexEnvf
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
|
|
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR);
|
|
}
|
|
}
|
|
}
|
|
|
|
virtual void OnUnsetMaterial()
|
|
{
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.f );
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
|
|
|
|
Driver->disableBlend();
|
|
FixedPipeline->disableAlphaTest();
|
|
}
|
|
|
|
//! Returns if the material is transparent.
|
|
/** Is not always transparent, but mostly. */
|
|
virtual bool isTransparent() const
|
|
{
|
|
return true;
|
|
}
|
|
};
|
|
|
|
|
|
//! Solid 2 layer material renderer
|
|
class COGLES2MaterialRenderer_SOLID_2_LAYER : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_SOLID_2_LAYER( video::COGLES2Driver* d )
|
|
: COGLES2MaterialRenderer( d ) {}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
Driver->disableTextures( 2 );
|
|
Driver->setTexture( 1, material.getTexture( 1 ) );
|
|
Driver->setTexture( 0, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
|
|
if ( material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates )
|
|
{
|
|
if ( Driver->queryFeature( EVDF_MULTITEXTURE ) )
|
|
{
|
|
//Driver->extGlActiveTexture(GL_TEXTURE1);
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_PRIMARY_COLOR);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
|
|
}
|
|
}
|
|
}
|
|
|
|
virtual void OnUnsetMaterial()
|
|
{
|
|
if ( Driver->queryFeature( EVDF_MULTITEXTURE ) )
|
|
{
|
|
//Driver->extGlActiveTexture(GL_TEXTURE1);
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR);
|
|
//Driver->extGlActiveTexture(GL_TEXTURE0);
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
//! Transparent add color material renderer
|
|
class COGLES2MaterialRenderer_TRANSPARENT_ADD_COLOR : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_TRANSPARENT_ADD_COLOR( video::COGLES2Driver* d )
|
|
: COGLES2MaterialRenderer( d ) {}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
if (( material.MaterialType != lastMaterial.MaterialType ) || resetAllRenderstates )
|
|
{
|
|
Driver->blendFunc( EBF_ONE, EBF_ONE_MINUS_SRC_COLOR );
|
|
Driver->enableBlend();
|
|
FixedPipeline->useProgram();
|
|
FixedPipeline->setRenderMode( EMT_SOLID );
|
|
}
|
|
FixedPipeline->setMaterial( material );
|
|
Driver->disableTextures( 1 );
|
|
Driver->setTexture( 0, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
}
|
|
|
|
virtual void OnUnsetMaterial()
|
|
{
|
|
Driver->disableBlend();
|
|
}
|
|
|
|
//! Returns if the material is transparent.
|
|
virtual bool isTransparent() const
|
|
{
|
|
return true;
|
|
}
|
|
};
|
|
|
|
|
|
//! Transparent vertex alpha material renderer
|
|
class COGLES2MaterialRenderer_TRANSPARENT_VERTEX_ALPHA : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_TRANSPARENT_VERTEX_ALPHA( video::COGLES2Driver* d )
|
|
: COGLES2MaterialRenderer( d ) {}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
if ( material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates )
|
|
{
|
|
Driver->blendFunc( EBF_ONE, EBF_ONE_MINUS_SRC_ALPHA );
|
|
Driver->enableBlend();
|
|
FixedPipeline->useProgram();
|
|
FixedPipeline->setRenderMode( EMT_TRANSPARENT_VERTEX_ALPHA );
|
|
}
|
|
FixedPipeline->setMaterial( material );
|
|
Driver->disableTextures( 1 );
|
|
Driver->setTexture( 0, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
}
|
|
|
|
virtual void OnUnsetMaterial()
|
|
{
|
|
Driver->disableBlend();
|
|
}
|
|
|
|
//! Returns if the material is transparent.
|
|
virtual bool isTransparent() const
|
|
{
|
|
return true;
|
|
}
|
|
};
|
|
|
|
|
|
//! Transparent alpha channel material renderer
|
|
class COGLES2MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL( video::COGLES2Driver* d )
|
|
: COGLES2MaterialRenderer( d ) {}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
Driver->disableTextures( 1 );
|
|
Driver->setTexture( 0, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
|
|
if ( material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates
|
|
|| material.MaterialTypeParam != lastMaterial.MaterialTypeParam )
|
|
{
|
|
Driver->blendFunc( EBF_SRC_ALPHA, EBF_ONE_MINUS_SRC_ALPHA );
|
|
Driver->enableBlend();
|
|
FixedPipeline->useProgram();
|
|
FixedPipeline->setMaterial( material );
|
|
FixedPipeline->enableAlphaTest();
|
|
|
|
FixedPipeline->setAlphaValue( material.MaterialTypeParam );
|
|
FixedPipeline->setRenderMode( EMT_TRANSPARENT_ALPHA_CHANNEL );
|
|
}
|
|
}
|
|
|
|
virtual void OnUnsetMaterial()
|
|
{
|
|
FixedPipeline->disableAlphaTest();
|
|
Driver->disableBlend();
|
|
}
|
|
|
|
//! Returns if the material is transparent.
|
|
virtual bool isTransparent() const
|
|
{
|
|
return true;
|
|
}
|
|
};
|
|
|
|
|
|
|
|
//! Transparent alpha channel material renderer
|
|
class COGLES2MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF( video::COGLES2Driver* d )
|
|
: COGLES2MaterialRenderer( d ) {}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
Driver->disableTextures( 1 );
|
|
Driver->setTexture( 0, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
|
|
if ( material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates )
|
|
{
|
|
FixedPipeline->enableAlphaTest();
|
|
FixedPipeline->setAlphaValue( 0.5f );
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
}
|
|
}
|
|
|
|
virtual void OnUnsetMaterial()
|
|
{
|
|
FixedPipeline->disableAlphaTest();
|
|
}
|
|
|
|
//! Returns if the material is transparent.
|
|
virtual bool isTransparent() const
|
|
{
|
|
return false; // this material is not really transparent because it does no blending.
|
|
}
|
|
};
|
|
|
|
|
|
//! material renderer for all kinds of lightmaps
|
|
class COGLES2MaterialRenderer_LIGHTMAP : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_LIGHTMAP( video::COGLES2Driver* d )
|
|
: COGLES2MaterialRenderer( d ) {}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
if ( material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates )
|
|
{
|
|
FixedPipeline->useProgram();
|
|
FixedPipeline->setRenderMode( EMT_LIGHTMAP );
|
|
}
|
|
FixedPipeline->setMaterial( material );
|
|
Driver->disableTextures( 2 );
|
|
Driver->setTexture( 1, material.getTexture( 1 ) );
|
|
Driver->setTexture( 0, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
|
|
if ( material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates )
|
|
{
|
|
// diffuse map
|
|
|
|
switch ( material.MaterialType )
|
|
{
|
|
case EMT_LIGHTMAP_LIGHTING:
|
|
case EMT_LIGHTMAP_LIGHTING_M2:
|
|
case EMT_LIGHTMAP_LIGHTING_M4:
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
break;
|
|
case EMT_LIGHTMAP_ADD:
|
|
case EMT_LIGHTMAP:
|
|
case EMT_LIGHTMAP_M2:
|
|
case EMT_LIGHTMAP_M4:
|
|
default:
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
break;
|
|
}
|
|
|
|
if ( Driver->queryFeature( EVDF_MULTITEXTURE ) )
|
|
{
|
|
// lightmap
|
|
|
|
//Driver->extGlActiveTexture(GL_TEXTURE1);
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
|
|
|
if ( material.MaterialType == EMT_LIGHTMAP_ADD )
|
|
{
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD_SIGNED);
|
|
}
|
|
else
|
|
{
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
|
|
}
|
|
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
|
|
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_PREVIOUS);
|
|
|
|
switch ( material.MaterialType )
|
|
{
|
|
case EMT_LIGHTMAP_M4:
|
|
case EMT_LIGHTMAP_LIGHTING_M4:
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 4.0f);
|
|
break;
|
|
case EMT_LIGHTMAP_M2:
|
|
case EMT_LIGHTMAP_LIGHTING_M2:
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 2.0f);
|
|
break;
|
|
default:
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.0f);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
virtual void OnUnsetMaterial()
|
|
{
|
|
if ( Driver->queryFeature( EVDF_MULTITEXTURE ) )
|
|
{
|
|
//Driver->extGlActiveTexture(GL_TEXTURE1);
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.f );
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
//Driver->extGlActiveTexture(GL_TEXTURE0);
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
|
|
//! detail map material renderer
|
|
class COGLES2MaterialRenderer_DETAIL_MAP : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_DETAIL_MAP( video::COGLES2Driver* d )
|
|
: COGLES2MaterialRenderer( d ) {}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
if ( material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates )
|
|
{
|
|
FixedPipeline->useProgram();
|
|
FixedPipeline->setRenderMode( EMT_DETAIL_MAP );
|
|
}
|
|
FixedPipeline->setMaterial( material );
|
|
Driver->disableTextures( 2 );
|
|
Driver->setTexture( 1, material.getTexture( 1 ) );
|
|
Driver->setTexture( 0, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
}
|
|
};
|
|
|
|
|
|
//! sphere map material renderer
|
|
class COGLES2MaterialRenderer_SPHERE_MAP : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_SPHERE_MAP( video::COGLES2Driver* d )
|
|
: COGLES2MaterialRenderer( d ) {}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
if ( material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates )
|
|
{
|
|
FixedPipeline->useProgram();
|
|
FixedPipeline->setRenderMode( EMT_SPHERE_MAP );
|
|
}
|
|
FixedPipeline->setMaterial( material );
|
|
Driver->disableTextures( 1 );
|
|
Driver->setTexture( 0, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
}
|
|
|
|
virtual void OnUnsetMaterial()
|
|
{
|
|
}
|
|
};
|
|
|
|
|
|
//! reflection 2 layer material renderer
|
|
class COGLES2MaterialRenderer_REFLECTION_2_LAYER : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_REFLECTION_2_LAYER( video::COGLES2Driver* d )
|
|
: COGLES2MaterialRenderer( d ) {}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
if ( material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates )
|
|
{
|
|
FixedPipeline->useProgram();
|
|
FixedPipeline->setRenderMode( EMT_REFLECTION_2_LAYER );
|
|
}
|
|
FixedPipeline->setMaterial( material );
|
|
Driver->disableTextures( 2 );
|
|
Driver->setTexture( 0, material.getTexture( 1 ) );
|
|
Driver->setTexture( 1, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
}
|
|
};
|
|
|
|
|
|
//! reflection 2 layer material renderer
|
|
class COGLES2MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER : public COGLES2MaterialRenderer
|
|
{
|
|
public:
|
|
|
|
COGLES2MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER( video::COGLES2Driver* d )
|
|
: COGLES2MaterialRenderer( d ) {}
|
|
|
|
virtual void OnSetMaterial( const SMaterial& material, const SMaterial& lastMaterial,
|
|
bool resetAllRenderstates, IMaterialRendererServices* services )
|
|
{
|
|
Driver->disableTextures( 2 );
|
|
Driver->setTexture( 1, material.getTexture( 1 ) );
|
|
Driver->setTexture( 0, material.getTexture( 0 ) );
|
|
Driver->setBasicRenderStates( material, lastMaterial, resetAllRenderstates );
|
|
|
|
if ( material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates )
|
|
{
|
|
if ( Driver->queryFeature( EVDF_MULTITEXTURE ) )
|
|
{
|
|
//Driver->extGlActiveTexture(GL_TEXTURE1);
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
|
|
}
|
|
// glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
|
|
// glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
|
|
// glEnable(GL_TEXTURE_GEN_S);
|
|
// glEnable(GL_TEXTURE_GEN_T);
|
|
|
|
Driver->blendFunc( EBF_ONE, EBF_ONE_MINUS_SRC_ALPHA );
|
|
Driver->enableBlend();
|
|
}
|
|
}
|
|
|
|
virtual void OnUnsetMaterial()
|
|
{
|
|
if ( Driver->queryFeature( EVDF_MULTITEXTURE ) )
|
|
{
|
|
//Driver->extGlActiveTexture(GL_TEXTURE1);
|
|
//TODO : OpenGL ES 2.0 Port glTexEnv
|
|
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
}
|
|
// glDisable(GL_TEXTURE_GEN_S);
|
|
// glDisable(GL_TEXTURE_GEN_T);
|
|
if ( Driver->queryFeature( EVDF_MULTITEXTURE ) )
|
|
{
|
|
//Driver->extGlActiveTexture(GL_TEXTURE0);
|
|
}
|
|
Driver->disableBlend();
|
|
}
|
|
|
|
//! Returns if the material is transparent.
|
|
virtual bool isTransparent() const
|
|
{
|
|
return true;
|
|
}
|
|
};
|
|
|
|
} // end namespace video
|
|
} // end namespace irr
|
|
|
|
#endif
|
|
#endif
|