39 #include <cmdLine/cmdStdOutput.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)->markingText())
129 typedef std::pair<DtOctreeNode<T>*,
typename std::list<DtOctreeMember*>::iterator>
NodeBinding;
233 if ((*iter)->testKey(key))
235 callback((*iter)->myObject);
246 myChildren[i]->visitObjects(key, extent, callback);
278 for (
int childIndex = 0; childIndex <
NUM_BRANCHES; ++childIndex)
280 if (mask & (1 << childIndex))
289 DEBUG(
"add as child member (not enough child members yet)");
320 DEBUG(
"Deleting child %d\n", i);
455 for(
int childIndex = 0; childIndex <
NUM_BRANCHES; ++childIndex)
457 if (mask & (1 << childIndex))
530 delete (*iter).second;
573 DtWarn(
"Member %s (" EXT_FMT ") added outside octree (" EXT_FMT ")\n",
620 T*
object = (*iter).first;
624 if (member->
myExtent != object->roughExtent())
626 member->
myExtent =
object->roughExtent();
632 DtWarn(
"Object %s (" EXT_FMT ") moving outside octree (" EXT_FMT ")\n",
726 mySeenObjects.insert(
object);
727 return myInner(
object);
730 std::set<const DtVrfObject*> mySeenObjects;
734 template<
class T>
class DtOctreeDebugger :
public DtOctree<T>
737 DtOctreeDebugger(
const DtExtent& extent)
743 allObjects[object] = extent;
749 allObjects.erase(
object);
755 std::map<T*, DtExtent>::iterator iter = allObjects.begin();
756 std::map<T*, DtExtent>::iterator end = allObjects.end();
758 for(; iter != end; ++iter)
760 T*
object = (*iter).first;
763 extent =
object->roughExtent();
771 DtDebugOctreeFunctor debugFunctor(callback);
774 std::map<T*, DtExtent>::iterator iter = allObjects.begin();
775 std::map<T*, DtExtent>::iterator end = allObjects.end();
777 for(; iter != end; ++iter)
779 T*
object = (*iter).first;
780 const DtExtent& objectExtent = (*iter).second;
782 if (objectExtent.
intersects(extent) && debugFunctor.mySeenObjects.count(
object) == 0)
793 std::map<T*, DtExtent> allObjects;
800 return new DtOctreeDebugger<DtVrfObject>(extent);
816 for (
typename std::list<NodeBinding>::const_iterator it = myBindings.begin(); it != myBindings.end(); ++it)
818 if (node == (*it).first)
829 for (
typename std::list<NodeBinding>::iterator it = myBindings.begin(); it != myBindings.end(); ++it)
831 if (node == (*it).first)
834 myBindings.erase(it);
842 for (
typename std::list<NodeBinding>::const_iterator it = myBindings.begin(); it != myBindings.end(); ++it)
844 (*it).first->myMembers.erase((*it).second);