Added new mechanism for handling Seams.

This commit is contained in:
Robert Osfield
2004-01-21 17:26:23 +00:00
parent 2f194ad5a0
commit 9d1ace20d9
15 changed files with 855 additions and 676 deletions

View File

@@ -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();
}
}