Added new mechanism for handling Seams.
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
#include <osg/Notify>
|
||||
#include <osg/BoundingBox>
|
||||
#include <osg/PagedLOD>
|
||||
#include <osg/Timer>
|
||||
#include <osgUtil/CullVisitor>
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
@@ -9,6 +11,9 @@
|
||||
#include "TileMapper.h"
|
||||
#include "TXPNode.h"
|
||||
#include "TXPPagedLOD.h"
|
||||
|
||||
|
||||
|
||||
using namespace txp;
|
||||
|
||||
|
||||
@@ -46,8 +51,40 @@ void TXPNode::traverse(osg::NodeVisitor& nv)
|
||||
switch(nv.getVisitorType())
|
||||
{
|
||||
case osg::NodeVisitor::CULL_VISITOR:
|
||||
{
|
||||
|
||||
osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(&nv);
|
||||
if (cv)
|
||||
{
|
||||
//const osg::Timer& timer = *osg::Timer::instance();
|
||||
//osg::Timer_t start = timer.tick();
|
||||
//std::cout<<"Doing visible tile search"<<std::endl;
|
||||
|
||||
osg::ref_ptr<TileMapper> tileMapper = new TileMapper;
|
||||
tileMapper->pushViewport(cv->getViewport());
|
||||
tileMapper->pushProjectionMatrix(&(cv->getProjectionMatrix()));
|
||||
tileMapper->pushModelViewMatrix(&(cv->getModelViewMatrix()));
|
||||
|
||||
// traverse the scene graph to search for valid tiles
|
||||
accept(*tileMapper);
|
||||
|
||||
tileMapper->popModelViewMatrix();
|
||||
tileMapper->popProjectionMatrix();
|
||||
tileMapper->popViewport();
|
||||
|
||||
//std::cout<<" found " << tileMapper._tileMap.size() << std::endl;
|
||||
|
||||
tileMapper->checkValidityOfAllVisibleTiles();
|
||||
|
||||
cv->setUserData(tileMapper.get());
|
||||
|
||||
//std::cout<<"Completed visible tile search in "<<timer.delta_m(start,timer.tick())<<std::endl;
|
||||
|
||||
}
|
||||
|
||||
updateEye(nv);
|
||||
break;
|
||||
}
|
||||
case osg::NodeVisitor::UPDATE_VISITOR:
|
||||
updateSceneGraph();
|
||||
break;
|
||||
@@ -188,30 +225,17 @@ osg::Node* TXPNode::addPagedLODTile(int x, int y, int lod)
|
||||
TXPArchive::TileInfo info;
|
||||
_archive->getTileInfo(x,y,lod,info);
|
||||
|
||||
TXPPagedLOD* pagedLOD = new TXPPagedLOD;
|
||||
osg::PagedLOD* pagedLOD = new osg::PagedLOD;
|
||||
pagedLOD->setFileName(0,pagedLODfile);
|
||||
//pagedLOD->setPriorityOffset(0,1.0f);
|
||||
pagedLOD->setPriorityOffset(0,_archive->getNumLODs());
|
||||
pagedLOD->setPriorityScale(0,1.0f);
|
||||
pagedLOD->setRange(0,0.0,info.maxRange);
|
||||
pagedLOD->setCenter(info.center);
|
||||
pagedLOD->setRadius(info.radius);
|
||||
pagedLOD->setNumChildrenThatCannotBeExpired(1);
|
||||
pagedLOD->setTileId(x,y,lod);
|
||||
|
||||
int sizeX, sizeY;
|
||||
if (_archive->getLODSize(lod,sizeX,sizeY))
|
||||
{
|
||||
if ((x-1) > -1) pagedLOD->addNeighbour(x-1,y);
|
||||
if ((x+1) < sizeX) pagedLOD->addNeighbour(x+1,y);
|
||||
if ((y-1) > -1) pagedLOD->addNeighbour(x,y-1);
|
||||
if ((y+1) < sizeY) pagedLOD->addNeighbour(x,y+1);
|
||||
}
|
||||
|
||||
_nodesToAdd.push_back(pagedLOD);
|
||||
|
||||
TileMapper::instance()->insertPagedLOD(x,y,lod,pagedLOD);
|
||||
|
||||
return pagedLOD;
|
||||
}
|
||||
|
||||
@@ -234,10 +258,7 @@ void TXPNode::updateSceneGraph()
|
||||
}
|
||||
_nodesToAdd.clear();
|
||||
|
||||
}
|
||||
|
||||
TileMapper::instance()->prunePagedLOD();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user