OpenSceneGraph/src/osgPlugins/osg/PagedLOD.cpp

157 lines
3.6 KiB
C++

#include "osg/PagedLOD"
#include "osg/Notify"
#include "osgDB/Registry"
#include "osgDB/Input"
#include "osgDB/Output"
using namespace osg;
using namespace osgDB;
// forward declare functions to use later.
bool PagedLOD_readLocalData(Object& obj, Input& fr);
bool PagedLOD_writeLocalData(const Object& obj, Output& fw);
// register the read and write functions with the osgDB::Registry.
REGISTER_DOTOSGWRAPPER(PagedLOD)
(
new osg::PagedLOD,
"PagedLOD",
"Object Node LOD PagedLOD",
&PagedLOD_readLocalData,
&PagedLOD_writeLocalData
);
bool PagedLOD_readLocalData(Object& obj, Input& fr)
{
bool iteratorAdvanced = false;
PagedLOD& lod = static_cast<PagedLOD&>(obj);
std::string path;
if (fr.read("DatabasePath",path))
{
lod.setDatabasePath(path);
}
else
{
if (lod.getDatabasePath().empty() && fr.getOptions() && !fr.getOptions()->getDatabasePathList().empty())
{
const std::string& path = fr.getOptions()->getDatabasePathList().front();
if (!path.empty())
{
lod.setDatabasePath(path);
}
}
}
unsigned int num;
if (fr[0].matchWord("NumChildrenThatCannotBeExpired") && fr[1].getUInt(num))
{
lod.setNumChildrenThatCannotBeExpired(num);
fr+=2;
iteratorAdvanced = true;
}
bool matchFirst;
if ((matchFirst=fr.matchSequence("FileNameList {")) || fr.matchSequence("FileNameList %i {"))
{
// set up coordinates.
int entry = fr[0].getNoNestedBrackets();
if (matchFirst)
{
fr += 2;
}
else
{
fr += 3;
}
unsigned int i=0;
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
{
if (fr[0].isString() || fr[0].isQuotedString())
{
if (fr[0].getStr()) lod.setFileName(i,fr[0].getStr());
else lod.setFileName(i,"");
++fr;
++i;
}
else
{
++fr;
}
}
iteratorAdvanced = true;
++fr;
}
int num_children;
if (fr[0].matchWord("num_children") &&
fr[1].getInt(num_children))
{
// could allocate space for children here...
fr+=2;
iteratorAdvanced = true;
}
Node* node = NULL;
while((node=fr.readNode())!=NULL)
{
lod.addChild(node);
iteratorAdvanced = true;
}
return iteratorAdvanced;
}
bool PagedLOD_writeLocalData(const Object& obj, Output& fw)
{
const PagedLOD& lod = static_cast<const PagedLOD&>(obj);
if (!lod.getDatabasePath().empty())
{
fw.indent() << "DatabasePath "<<lod.getDatabasePath()<<std::endl;
}
fw.indent() << "NumChildrenThatCannotBeExpired "<<lod.getNumChildrenThatCannotBeExpired()<<std::endl;
fw.indent() << "FileNameList "<<lod.getNumFileNames()<<" {"<< std::endl;
fw.moveIn();
unsigned int numChildrenToWriteOut = 0;
for(unsigned int i=0; i<lod.getNumFileNames();++i)
{
if (lod.getFileName(i).empty())
{
fw.indent() << "\"\"" << std::endl;
++numChildrenToWriteOut;
}
else
{
fw.indent() << lod.getFileName(i) << std::endl;
}
}
fw.moveOut();
fw.indent() << "}"<< std::endl;
fw.indent() << "num_children " << numChildrenToWriteOut << std::endl;
for(unsigned int j=0;j<lod.getNumChildren();++j)
{
if (lod.getFileName(j).empty())
{
fw.writeObject(*lod.getChild(j));
}
}
return true;
}