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:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user