#include "IntersectionBoundingBoxConverter.h" #include "KdTree.h" #include "IntersectableWrapper.h" namespace GtpVisibilityPreprocessor { void IntersectionBoundingBoxConverter::FindIntersectingObjects(const AxisAlignedBox3 &box, ObjectContainer &objects) const { vector leaves; // find intersecting scene nodes to get candidates for intersection // note: this function has to be provided by scene manager mKdTree->GetBoxIntersections(box, leaves); vector::const_iterator lit, lit_end = leaves.end(); // loop through the intersected scene nodes for (lit = leaves.begin(); lit != lit_end; ++ lit) { KdLeaf *leaf = *lit; ObjectContainer::const_iterator oit, oit_end = leaf->mObjects.end(); // find the objects that intersect the box for (oit = leaf->mObjects.begin(); oit != leaf->mObjects.end(); ++ oit) { Intersectable *obj = *oit; // test for intersection (note: function provided of preprocessor) if (Overlap(box, obj->GetBox())) { objects.push_back(obj); } } } } bool IntersectionBoundingBoxConverter::IdentifyObjects( const IndexedBoundingBoxContainer &iboxes, ObjectContainer &objects) const { GtpVisibilityPreprocessor::IndexedBoundingBoxContainer:: const_iterator iit, iit_end = iboxes.end(); for (iit = iboxes.begin(); iit != iit_end; ++ iit) { const AxisAlignedBox3 box = (*iit).second; ObjectContainer *entryObjects = new ObjectContainer(); // find all objects that intersect the bounding box FindIntersectingObjects(box, *entryObjects); ContainerIntersectable *entry = new ContainerIntersectable(entryObjects); entry->SetId((*iit).first); objects.push_back(entry); } return true; } }