OpenSceneGraph/src/osgPlugins/osg/TexGen.cpp

136 lines
3.8 KiB
C++

#if defined(_MSC_VER)
#pragma warning( disable : 4786 )
#endif
#include "osg/TexGen"
#include "osg/io_utils"
#include "osgDB/Registry"
#include "osgDB/Input"
#include "osgDB/Output"
#include <string.h>
using namespace osg;
using namespace osgDB;
// forward declare functions to use later.
bool TexGen_readLocalData(Object& obj, Input& fr);
bool TexGen_writeLocalData(const Object& obj, Output& fw);
bool TexGen_matchModeStr(const char* str,TexGen::Mode& mode);
const char* TexGen_getModeStr(TexGen::Mode mode);
// register the read and write functions with the osgDB::Registry.
REGISTER_DOTOSGWRAPPER(TexGen)
(
new osg::TexGen,
"TexGen",
"Object StateAttribute TexGen",
&TexGen_readLocalData,
&TexGen_writeLocalData
);
bool TexGen_readLocalData(Object& obj, Input& fr)
{
bool iteratorAdvanced = false;
TexGen& texgen = static_cast<TexGen&>(obj);
TexGen::Mode mode;
if (fr[0].matchWord("mode") && TexGen_matchModeStr(fr[1].getStr(),mode))
{
texgen.setMode(mode);
fr+=2;
iteratorAdvanced = true;
}
osg::Plane plane;
if (fr[0].matchWord("plane_s"))
{
if (fr[1].getFloat(plane[0]) && fr[2].getFloat(plane[1]) &&
fr[3].getFloat(plane[2]) && fr[4].getFloat(plane[3]))
{
texgen.setPlane(TexGen::S,plane);
fr+=5;
iteratorAdvanced = true;
}
}
if (fr[0].matchWord("plane_t"))
{
if (fr[1].getFloat(plane[0]) && fr[2].getFloat(plane[1]) &&
fr[3].getFloat(plane[2]) && fr[4].getFloat(plane[3]))
{
texgen.setPlane(TexGen::T,plane);
fr+=5;
iteratorAdvanced = true;
}
}
if (fr[0].matchWord("plane_r"))
{
if (fr[1].getFloat(plane[0]) && fr[2].getFloat(plane[1]) &&
fr[3].getFloat(plane[2]) && fr[4].getFloat(plane[3]))
{
texgen.setPlane(TexGen::R,plane);
fr+=5;
iteratorAdvanced = true;
}
}
if (fr[0].matchWord("plane_q"))
{
if (fr[1].getFloat(plane[0]) && fr[2].getFloat(plane[1]) &&
fr[3].getFloat(plane[2]) && fr[4].getFloat(plane[3]))
{
texgen.setPlane(TexGen::Q,plane);
fr+=5;
iteratorAdvanced = true;
}
}
return iteratorAdvanced;
}
bool TexGen_matchModeStr(const char* str,TexGen::Mode& mode)
{
if (strcmp(str,"EYE_LINEAR")==0) mode = TexGen::EYE_LINEAR;
else if (strcmp(str,"OBJECT_LINEAR")==0) mode = TexGen::OBJECT_LINEAR;
else if (strcmp(str,"SPHERE_MAP")==0) mode = TexGen::SPHERE_MAP;
else if (strcmp(str,"NORMAL_MAP")==0) mode = TexGen::NORMAL_MAP;
else if (strcmp(str,"REFLECTION_MAP")==0) mode = TexGen::REFLECTION_MAP;
else return false;
return true;
}
const char* TexGen_getModeStr(TexGen::Mode mode)
{
switch(mode)
{
case(TexGen::EYE_LINEAR): return "EYE_LINEAR";
case(TexGen::OBJECT_LINEAR): return "OBJECT_LINEAR";
case(TexGen::SPHERE_MAP): return "SPHERE_MAP";
case(TexGen::NORMAL_MAP): return "NORMAL_MAP";
case(TexGen::REFLECTION_MAP): return "REFLECTION_MAP";
}
return "";
}
bool TexGen_writeLocalData(const Object& obj, Output& fw)
{
const TexGen& texgen = static_cast<const TexGen&>(obj);
fw.indent() << "mode " << TexGen_getModeStr(texgen.getMode()) << std::endl;
if (texgen.getMode() == TexGen::OBJECT_LINEAR || texgen.getMode() == TexGen::EYE_LINEAR)
{
fw.indent() << "plane_s " << texgen.getPlane(TexGen::S) << std::endl;
fw.indent() << "plane_t " << texgen.getPlane(TexGen::T) << std::endl;
fw.indent() << "plane_r " << texgen.getPlane(TexGen::R) << std::endl;
fw.indent() << "plane_q " << texgen.getPlane(TexGen::Q) << std::endl;
}
return true;
}