X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FOctree.cc;h=22b4eb1dd58219b460fa010df0014d9844c808bc;hp=50b38ac08f36ca4bb0af26e38ab3e6ac4e5a717e;hb=fdfba4553433b9b2804c2772c7645211b828c2ea;hpb=5fa5f117f28922a7e539a432367960c1a61f837d diff --git a/src/Moof/Octree.cc b/src/Moof/Octree.cc index 50b38ac..22b4eb1 100644 --- a/src/Moof/Octree.cc +++ b/src/Moof/Octree.cc @@ -27,6 +27,7 @@ *******************************************************************************/ #include "Camera.hh" +#include "Log.hh" #include "Octree.hh" @@ -45,17 +46,14 @@ void Octree::sort() stlplus::ntree::iterator Octree::insert(stlplus::ntree::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::iterator(); - } - Plane xy = node->getAabb().getPlaneXY(); halfspace = xy.intersectsSphere(entity->getSphere()); if (halfspace == Plane::INTERSECT) @@ -169,29 +167,19 @@ stlplus::ntree::iterator Octree::insert(stlplus::ntree:: } stlplus::ntree::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::iterator(); - } + return insert(child, entity); } } -stlplus::ntree::iterator Octree::reinsert(EntityPtr entity, +stlplus::ntree::iterator Octree::reinsert(EntityP entity, stlplus::ntree::iterator node) { - if (!node.valid()) - { - std::cerr << "cannot move entity from invalid node" << std::endl; - return stlplus::ntree::iterator(); - } + ASSERT(entity && "null entity passed"); + ASSERT(node.valid() && "invalid node passed"); - std::list::iterator it; + std::list::iterator it; it = std::find(node->objects.begin(), node->objects.end(), entity); if (it != node->objects.end()) @@ -205,13 +193,9 @@ stlplus::ntree::iterator Octree::reinsert(EntityPtr entity, void Octree::addChild(stlplus::ntree::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) { @@ -223,45 +207,30 @@ void Octree::addChild(stlplus::ntree::iterator node, int index) void Octree::draw(stlplus::ntree::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::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::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; @@ -282,16 +251,9 @@ void Octree::drawIfVisible(stlplus::ntree::iterator node, for (unsigned i = 0; i < tree_.children(node); ++i) { stlplus::ntree::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 @@ -299,15 +261,9 @@ void Octree::drawIfVisible(stlplus::ntree::iterator node, for (unsigned i = 0; i < tree_.children(node); ++i) { stlplus::ntree::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); } } }