#include "FixedFunctionMaterial.h"
MB_PLUGIN(
"FixedFunctionMaterial",
"Fixed function material",
"Autodesk",
"http://www.mudbox3d.com", 0 );
IMPLEMENT_CLASS( FixedFunctionMaterial, Material,
"Fixed Function Material" );
FixedFunctionMaterial::FixedFunctionMaterial( void ) :
m_sTexture(this, "Texture"),
m_cDiffuse(this, "Diffuse"),
m_cSpecular(this, "Specular"),
m_cEmissive(this, "Emmissive"),
m_fShiny(this, "Shininess"),
m_iDiffuseTexture(-1)
{
SetName( "Benchmark Material" );
m_pTexturePool = CreateInstance<TexturePool>();
m_cSpecular.SetValue(Color(0,0,0,0));
m_cEmissive.SetValue(Color(0,0,0,0));
m_cDiffuse.SetValue(Color(.2
f, .02
f, .8
f));
m_pDiffuseTexture[0] = (GLubyte) (m_cDiffuse.Value().r * 255);
m_pDiffuseTexture[1] = (GLubyte) (m_cDiffuse.Value().g * 255);
m_pDiffuseTexture[2] = (GLubyte) (m_cDiffuse.Value().b * 255);
glGenTextures(1, &m_iDiffuseTexture);
m_fShiny.SetMax(128);
m_fShiny.SetMin(0);
m_fShiny = 100;
};
FixedFunctionMaterial::~FixedFunctionMaterial( void )
{
delete m_pTexturePool;
glDeleteTextures(1, &m_iDiffuseTexture);
};
bool FixedFunctionMaterial::Activate( const Mesh *pMesh, const AxisAlignedBoundingBox &cUVArea, const Color &cColor )
{
glEnable( GL_LIGHTING );
glMaterialfv(
GL_FRONT, GL_EMISSION, m_cEmissive.Value() );
glMaterialfv(
GL_FRONT, GL_SPECULAR, m_cSpecular.Value() );
glMateriali(
GL_FRONT, GL_SHININESS, (
int) m_fShiny);
glColorMaterial(
GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
class Texture *pT = m_pTexturePool->Tile( cUVArea );
if ( pT )
{
pT->Activate();
}
else
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
return true;
};
void FixedFunctionMaterial::Deactivate( void )
{
};
void FixedFunctionMaterial::OnNodeEvent(
const Attribute &cAttribute,
NodeEventType cType )
{
bool bRedraw = false;
{
m_pTexturePool->SetFileName( m_sTexture.Value() );
bRedraw = true;
};
if (cAttribute == m_cDiffuse || cAttribute == m_cEmissive ||
cAttribute == m_cSpecular || cAttribute == m_fShiny)
bRedraw = true;
if (cAttribute == m_cDiffuse)
{
m_pDiffuseTexture[0] = (GLubyte) (m_cDiffuse.Value().r * 255);
m_pDiffuseTexture[1] = (GLubyte) (m_cDiffuse.Value().g * 255);
m_pDiffuseTexture[2] = (GLubyte) (m_cDiffuse.Value().b * 255);
}
Material::OnNodeEvent( cAttribute, cType );
if (bRedraw)
};