*******************************************************************************/
#include "Camera.hh"
+#include "Log.hh"
#include "Octree.hh"
stlplus::ntree<OctreeNode>::iterator Octree::insert(stlplus::ntree<OctreeNode>::iterator node,
- EntityPtr entity)
+ EntityP entity)
{
+ ASSERT(node.valid() && "invalid node passed");
+ ASSERT(entity && "null entity passed");
+
Plane::Halfspace halfspace;
int octantNum = -1;
- if (!node.valid())
- {
- std::cerr << "cannot insert into invalid node" << std::endl;
- return stlplus::ntree<OctreeNode>::iterator();
- }
-
Plane xy = node->getAabb().getPlaneXY();
halfspace = xy.intersectsSphere(entity->getSphere());
if (halfspace == Plane::INTERSECT)
}
stlplus::ntree<OctreeNode>::iterator child = tree_.child(node, octantNum);
+ ASSERT(child.valid() && "expected valid child node");
- if (child.valid())
- {
- return insert(child, entity);
- }
- else
- {
- std::cerr << "expected but found no child at index " << octantNum << std::endl;
- return stlplus::ntree<OctreeNode>::iterator();
- }
+ return insert(child, entity);
}
}
-stlplus::ntree<OctreeNode>::iterator Octree::reinsert(EntityPtr entity,
+stlplus::ntree<OctreeNode>::iterator Octree::reinsert(EntityP entity,
stlplus::ntree<OctreeNode>::iterator node)
{
- if (!node.valid())
- {
- std::cerr << "cannot move entity from invalid node" << std::endl;
- return stlplus::ntree<OctreeNode>::iterator();
- }
+ ASSERT(entity && "null entity passed");
+ ASSERT(node.valid() && "invalid node passed");
- std::list<EntityPtr>::iterator it;
+ std::list<EntityP>::iterator it;
it = std::find(node->objects.begin(), node->objects.end(), entity);
if (it != node->objects.end())
void Octree::addChild(stlplus::ntree<OctreeNode>::iterator node, int index)
{
- Aabb octant;
+ ASSERT(node.valid() && "invalid node passed");
- if (!node.valid())
- {
- std::cerr << "cannot add children to invalid node" << std::endl;
- return;
- }
+ Aabb octant;
for (int i = tree_.children(node); i <= index; ++i)
{
void Octree::draw(stlplus::ntree<OctreeNode>::iterator node, Scalar alpha)
{
- if (!node.valid())
- {
- std::cerr << "cannot draw null child node :-(" << std::endl;
- return;
- }
+ ASSERT(node.valid() && "invalid node passed");
node->draw(alpha);
for (unsigned i = 0; i < tree_.children(node); ++i)
{
stlplus::ntree<OctreeNode>::iterator child = tree_.child(node, i);
+ ASSERT(child.valid() && "expected valid child node");
- if (child.valid())
- {
- draw(child, alpha);
- }
- else
- {
- std::cerr << "node is not a leaf, but has an invalid child" << std::endl;
- }
-
+ draw(child, alpha);
}
}
void Octree::drawIfVisible(stlplus::ntree<OctreeNode>::iterator node,
Scalar alpha, const Camera& cam)
{
- //node.drawIfVisible(alpha, cam);
-
- if (!node.valid())
- {
- std::cerr << "invalid child while drawing :-(" << std::endl;
- return;
- }
+ ASSERT(node.valid() && "invalid node passed");
+ // try to cull by sphere
Frustum::Collision collision =
cam.getFrustum().containsSphere(node->getSphere());
if (collision == Frustum::OUTSIDE) return;
+ // try to cull by aabb
collision = cam.getFrustum().containsAabb(node->getAabb());
if (collision == Frustum::OUTSIDE) return;
for (unsigned i = 0; i < tree_.children(node); ++i)
{
stlplus::ntree<OctreeNode>::iterator child = tree_.child(node, i);
+ ASSERT(child.valid() && "expected valid child node");
- if (child.valid())
- {
- draw(child, alpha);
- }
- else
- {
- std::cerr << "node is not a leaf, but has an invalid child" << std::endl;
- }
-
+ draw(child, alpha);
}
}
else // collision == Frustum::INTERSECT
for (unsigned i = 0; i < tree_.children(node); ++i)
{
stlplus::ntree<OctreeNode>::iterator child = tree_.child(node, i);
+ ASSERT(child.valid() && "expected valid child node");
- if (child.valid())
- {
- drawIfVisible(child, alpha, cam);
- }
- else
- {
- std::cerr << "node is not a leaf, but has an invalid child" << std::endl;
- }
+ drawIfVisible(child, alpha, cam);
}
}
}