Files
OpenSceneGraph/src/osgPlugins/osg/Light.cpp
2005-11-17 15:03:51 +00:00

130 lines
3.3 KiB
C++

#if defined(_MSC_VER)
#pragma warning( disable : 4786 )
#endif
#include "osg/Light"
#include <osg/io_utils>
#include "osgDB/Registry"
#include "osgDB/Input"
#include "osgDB/Output"
using namespace osg;
using namespace osgDB;
// forward declare functions to use later.
bool Light_readLocalData(Object& obj, Input& fr);
bool Light_writeLocalData(const Object& obj, Output& fw);
// register the read and write functions with the osgDB::Registry.
RegisterDotOsgWrapperProxy g_LightProxy
(
new osg::Light,
"Light",
"Object StateAttribute Light",
&Light_readLocalData,
&Light_writeLocalData
);
bool Light_readLocalData(Object& obj, Input& fr)
{
bool iteratorAdvanced = false;
Light& light = static_cast<Light&>(obj);
if (fr[0].matchWord("light_num"))
{
int lightnum=0;
if (fr[1].getInt(lightnum))
{
light.setLightNum(lightnum);
fr += 2;
iteratorAdvanced = true;
}
}
#define ReadVec4(A,B) { \
if (fr[0].matchWord(B) && \
fr[1].getFloat(vec4[0]) && \
fr[2].getFloat(vec4[1]) && \
fr[3].getFloat(vec4[2]) && \
fr[4].getFloat(vec4[3])) \
{ \
light.A(vec4); \
fr+=5; \
iteratorAdvanced = true; \
} \
}
#define ReadVec3(A,B) { \
if (fr[0].matchWord(B) && \
fr[1].getFloat(vec3[0]) && \
fr[2].getFloat(vec3[1]) && \
fr[3].getFloat(vec3[2])) \
{ \
light.A(vec3); \
fr+=4; \
iteratorAdvanced = true; \
} \
}
#define ReadFloat(A,B) { \
if (fr[0].matchWord(B) && \
fr[1].getFloat(value)) \
{ \
light.A(value); \
fr+=2; \
iteratorAdvanced = true; \
} \
}
Vec4 vec4;
ReadVec4(setAmbient,"ambient")
ReadVec4(setDiffuse,"diffuse")
ReadVec4(setSpecular,"specular")
ReadVec4(setPosition,"position")
Vec3 vec3;
ReadVec3(setDirection,"direction")
float value;
ReadFloat(setConstantAttenuation,"constant_attenuation")
ReadFloat(setLinearAttenuation,"linear_attenuation")
ReadFloat(setQuadraticAttenuation,"quadratic_attenuation")
ReadFloat(setSpotExponent,"spot_exponent")
ReadFloat(setSpotCutoff,"spot_cutoff")
#undef ReadVec4
#undef ReadVec3
#undef ReadFloat
return iteratorAdvanced;
}
bool Light_writeLocalData(const Object& obj,Output& fw)
{
const Light& light = static_cast<const Light&>(obj);
fw.indent() << "light_num " << light.getLightNum() << std::endl;
// Vec4's
fw.indent() << "ambient " << light.getAmbient() << std::endl;
fw.indent() << "diffuse " << light.getDiffuse() << std::endl;
fw.indent() << "specular " << light.getSpecular() << std::endl;
fw.indent() << "position " << light.getPosition() << std::endl;
// Vec3's
fw.indent() << "direction " << light.getDirection() << std::endl;
// float's
fw.indent() << "constant_attenuation " << light.getConstantAttenuation() << std::endl;
fw.indent() << "linear_attenuation " << light.getLinearAttenuation () << std::endl;
fw.indent() << "quadratic_attenuation " << light.getQuadraticAttenuation() << std::endl;
fw.indent() << "spot_exponent " << light.getSpotExponent() << std::endl;
fw.indent() << "spot_cutoff " << light.getSpotCutoff() << std::endl;
return true;
}