本文整理汇总了C++中osg::NodeVisitor::getDatabaseRequestHandler方法的典型用法代码示例。如果您正苦于以下问题:C++ NodeVisitor::getDatabaseRequestHandler方法的具体用法?C++ NodeVisitor::getDatabaseRequestHandler怎么用?C++ NodeVisitor::getDatabaseRequestHandler使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类osg::NodeVisitor
的用法示例。
在下文中一共展示了NodeVisitor::getDatabaseRequestHandler方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: lock
void
MPTerrainEngineNode::traverse(osg::NodeVisitor& nv)
{
if ( nv.getVisitorType() == nv.CULL_VISITOR )
{
#if 0 // believe this is now unnecessary
// since the root tiles are manually added, the pager never has a chance to
// register the PagedLODs in their children. So we have to do it manually here.
if ( !_rootTilesRegistered )
{
Threading::ScopedMutexLock lock(_rootTilesRegisteredMutex);
if ( !_rootTilesRegistered )
{
osgDB::DatabasePager* pager = dynamic_cast<osgDB::DatabasePager*>(nv.getDatabaseRequestHandler());
if ( pager )
{
//OE_WARN << "Registering plods." << std::endl;
pager->registerPagedLODs( _terrain );
_rootTilesRegistered = true;
}
}
}
#endif
// Inform the registry of the current frame so that Tiles have access
// to the information.
if ( _liveTiles.valid() && nv.getFrameStamp() )
{
_liveTiles->setTraversalFrame( nv.getFrameStamp()->getFrameNumber() );
}
}
#if 0
static int c = 0;
if ( ++c % 60 == 0 )
{
OE_NOTICE << LC << "Live = " << _liveTiles->size() << ", Dead = " << _deadTiles->size() << std::endl;
_liveTiles->run( CheckForOrphans() );
}
#endif
TerrainEngineNode::traverse( nv );
}
示例2: lock
bool
PagerLoader::load(Loader::Request* request, float priority, osg::NodeVisitor& nv)
{
// check that the request is not already completed but unmerged:
//if ( request && !request->isMerging() && nv.getDatabaseRequestHandler() )
if ( request && !request->isMerging() && !request->isFinished() && nv.getDatabaseRequestHandler() )
{
//OE_INFO << LC << "load (" << request->getTileKey().str() << ")" << std::endl;
unsigned fn = 0;
if ( nv.getFrameStamp() )
{
fn = nv.getFrameStamp()->getFrameNumber();
request->setFrameNumber( fn );
}
bool addToRequestSet = false;
// lock the request since multiple cull traversals might hit this function.
request->lock();
{
request->setState(Request::RUNNING);
// remember the last tick at which this request was submitted
request->_lastTick = osg::Timer::instance()->tick();
// update the priority
request->_priority = priority;
// timestamp it
request->setFrameNumber( fn );
// incremenet the load count.
request->_loadCount++;
// if this is the first load request since idle, we need to remember this request.
addToRequestSet = (request->_loadCount == 1);
}
request->unlock();
char filename[64];
sprintf(filename, "%u.%u.osgearth_rex_loader", request->_uid, _engineUID);
//std::string filename = Stringify() << request->_uid << "." << _engineUID << ".osgearth_rex_loader";
// scale from LOD to 0..1 range, more or less
// TODO: need to balance this with normal PagedLOD priority setup
float scaledPriority = priority / 20.0f;
nv.getDatabaseRequestHandler()->requestNodeFile(
filename,
_myNodePath,
priority,
nv.getFrameStamp(),
request->_internalHandle,
_dboptions.get() );
// remember the request:
if ( true ) // addToRequestSet // Not sure whether we need to keep doing this in order keep it sorted -- check it out.
{
Threading::ScopedMutexLock lock( _requestsMutex );
_requests[request->getUID()] = request;
}
return true;
}
return false;
}
示例3: setFrameNumberOfLastTraversal
//.........这里部分代码省略.........
if (i<_children.size())
{
if (updateTimeStamp)
{
_perRangeDataList[i]._timeStamp=timeStamp;
_perRangeDataList[i]._frameNumber=frameNumber;
}
_children[i]->accept(nv);
lastChildTraversed = (int)i;
}
else
{
needToLoadChild = true;
}
}
}
#ifdef INHERIT_VIEWPOINT_CAMERAS_CANNOT_SUBDIVIDE
// Prevents an INHERIT_VIEWPOINT camera from invoking tile subdivision
if (needToLoadChild)
{
osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(&nv);
if ( cv && cv->getCurrentCamera() && cv->getCurrentCamera()->getReferenceFrame() == osg::Camera::ABSOLUTE_RF_INHERIT_VIEWPOINT )
needToLoadChild = false;
}
#endif
if (needToLoadChild)
{
unsigned int numChildren = _children.size();
// select the last valid child.
if (numChildren>0 && ((int)numChildren-1)!=lastChildTraversed)
{
if (updateTimeStamp)
{
_perRangeDataList[numChildren-1]._timeStamp=timeStamp;
_perRangeDataList[numChildren-1]._frameNumber=frameNumber;
}
_children[numChildren-1]->accept(nv);
}
// now request the loading of the next unloaded child.
if (!_disableExternalChildrenPaging &&
nv.getDatabaseRequestHandler() &&
numChildren<_perRangeDataList.size())
{
// osgEarth: Perform a tile visibility check before requesting the new tile.
// Intersect the tile's earth-aligned bounding box with the current culling frustum.
bool tileIsVisible = true;
if (nv.getVisitorType() == nv.CULL_VISITOR &&
numChildren < _childBBoxes.size() &&
_childBBoxes[numChildren].valid())
{
osgUtil::CullVisitor* cv = Culling::asCullVisitor( nv );
// wish that CullStack::createOrReuseRefMatrix() was public
osg::ref_ptr<osg::RefMatrix> mvm = new osg::RefMatrix(*cv->getModelViewMatrix());
mvm->preMult( _childBBoxMatrices[numChildren] );
cv->pushModelViewMatrix( mvm.get(), osg::Transform::RELATIVE_RF );
tileIsVisible = !cv->isCulled( _childBBoxes[numChildren] );
cv->popModelViewMatrix();
}
if ( tileIsVisible )
{
// [end:osgEarth]
// compute priority from where abouts in the required range the distance falls.
float priority = (_rangeList[numChildren].second-required_range)/(_rangeList[numChildren].second-_rangeList[numChildren].first);
// invert priority for PIXEL_SIZE_ON_SCREEN mode
if(_rangeMode==PIXEL_SIZE_ON_SCREEN)
{
priority = -priority;
}
// modify the priority according to the child's priority offset and scale.
priority = _perRangeDataList[numChildren]._priorityOffset + priority * _perRangeDataList[numChildren]._priorityScale;
if (_databasePath.empty())
{
nv.getDatabaseRequestHandler()->requestNodeFile(_perRangeDataList[numChildren]._filename,nv.getNodePath(),priority,nv.getFrameStamp(), _perRangeDataList[numChildren]._databaseRequest, _databaseOptions.get());
}
else
{
// prepend the databasePath to the child's filename.
nv.getDatabaseRequestHandler()->requestNodeFile(_databasePath+_perRangeDataList[numChildren]._filename,nv.getNodePath(),priority,nv.getFrameStamp(), _perRangeDataList[numChildren]._databaseRequest, _databaseOptions.get());
}
}
}
}
break;
}
default:
break;
}
}
示例4: traverse
void TXPPagedLOD::traverse(osg::NodeVisitor& nv)
{
//TileMapper* tileMapper = dynamic_cast<TileMapper*>(nv.getUserData());
//Modified by Brad Anderegg (May-27-08) because the black listing process appears to make tiles switch lods
//when they clearly shouldnt, in the worst cases a tile will page out that is right in front of you.
bool forceUseOfFirstChild = /*tileMapper ? (tileMapper->isNodeBlackListed(this)) :*/ false;
double timeStamp = nv.getFrameStamp()?nv.getFrameStamp()->getReferenceTime():0.0;
bool updateTimeStamp = nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR;
unsigned int frameNumber = nv.getFrameStamp()?nv.getFrameStamp()->getFrameNumber():0;
// set the frame number of the traversal so that external nodes can find out how active this
// node is.
if (nv.getFrameStamp() &&
nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR)
{
setFrameNumberOfLastTraversal(nv.getFrameStamp()->getFrameNumber());
}
switch(nv.getTraversalMode())
{
case(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN):
std::for_each(_children.begin(),_children.end(),osg::NodeAcceptOp(nv));
break;
case(osg::NodeVisitor::TRAVERSE_ACTIVE_CHILDREN):
{
float distance = nv.getDistanceToEyePoint(getCenter(),true);
int lastChildTraversed = -1;
bool needToLoadChild = false;
unsigned maxRangeSize = _rangeList.size();
if (maxRangeSize!=0 && forceUseOfFirstChild)
maxRangeSize=1;
for(unsigned int i=0;i<maxRangeSize;++i)
{
if (forceUseOfFirstChild ||
(_rangeList[i].first<=distance && distance<_rangeList[i].second))
{
if (i<_children.size())
{
if (updateTimeStamp)
{
_perRangeDataList[i]._timeStamp=timeStamp;
_perRangeDataList[i]._frameNumber=frameNumber;
}
_children[i]->accept(nv);
lastChildTraversed = (int)i;
}
else
{
needToLoadChild = true;
}
}
}
if (needToLoadChild)
{
unsigned int numChildren = _children.size();
//std::cout<<"PagedLOD::traverse() - falling back "<<std::endl;
// select the last valid child.
if (numChildren>0 && ((int)numChildren-1)!=lastChildTraversed)
{
//std::cout<<" to child "<<numChildren-1<<std::endl;
if (updateTimeStamp)
_perRangeDataList[numChildren-1]._timeStamp=timeStamp;
_children[numChildren-1]->accept(nv);
}
// now request the loading of the next unload child.
if (nv.getDatabaseRequestHandler() && numChildren<_perRangeDataList.size())
{
// compute priority from where abouts in the required range the distance falls.
float priority = (_rangeList[numChildren].second-distance)/(_rangeList[numChildren].second-_rangeList[numChildren].first);
// modify the priority according to the child's priority offset and scale.
priority = _perRangeDataList[numChildren]._priorityOffset + priority * _perRangeDataList[numChildren]._priorityScale;
//std::cout<<" requesting child "<<_fileNameList[numChildren]<<" priotity = "<<priority<<std::endl;
nv.getDatabaseRequestHandler()->requestNodeFile(_perRangeDataList[numChildren]._filename,
nv.getNodePath(),
priority,
nv.getFrameStamp(),
_perRangeDataList[numChildren]._databaseRequest);
}
}
break;
}
default:
break;
}
//.........这里部分代码省略.........