39 #include <cmdLine/cmdStdOutput.h>
42 #include "geometry/tdbextent.h"
49 #define OCTREE_DEBUG 0
53 static int octree_debug_level = 0;
57 static void DEBUG(
const char* fmt, ...)
62 vsprintf(buffer, fmt, ap);
65 DtInfo(
"OCT %*s%s\n", octree_debug_level*2,
"", buffer);
68 # define DEBUG_PUSH do { octree_debug_level++; } while(0)
69 # define DEBUG_POP do { octree_debug_level--; } while(0)
72 static inline void DEBUG(
const char* fmt, ...)
75 # define DEBUG_PUSH do { } while(0)
76 # define DEBUG_POP do { } while(0)
79 #define EXT_FMT "[%lf, %lf, %lf] - [%lf, %lf, %lf]"
80 #define EXT_ARGS(x) (x).minX(), (x).minY(), (x).minZ(), (x).maxX(), (x).maxY(), (x).maxZ()
81 #define OBJ_ARGS(x) ((const char*) (x)->objectName())
204 callback((*iter)->myObject);
213 myChildren[i]->visitObjects(extent, callback);
238 if (childIndex == -1) {
239 DEBUG(
"add as member (children, but won't fit)");
245 DEBUG(
"add as child member (not enough child members yet)");
275 DEBUG(
"Deleting child %d\n", i);
333 DtWarn(
"Can't happen! Octree intersection mask is 0!");
344 if (!mask || (mask & (mask-1)))
350 for(childIndex=0; childIndex<
NUM_BRANCHES; childIndex++)
352 if (mask & (1<<childIndex))
356 DtWarn(
"Can't happen: no valid child index in octree code.");
420 if (childIndex != -1)
487 delete (*iter).second;
509 virtual void addObject(T*
object,
const DtExtent& extent)
520 DtWarn(
"Member %s (" EXT_FMT ") added outside octree (" EXT_FMT ")",
564 T*
object = (*iter).first;
567 member->
myExtent =
object->extent();
573 DtWarn(
"Object %s (" EXT_FMT ") moving outside octree (" EXT_FMT ")",
643 mySeenObjects.insert(
object);
644 return myInner(
object);
647 std::set<const DtVrfObject*> mySeenObjects;
651 template<
class T>
class DtOctreeDebugger :
public DtOctree<T>
654 DtOctreeDebugger(
const DtExtent& extent)
658 void addObject(T*
object,
const DtExtent& extent)
660 allObjects[object] = extent;
666 allObjects.erase(
object);
672 std::map<T*, DtExtent>::iterator iter = allObjects.begin();
673 std::map<T*, DtExtent>::iterator end = allObjects.end();
675 for(; iter != end; ++iter)
677 T*
object = (*iter).first;
678 DtExtent& extent = (*iter).second;
680 extent =
object->extent();
688 DtDebugOctreeFunctor debugFunctor(callback);
691 std::map<T*, DtExtent>::iterator iter = allObjects.begin();
692 std::map<T*, DtExtent>::iterator end = allObjects.end();
694 for(; iter != end; ++iter)
696 T*
object = (*iter).first;
697 const DtExtent& objectExtent = (*iter).second;
699 if (objectExtent.intersects(extent) && debugFunctor.mySeenObjects.count(
object) == 0)
710 std::map<T*, DtExtent> allObjects;
717 return new DtOctreeDebugger<DtVrfObject>(extent);
735 DtWarn(
"Octree binding node for %s when already bound!",
OBJ_ARGS(myObject));
747 boundNode->myMembers.erase(boundIterator);