1
0
forked from 0ad/0ad
0ad/source/graphics/Material.cpp
Calefaction 831053d680 Update to the material system
This was SVN commit r1193.
2004-09-23 05:10:03 +00:00

131 lines
2.6 KiB
C++
Executable File

#include "ogl.h"
#include "res/res.h"
#include "Material.h"
#define SAFE_DELETE(x) \
if((x)) { delete (x); (x) = NULL; }
CMaterial NullMaterial;
CMaterial IdentityMaterial;
// Values as taken straight from the Blue Book (god bless the Blue Book)
static SMaterialColor IdentityDiffuse(0.8f, 0.8f, 0.8f, 1.0f);
static SMaterialColor IdentityAmbient(0.2f, 0.2f, 0.2f, 1.0f);
static SMaterialColor IdentitySpecular(0.0f, 0.0f, 0.0f, 1.0f);
static SMaterialColor IdentityEmissive(0.0f, 0.0f, 0.0f, 1.0f);
static SMaterialColor *CopyColor(SMaterialColor *color)
{
if(!color)
return NULL;
if(color == &IdentityDiffuse
|| color == &IdentityAmbient
|| color == &IdentitySpecular
|| color == &IdentityEmissive)
return NULL;
SMaterialColor *ret = new SMaterialColor();
memcpy(ret, color, sizeof(SMaterialColor));
return ret;
}
CMaterial::CMaterial()
: m_Diffuse(NULL),
m_Ambient(NULL),
m_Specular(NULL),
m_Emissive(NULL),
m_SpecularPower(0.0f),
m_SourceBlend(GL_NONE),
m_DestBlend(GL_NONE),
m_AlphaFunc(GL_NONE),
m_AlphaClamp(1.0f),
m_Alpha(false)
{
}
CMaterial::CMaterial(const CMaterial &material)
{
(*this) = const_cast<CMaterial &>(material);
}
CMaterial::~CMaterial()
{
SAFE_DELETE(m_Diffuse);
SAFE_DELETE(m_Ambient);
SAFE_DELETE(m_Specular);
SAFE_DELETE(m_Emissive);
}
void CMaterial::operator =(CMaterial &material)
{
m_Diffuse = CopyColor(material.m_Diffuse);
m_Ambient = CopyColor(material.m_Ambient);
m_Specular = CopyColor(material.m_Specular);
m_Emissive = CopyColor(material.m_Emissive);
m_SpecularPower = material.m_SpecularPower;
m_SourceBlend = material.m_SourceBlend;
m_DestBlend = material.m_DestBlend;
m_AlphaFunc = material.m_AlphaFunc;
m_AlphaClamp = material.m_AlphaClamp;
m_Alpha = material.m_Alpha;
}
SMaterialColor CMaterial::GetDiffuse()
{
if(!m_Diffuse)
return IdentityDiffuse;
return *m_Diffuse;
}
SMaterialColor CMaterial::GetAmbient()
{
if(!m_Ambient)
return IdentityAmbient;
return *m_Ambient;
}
SMaterialColor CMaterial::GetSpecular()
{
if(!m_Specular)
return IdentitySpecular;
return *m_Ambient;
}
SMaterialColor CMaterial::GetEmissive()
{
if(!m_Emissive)
return IdentityEmissive;
return *m_Emissive;
}
#define SETMC(var) \
if((var)) (*var) = color; \
else (var) = CopyColor(&color) ;
void CMaterial::SetDiffuse(SMaterialColor &color)
{
SETMC(m_Diffuse);
}
void CMaterial::SetAmbient(SMaterialColor &color)
{
SETMC(m_Ambient);
}
void CMaterial::SetSpecular(SMaterialColor &color)
{
SETMC(m_Specular);
}
void CMaterial::SetEmissive(SMaterialColor &color)
{
SETMC(m_Emissive);
}
#undef SETMC