QuadTreeBuilder: create leaves on demand

This avoids lots of empty leaves.
This commit is contained in:
Tim Moore
2009-01-23 14:36:53 +01:00
parent 3c74fea087
commit f7dc7f039e

View File

@@ -42,12 +42,13 @@ public:
const MakeLeaf& makeLeaf = MakeLeaf()) :
_root(new osg::Group), _depth(depth),
_dimension(1 << depth), _leafStorage(_dimension * _dimension),
_leaves(_leafStorage, _dimension), _getLocalCoords(getLocalCoords),
_leaves(_leafStorage, _dimension),
_leafParents(_leafParentStorage, _dimension / 2),
_getLocalCoords(getLocalCoords),
_addLeafObject(addLeafObject), _makeLeaf(makeLeaf)
{
using namespace std;
using namespace osg;
generate(_leafStorage.begin(), _leafStorage.end(), _makeLeaf);
vector<Group*> parentNodes(1);
parentNodes[0] = _root.get();
unsigned leafDim = 2;
@@ -63,11 +64,8 @@ public:
}
parentNodes.swap(interiorNodes);
}
VectorArrayAdapter<vector<Group*> > leafParents(parentNodes,
_dimension / 2);
for (int j = 0; j < _dimension; ++j)
for (int k =0; k < _dimension; ++k)
leafParents(j / 2, k / 2)->addChild(_leaves(j, k));
// Save leaf parents for later when we add leaves
_leafParentStorage = parentNodes;
}
osg::Vec2 getMin() { return _min; }
void setMin(const osg::Vec2& min) { _min = min; }
@@ -90,6 +88,10 @@ public:
y = (int)(_dimension * (center.y() - _min.y())
/ (_max.y() - _min.y()));
y = clampTo(y, 0, (_dimension -1));
if (!_leaves(y, x)) {
_leaves(y, x) = _makeLeaf();
_leafParents(y / 2, x / 2)->addChild(_leaves(y, x));
}
_addLeafObject(_leaves(y, x), obj);
}
// STL craziness
@@ -125,6 +127,8 @@ protected:
int _dimension;
LeafVector _leafStorage;
VectorArrayAdapter<LeafVector> _leaves;
std::vector<osg::Group*> _leafParentStorage;
VectorArrayAdapter<std::vector<osg::Group*> > _leafParents;
const GetObjectLocalCoords _getLocalCoords;
const AddLeafObject _addLeafObject;
const MakeLeaf _makeLeaf;