OpenSceneGraph/src/osgPlugins/osg/Material.cpp
Robert Osfield 84d2d01163 Added support for osg::MemoryManager which is based upon Paul Nettle's
memory manager published at flipcode.com.  This can be turned on
with the OSG_USE_MEMORY_MANGER option which then uses custom global
new and delete operators as well as provide osgNew and osgDelete macro's
which add ability to log line and file from which calls are made.

Updated osg,osgUtil,osgDB,osgText and osgPlugins/osg to use osgNew/osgDelete,
and fixed memory leaks highlighted by the new memory manager.
2002-03-26 23:52:52 +00:00

254 lines
6.9 KiB
C++

#if defined(_MSC_VER)
#pragma warning( disable : 4786 )
#endif
#include "osg/Material"
#include "osgDB/Registry"
#include "osgDB/Input"
#include "osgDB/Output"
using namespace osg;
using namespace osgDB;
// forward declare functions to use later.
bool Material_readLocalData(Object& obj, Input& fr);
bool Material_writeLocalData(const Object& obj, Output& fw);
bool Material_matchFaceAndColor(Input& fr,const char* name,Material::Face& mf,Vec4& color);
// register the read and write functions with the osgDB::Registry.
RegisterDotOsgWrapperProxy g_MaterialProxy
(
osgNew osg::Material,
"Material",
"Object StateAttribute Material",
&Material_readLocalData,
&Material_writeLocalData
);
bool Material_readLocalData(Object& obj, Input& fr)
{
bool iteratorAdvanced = false;
Material& material = static_cast<Material&>(obj);
Vec4 data(0.0f, 0.0f, 0.0f, 1.0f);
Material::Face mf = Material::FRONT_AND_BACK;
if (fr[0].matchWord("ColorMode"))
{
if (fr[1].matchWord("AMBIENT"))
{
material.setColorMode(Material::AMBIENT);
fr+=2;
iteratorAdvanced = true;
}
else if (fr[1].matchWord("DIFFUSE"))
{
material.setColorMode(Material::DIFFUSE);
fr+=2;
iteratorAdvanced = true;
}
else if (fr[1].matchWord("SPECULAR"))
{
material.setColorMode(Material::SPECULAR);
fr+=2;
iteratorAdvanced = true;
}
else if (fr[1].matchWord("EMISSION"))
{
material.setColorMode(Material::EMISSION);
fr+=2;
iteratorAdvanced = true;
}
else if (fr[1].matchWord("AMBIENT_AND_DIFFUSE"))
{
material.setColorMode(Material::AMBIENT_AND_DIFFUSE);
fr+=2;
iteratorAdvanced = true;
}
else if (fr[1].matchWord("OFF"))
{
material.setColorMode(Material::OFF);
fr+=2;
iteratorAdvanced = true;
}
}
if (Material_matchFaceAndColor(fr,"ambientColor",mf,data))
{
material.setAmbient(mf,data);
iteratorAdvanced = true;
}
if (Material_matchFaceAndColor(fr,"diffuseColor",mf,data))
{
material.setDiffuse(mf,data);
iteratorAdvanced = true;
}
if (Material_matchFaceAndColor(fr,"specularColor",mf,data))
{
material.setSpecular(mf,data);
iteratorAdvanced = true;
}
if (Material_matchFaceAndColor(fr,"emissionColor",mf,data) ||
Material_matchFaceAndColor(fr,"emissiveColor",mf,data))
{
material.setEmission(mf,data);
iteratorAdvanced = true;
}
if (Material_matchFaceAndColor(fr,"ambientColor",mf,data))
{
material.setAmbient(mf,data);
iteratorAdvanced = true;
}
float shininess = 0.0f;
if (fr[0].matchWord("shininess"))
{
mf = Material::FRONT_AND_BACK;
int fr_inc = 1;
if (fr[1].matchWord("FRONT"))
{
mf = Material::FRONT;
++fr_inc;
}
else if (fr[1].matchWord("BACK"))
{
mf = Material::BACK;
++fr_inc;
}
if (fr[fr_inc].getFloat(shininess))
{
fr+=(fr_inc+1);
material.setShininess(mf,shininess);
iteratorAdvanced = true;
}
}
float transparency = 0.0f;
if (fr[0].matchWord("transparency") && fr[1].getFloat(transparency))
{
material.setTransparency(Material::FRONT_AND_BACK,transparency);
fr+=2;
iteratorAdvanced = true;
}
return iteratorAdvanced;
}
bool Material_matchFaceAndColor(Input& fr,const char* name,Material::Face& mf,Vec4& color)
{
bool iteratorAdvanced = false;
if (fr[0].matchWord(name))
{
int fr_inc = 1;
if (fr[1].matchWord("FRONT"))
{
mf = Material::FRONT;
++fr_inc;
}
else if (fr[1].matchWord("BACK"))
{
mf = Material::BACK;
++fr_inc;
}
if (fr[fr_inc].getFloat(color[0]) && fr[fr_inc+1].getFloat(color[1]) && fr[fr_inc+2].getFloat(color[2]))
{
fr_inc += 3;
if (fr[fr_inc].getFloat(color[3])) ++fr_inc;
else color[3] = 1.0f;
fr+=fr_inc;
iteratorAdvanced = true;
}
}
return iteratorAdvanced;
}
bool Material_writeLocalData(const Object& obj, Output& fw)
{
const Material& material = static_cast<const Material&>(obj);
switch(material.getColorMode())
{
case(Material::AMBIENT): fw.indent() << "ColorMode AMBIENT" << std::endl; break;
case(Material::DIFFUSE): fw.indent() << "ColorMode DIFFUSE" << std::endl; break;
case(Material::SPECULAR): fw.indent() << "ColorMode SPECULAR" << std::endl; break;
case(Material::EMISSION): fw.indent() << "ColorMode EMISSION" << std::endl; break;
case(Material::AMBIENT_AND_DIFFUSE): fw.indent() << "ColorMode AMBIENT_AND_DIFFUSE" << std::endl; break;
case(Material::OFF): fw.indent() << "ColorMode OFF" << std::endl; break;
}
if (material.getAmbientFrontAndBack())
{
fw.indent() << "ambientColor " << material.getAmbient(Material::FRONT) << std::endl;
}
else
{
fw.indent() << "ambientColor FRONT " << material.getAmbient(Material::FRONT) << std::endl;
fw.indent() << "ambientColor BACK " << material.getAmbient(Material::BACK) << std::endl;
}
if (material.getDiffuseFrontAndBack())
{
fw.indent() << "diffuseColor " << material.getDiffuse(Material::FRONT) << std::endl;
}
else
{
fw.indent() << "diffuseColor FRONT " << material.getDiffuse(Material::FRONT) << std::endl;
fw.indent() << "diffuseColor BACK " << material.getDiffuse(Material::BACK) << std::endl;
}
if (material.getSpecularFrontAndBack())
{
fw.indent() << "specularColor " << material.getSpecular(Material::FRONT) << std::endl;
}
else
{
fw.indent() << "specularColor FRONT " << material.getSpecular(Material::FRONT) << std::endl;
fw.indent() << "specularColor BACK " << material.getSpecular(Material::BACK) << std::endl;
}
if (material.getEmissionFrontAndBack())
{
fw.indent() << "emissionColor " << material.getEmission(Material::FRONT) << std::endl;
}
else
{
fw.indent() << "emissionColor FRONT " << material.getEmission(Material::FRONT) << std::endl;
fw.indent() << "emissionColor BACK " << material.getEmission(Material::BACK) << std::endl;
}
if (material.getShininessFrontAndBack())
{
fw.indent() << "shininess " << material.getShininess(Material::FRONT) << std::endl;
}
else
{
fw.indent() << "shininess FRONT " << material.getShininess(Material::FRONT) << std::endl;
fw.indent() << "shininess BACK " << material.getShininess(Material::BACK) << std::endl;
}
return true;
}