FixedFunctionMaterial/FixedFunctionMaterial.cpp

FixedFunctionMaterial/FixedFunctionMaterial.cpp
//**************************************************************************/
// Copyright (c) 2008 Autodesk, Inc.
// All rights reserved.
//
// Use of this software is subject to the terms of the Autodesk license
// agreement provided at the time of installation or download, or which
// otherwise accompanies this software in either electronic or hard copy form.
//
//**************************************************************************/
// DESCRIPTION:
// CREATED: October 2008
//**************************************************************************/
#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(.2f, .02f, .8f));
// Sets texture to diffuse color.
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);
// Create OpenGL texture ID.
glGenTextures(1, &m_iDiffuseTexture);
m_fShiny.SetMax(128);
m_fShiny.SetMin(0);
m_fShiny = 100;
};
FixedFunctionMaterial::~FixedFunctionMaterial( void )
{
// Clean up
delete m_pTexturePool;
glDeleteTextures(1, &m_iDiffuseTexture);
};
bool FixedFunctionMaterial::Activate( const Mesh *pMesh, const AxisAlignedBoundingBox &cUVArea, const Color &cColor )
{
// Render settings
glEnable( GL_LIGHTING );
glEnable( GL_CULL_FACE );
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);
// Get the correct texture for this tile.
class Texture *pT = m_pTexturePool->Tile( cUVArea );
if ( pT )
{
glEnable( GL_TEXTURE_2D );
pT->Activate();
}
else
glDisable( GL_TEXTURE_2D );
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_iDiffuseTexture);
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
// Apply the texture
glTexImage2D(GL_TEXTURE_2D, 0,
GL_RGB8, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, &m_pDiffuseTexture);
return true;
};
void FixedFunctionMaterial::Deactivate( void )
{
glDisable(GL_TEXTURE_2D);
};
void FixedFunctionMaterial::OnNodeEvent( const Attribute &cAttribute, NodeEventType cType )
{
// UI events.
bool bRedraw = false;
if ( cType == etValueChanged && cAttribute == m_sTexture )
{
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)
Kernel()->Redraw();
};