Files
OpenSceneGraph/src/osgPlugins/osg/LOD.cpp
Robert Osfield 70861ef70e Converted osg::LOD from used n+1 successive ranges to n min/max ranges,
one min/max pair per child. Converted the rest of the OSG to use the new
osg::LOD node.
2002-10-06 20:33:13 +00:00

144 lines
3.3 KiB
C++

#include "osg/LOD"
#include "osgDB/Registry"
#include "osgDB/Input"
#include "osgDB/Output"
using namespace osg;
using namespace osgDB;
// forward declare functions to use later.
bool LOD_readLocalData(Object& obj, Input& fr);
bool LOD_writeLocalData(const Object& obj, Output& fw);
// register the read and write functions with the osgDB::Registry.
RegisterDotOsgWrapperProxy g_LODProxy
(
osgNew osg::LOD,
"LOD",
"Object Node LOD Group",
&LOD_readLocalData,
&LOD_writeLocalData
);
bool LOD_readLocalData(Object& obj, Input& fr)
{
bool iteratorAdvanced = false;
LOD& lod = static_cast<LOD&>(obj);
if (fr.matchSequence("Center %f %f %f"))
{
Vec3 center;
fr[1].getFloat(center[0]);
fr[2].getFloat(center[1]);
fr[3].getFloat(center[2]);
lod.setCenter(center);
iteratorAdvanced = true;
fr+=4;
}
// For backwards compatibility with old style LOD's (pre October 2002).
bool matchFirst = false;
if ((matchFirst=fr.matchSequence("Ranges {")) || fr.matchSequence("Ranges %i {"))
{
// set up coordinates.
int entry = fr[0].getNoNestedBrackets();
int capacity;
if (matchFirst)
{
fr += 2;
}
else if (fr[1].getInt(capacity))
{
lod.getRangeList().reserve(capacity);
fr += 3;
}
float minRange=0.0;
float maxRange=0.0;
unsigned int i=0;
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
{
if (fr[0].getFloat(maxRange))
{
if (i>0) lod.setRange(i-1,minRange,maxRange);
++fr;
++i;
minRange = maxRange;
}
else
{
++fr;
}
}
iteratorAdvanced = true;
++fr;
}
if ((matchFirst=fr.matchSequence("RangeList {")) || fr.matchSequence("RangeList %i {"))
{
// set up coordinates.
int entry = fr[0].getNoNestedBrackets();
int capacity;
if (matchFirst)
{
fr += 2;
}
else if (fr[1].getInt(capacity))
{
lod.getRangeList().reserve(capacity);
fr += 3;
}
float minRange=0.0;
float maxRange=0.0;
unsigned int i=0;
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
{
if (fr[0].getFloat(minRange) && fr[1].getFloat(maxRange) )
{
lod.setRange(i,minRange,maxRange);
fr+=2;
++i;
}
else
{
++fr;
}
}
iteratorAdvanced = true;
++fr;
}
return iteratorAdvanced;
}
bool LOD_writeLocalData(const Object& obj, Output& fw)
{
const LOD& lod = static_cast<const LOD&>(obj);
if (lod.getCenterMode()==osg::LOD::USER_DEFINED_CENTER) fw.indent() << "Center "<< lod.getCenter() << std::endl;
fw.indent() << "RangeList "<<lod.getNumRanges()<<" {"<< std::endl;
fw.moveIn();
for(unsigned int i=0; i<lod.getNumRanges();++i)
{
fw.indent() << lod.getMinRange(i) << " "<<lod.getMaxRange(i)<<std::endl;
}
fw.moveOut();
fw.indent() << "}"<< std::endl;
return true;
}