From Mike Weiblen, with mods of using references by Robert Osfield for efficiency. Submission notes from Mike:

"By repurpose, I'm creating a new plugin that uses much of the .osg fileformat,
but with some changes.  Specifically, I'm creating a ".osgfs" plugin, which
represents the scenegraph hierarchy as a filesystem of nested subdirectories and
individual files for each node, rather than nested braces with everything in a
single monolithic file.  I intend to incorporate file alteration monitor events
to watch the filesystem for modifications and automatically reload.

The problem I'm running into is osgDB is too tightly coupled to the .osg format.
osgDB::Output::writeObject() contains literal .osg format-specific strings like
"{" to represent the Object hierarchy at too low a semantic level.  I propose
using virtual methods; my plugin can then derive from osgDB::Output and
represent Object hiearchy differently.
"
This commit is contained in:
Robert Osfield 2007-05-09 10:01:15 +00:00
parent 790a1ea66f
commit 5d23bf7739
3 changed files with 38 additions and 16 deletions

View File

@ -62,7 +62,10 @@ class OSGDB_EXPORT Output : public std::ofstream
void moveOut(); void moveOut();
virtual bool writeObject(const osg::Object& obj); virtual bool writeObject(const osg::Object& obj);
virtual void writeBeginObject(const std::string& name);
virtual void writeEndObject();
virtual void writeUseID(const std::string& id);
virtual void writeUniqueID(const std::string& id);
bool getUniqueIDForObject(const osg::Object* obj,std::string& uniqueID); bool getUniqueIDForObject(const osg::Object* obj,std::string& uniqueID);
bool createUniqueIDForObject(const osg::Object* obj,std::string& uniqueID); bool createUniqueIDForObject(const osg::Object* obj,std::string& uniqueID);

View File

@ -108,6 +108,27 @@ bool Output::writeObject(const osg::Object& obj)
return Registry::instance()->writeObject(obj,*this); return Registry::instance()->writeObject(obj,*this);
} }
void Output::writeBeginObject(const std::string& name)
{
indent() << name << " {" << std::endl;
}
void Output::writeEndObject()
{
indent() << "}" << std::endl;
}
void Output::writeUseID(const std::string& id)
{
indent() << "Use " << id << std::endl;
}
void Output::writeUniqueID(const std::string& id)
{
indent() << "UniqueID " << id << std::endl;
}
bool Output::getUniqueIDForObject(const osg::Object* obj,std::string& uniqueID) bool Output::getUniqueIDForObject(const osg::Object* obj,std::string& uniqueID)
{ {
UniqueIDToLabelMapping::iterator fitr = _objectToUniqueIDMap.find(obj); UniqueIDToLabelMapping::iterator fitr = _objectToUniqueIDMap.find(obj);

View File

@ -1116,14 +1116,14 @@ bool Registry::writeObject(const osg::Object& obj,Output& fw)
std::string uniqueID; std::string uniqueID;
if (fw.getUniqueIDForObject(&obj,uniqueID)) if (fw.getUniqueIDForObject(&obj,uniqueID))
{ {
fw.indent() << "Use " << uniqueID << std::endl; fw.writeUseID( uniqueID );
return true; return true;
} }
} }
std::string classname = obj.className(); const std::string classname( obj.className() );
std::string libraryName = obj.libraryName(); const std::string libraryName( obj.libraryName() );
std::string compositeName = libraryName + "::" + classname; const std::string compositeName( libraryName + "::" + classname );
// try composite name first // try composite name first
DotOsgWrapperMap::iterator itr = _classNameWrapperMap.find(compositeName); DotOsgWrapperMap::iterator itr = _classNameWrapperMap.find(compositeName);
@ -1131,11 +1131,11 @@ bool Registry::writeObject(const osg::Object& obj,Output& fw)
if (itr==_classNameWrapperMap.end()) if (itr==_classNameWrapperMap.end())
{ {
// first try the standard nodekit library. // first try the standard nodekit library.
std::string nodeKitLibraryName = createLibraryNameForNodeKit(obj.libraryName()); std::string nodeKitLibraryName = createLibraryNameForNodeKit(libraryName);
if (loadLibrary(nodeKitLibraryName)) return writeObject(obj,fw); if (loadLibrary(nodeKitLibraryName)) return writeObject(obj,fw);
// otherwise try the osgdb_ plugin library. // otherwise try the osgdb_ plugin library.
std::string pluginLibraryName = createLibraryNameForExtension(obj.libraryName()); std::string pluginLibraryName = createLibraryNameForExtension(libraryName);
if (loadLibrary(pluginLibraryName)) return writeObject(obj,fw); if (loadLibrary(pluginLibraryName)) return writeObject(obj,fw);
// otherwise try simple class name // otherwise try simple class name
@ -1148,11 +1148,10 @@ bool Registry::writeObject(const osg::Object& obj,Output& fw)
DotOsgWrapper* wrapper = itr->second.get(); DotOsgWrapper* wrapper = itr->second.get();
const DotOsgWrapper::Associates& assoc = wrapper->getAssociates(); const DotOsgWrapper::Associates& assoc = wrapper->getAssociates();
if (strcmp(obj.libraryName(),"osg")==0) if (libraryName=="osg")
{ {
// member of the core osg, so no need to have composite library::class name. // member of the core osg, so no need to have composite library::class name.
fw.indent() << wrapper->getName() << " {"<< std::endl; fw.writeBeginObject( wrapper->getName() );
fw.moveIn();
} }
else else
{ {
@ -1160,15 +1159,14 @@ bool Registry::writeObject(const osg::Object& obj,Output& fw)
std::string::size_type posDoubleColon = wrapper->getName().find("::"); std::string::size_type posDoubleColon = wrapper->getName().find("::");
if (posDoubleColon != std::string::npos) if (posDoubleColon != std::string::npos)
{ {
fw.indent() << wrapper->getName() << " {"<< std::endl; fw.writeBeginObject( wrapper->getName() );
} }
else else
{ {
fw.indent() << obj.libraryName()<<"::"<< wrapper->getName() << " {"<< std::endl; fw.writeBeginObject( libraryName + "::" + wrapper->getName() );
} }
fw.moveIn();
} }
fw.moveIn();
// write out the unique ID if required. // write out the unique ID if required.
@ -1177,7 +1175,7 @@ bool Registry::writeObject(const osg::Object& obj,Output& fw)
std::string uniqueID; std::string uniqueID;
fw.createUniqueIDForObject(&obj,uniqueID); fw.createUniqueIDForObject(&obj,uniqueID);
fw.registerUniqueIDForObject(&obj,uniqueID); fw.registerUniqueIDForObject(&obj,uniqueID);
fw.indent() << "UniqueID " << uniqueID << std::endl; fw.writeUniqueID( uniqueID );
} }
// read the local data by iterating through the associate // read the local data by iterating through the associate
@ -1231,7 +1229,7 @@ bool Registry::writeObject(const osg::Object& obj,Output& fw)
} }
fw.moveOut(); fw.moveOut();
fw.indent() << "}"<< std::endl; fw.writeEndObject();
return true; return true;
} }