UInt32 ParticleBSPTree::doTraverse(const Vec3f &refVec, UInt32 index, UInt32 length, Int32 *order) const { const ParticleBSPNode *n = &_tree[index]; if(n->isLeaf()) { order[length] = n->getValue(); return ++length; } else { if(refVec[n->getAxis()] > 0.f) { length = doTraverse(refVec, index * 2 , length, order); length = doTraverse(refVec, index * 2 + 1, length, order); } else { length = doTraverse(refVec, index * 2 + 1, length, order); length = doTraverse(refVec, index * 2 , length, order); } } return length; }
void graphTraverse(Graph* G) { int v; for (v=0; v<G->n(); v++) G->setMark(v, UNVISITED); // Initialize mark bits for (v=0; v<G->n(); v++) if (G->getMark(v) == UNVISITED) doTraverse(G, v); }
Int32 *ParticleBSPTree::traverse(const Vec3f &refVec, UInt32 &length, Int32 *order) const { if(order == NULL) { order = new Int32 [length]; } length = doTraverse(refVec,1,0,order); return order; }
Int32 *ParticleBSPTree::traverse(const Pnt3f &refPoint, UInt32 &length, Int32 *order) const { if(_tree.empty()) return NULL; if(order == NULL) { order = new Int32 [length]; } length = doTraverse(refPoint,1,0,order); return order; }