mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-26 09:35:28 +00:00
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.
This commit is contained in:
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…
x
Reference in New Issue
Block a user