Build a kdtree for terrain geometry

Improves intersection testing performance, shaving off ~2ms of frame time in exteriors.

Also increases terrain loading time by ~1ms per cell, so will have to look into background loading soon.
c++11
scrawl 10 years ago
parent 93ee11c5e7
commit 5921e70625

@ -32,6 +32,7 @@
#include <osg/PositionAttitudeTransform> #include <osg/PositionAttitudeTransform>
#include <osg/Geometry> #include <osg/Geometry>
#include <osg/Geode> #include <osg/Geode>
#include <osg/KdTree>
#include <osgFX/Effect> #include <osgFX/Effect>
@ -66,6 +67,7 @@ namespace Terrain
TerrainGrid::TerrainGrid(osg::Group* parent, Resource::ResourceSystem* resourceSystem, osgUtil::IncrementalCompileOperation* ico, TerrainGrid::TerrainGrid(osg::Group* parent, Resource::ResourceSystem* resourceSystem, osgUtil::IncrementalCompileOperation* ico,
Storage* storage, int nodeMask) Storage* storage, int nodeMask)
: Terrain::World(parent, resourceSystem, ico, storage, nodeMask) : Terrain::World(parent, resourceSystem, ico, storage, nodeMask)
, mKdTreeBuilder(new osg::KdTreeBuilder)
{ {
} }
@ -133,6 +135,9 @@ void TerrainGrid::loadCell(int x, int y)
osg::ref_ptr<osg::Geode> geode (new osg::Geode); osg::ref_ptr<osg::Geode> geode (new osg::Geode);
geode->addDrawable(geometry); geode->addDrawable(geometry);
// build a kdtree to speed up intersection tests with the terrain
geode->accept(*mKdTreeBuilder);
std::vector<LayerInfo> layerList; std::vector<LayerInfo> layerList;
std::vector<osg::ref_ptr<osg::Image> > blendmaps; std::vector<osg::ref_ptr<osg::Image> > blendmaps;
mStorage->getBlendmaps(1.f, center, false, blendmaps, layerList); mStorage->getBlendmaps(1.f, center, false, blendmaps, layerList);

@ -25,6 +25,11 @@
#include "world.hpp" #include "world.hpp"
#include "material.hpp" #include "material.hpp"
namespace osg
{
class KdTreeBuilder;
}
namespace Terrain namespace Terrain
{ {
@ -44,6 +49,8 @@ namespace Terrain
private: private:
typedef std::map<std::pair<int, int>, GridElement*> Grid; typedef std::map<std::pair<int, int>, GridElement*> Grid;
Grid mGrid; Grid mGrid;
osg::ref_ptr<osg::KdTreeBuilder> mKdTreeBuilder;
}; };
} }

Loading…
Cancel
Save