From Robert Osfield and Carlo Camporesi, took submission from Carlo for adding LoadingExternalReferenceMode to ProxyNode and extended it

to include a wider range of options, also completed implementation
This commit is contained in:
Robert Osfield
2008-02-25 15:07:35 +00:00
parent 49641debcb
commit 75b9a9c809
3 changed files with 62 additions and 11 deletions

View File

@@ -61,6 +61,20 @@ class OSG_EXPORT ProxyNode : public Group
/** Get how the center of object should be determined when computed which child is active.*/
CenterMode getCenterMode() const { return _centerMode; }
/** Modes which control how the proxynode external reference are loaded.*/
enum LoadingExternalReferenceMode
{
LOAD_IMMEDIATELY,
DEFER_LOADING_TO_DATABASE_PAGER,
NO_AUTOMATIC_LOADING
};
/** Set how the child loading is done.*/
void setLoadingExternalReferenceMode(LoadingExternalReferenceMode mode) { _loadingExtReference=mode; }
/** Get the setted mode of loading.*/
LoadingExternalReferenceMode getLoadingExternalReferenceMode() const { return _loadingExtReference; }
/** Sets the object-space point which defines the center of the osg::ProxyNode.
center is affected by any transforms in the hierarchy above the osg::ProxyNode.*/
@@ -88,6 +102,8 @@ class OSG_EXPORT ProxyNode : public Group
FileNameList _filenameList;
std::string _databasePath;
LoadingExternalReferenceMode _loadingExtReference;
CenterMode _centerMode;
Vec3 _userDefinedCenter;
float _radius;

View File

@@ -18,6 +18,7 @@
using namespace osg;
ProxyNode::ProxyNode() :
_loadingExtReference(LOAD_IMMEDIATELY),
_centerMode(USER_DEFINED_CENTER),
_radius(-1)
{
@@ -26,6 +27,7 @@ ProxyNode::ProxyNode() :
ProxyNode::ProxyNode(const ProxyNode& proxynode,const CopyOp& copyop):
Group(proxynode,copyop),
_filenameList(proxynode._filenameList),
_loadingExtReference(proxynode._loadingExtReference),
_centerMode(proxynode._centerMode),
_userDefinedCenter(proxynode._userDefinedCenter),
_radius(proxynode._radius)
@@ -54,7 +56,9 @@ void ProxyNode::setDatabasePath(const std::string& path)
void ProxyNode::traverse(NodeVisitor& nv)
{
if (nv.getDatabaseRequestHandler() && _filenameList.size()>_children.size() && nv.getVisitorType()==NodeVisitor::CULL_VISITOR)
if (nv.getDatabaseRequestHandler() && _filenameList.size()>_children.size() &&
nv.getVisitorType()==NodeVisitor::CULL_VISITOR &&
_loadingExtReference!=NO_AUTOMATIC_LOADING)
{
for(unsigned int i=_children.size(); i<_filenameList.size(); ++i)
{

View File

@@ -32,7 +32,7 @@ bool ProxyNode_readLocalData(Object& obj, Input& fr)
bool iteratorAdvanced = false;
ProxyNode& proxyNode = static_cast<ProxyNode&>(obj);
if (fr.matchSequence("Center %f %f %f"))
{
Vec3 center;
@@ -47,6 +47,19 @@ bool ProxyNode_readLocalData(Object& obj, Input& fr)
else
proxyNode.setCenterMode(osg::ProxyNode::USE_BOUNDING_SPHERE_CENTER);
if (fr.matchSequence("ExtRefMode %s") || fr.matchSequence("ExtRefMode %w"))
{
if (fr[1].matchWord("LOAD_IMMEDIATELY"))
proxyNode.setLoadingExternalReferenceMode(ProxyNode::LOAD_IMMEDIATELY);
else if (fr[1].matchWord("DEFER_LOADING_TO_DATABASE_PAGER"))
proxyNode.setLoadingExternalReferenceMode(ProxyNode::DEFER_LOADING_TO_DATABASE_PAGER);
else if (fr[1].matchWord("NO_AUTOMATIC_LOADING"))
proxyNode.setLoadingExternalReferenceMode(ProxyNode::NO_AUTOMATIC_LOADING);
fr+=2;
iteratorAdvanced = true;
}
float radius;
if (fr[0].matchWord("Radius") && fr[1].getFloat(radius))
{
@@ -101,7 +114,7 @@ bool ProxyNode_readLocalData(Object& obj, Input& fr)
}
unsigned int num_children;
unsigned int num_children = 0;
if (fr[0].matchWord("num_children") &&
fr[1].getUInt(num_children))
{
@@ -124,17 +137,20 @@ bool ProxyNode_readLocalData(Object& obj, Input& fr)
fpl.pop_front();
}
for(i=0; i<proxyNode.getNumFileNames(); i++)
if(proxyNode.getLoadingExternalReferenceMode() == ProxyNode::LOAD_IMMEDIATELY)
{
if(i>=proxyNode.getNumChildren() && !proxyNode.getFileName(i).empty())
for(i=0; i<proxyNode.getNumFileNames(); i++)
{
osgDB::FilePathList& fpl = ((osgDB::ReaderWriter::Options*)fr.getOptions())->getDatabasePathList();
fpl.push_front( fpl.empty() ? osgDB::getFilePath(proxyNode.getFileName(i)) : fpl.front()+'/'+ osgDB::getFilePath(proxyNode.getFileName(i)));
osg::Node *node = osgDB::readNodeFile(proxyNode.getFileName(i), fr.getOptions());
fpl.pop_front();
if(node)
if(i>=proxyNode.getNumChildren() && !proxyNode.getFileName(i).empty())
{
proxyNode.insertChild(i, node);
osgDB::FilePathList& fpl = ((osgDB::ReaderWriter::Options*)fr.getOptions())->getDatabasePathList();
fpl.push_front( fpl.empty() ? osgDB::getFilePath(proxyNode.getFileName(i)) : fpl.front()+'/'+ osgDB::getFilePath(proxyNode.getFileName(i)));
osg::Node *node = osgDB::readNodeFile(proxyNode.getFileName(i), fr.getOptions());
fpl.pop_front();
if(node)
{
proxyNode.insertChild(i, node);
}
}
}
}
@@ -153,6 +169,21 @@ bool ProxyNode_writeLocalData(const Object& obj, Output& fw)
if (proxyNode.getCenterMode()==osg::ProxyNode::USER_DEFINED_CENTER) fw.indent() << "Center "<< proxyNode.getCenter() << std::endl;
fw.indent() << "ExtRefMode ";
switch(proxyNode.getLoadingExternalReferenceMode())
{
case ProxyNode::LOAD_IMMEDIATELY:
fw.indent() << "LOAD_IMMEDIATELY" <<std::endl;
break;
case ProxyNode::DEFER_LOADING_TO_DATABASE_PAGER:
fw.indent() << "DEFER_LOADING_TO_DATABASE_PAGER" <<std::endl;
break;
case ProxyNode::NO_AUTOMATIC_LOADING:
fw.indent() << "NO_AUTOMATIC_LOADING" <<std::endl;
break;
}
fw.indent() << "Radius "<<proxyNode.getRadius()<<std::endl;
fw.indent() << "FileNameList "<<proxyNode.getNumFileNames()<<" {"<< std::endl;