void visit(ccKdTree::BaseNode* node) { assert(node); if (node && node->parent) { assert(node->parent->isNode()); //a leaf can't have children! ccKdTree::Node* parent = static_cast<ccKdTree::Node*>(node->parent); //we choose the right 'side' of the box that corresponds to the parent's split plane CCVector3& boxCorner = (parent->leftChild == node ? m_UpdatedBox.maxCorner() : m_UpdatedBox.minCorner()); //if this side has not been setup yet... if (boxCorner.u[parent->splitDim] != boxCorner.u[parent->splitDim]) //NaN boxCorner.u[parent->splitDim] = parent->splitValue; visit(node->parent); } }
//Helper void MakeSquare(ccBBox& box, int pivotType, int defaultDim = -1) { assert(defaultDim<3); assert(pivotType>=0 && pivotType<3); CCVector3 W = box.getDiagVec(); if (W.x != W.y || W.x != W.z) { if (defaultDim < 0) { //we take the largest one! defaultDim = 0; if (W.u[1] > W.u[defaultDim]) defaultDim = 1; if (W.u[2] > W.u[defaultDim]) defaultDim = 2; } CCVector3 newW(W.u[defaultDim], W.u[defaultDim], W.u[defaultDim]); switch(pivotType) { case 0: //min corner { CCVector3 A = box.minCorner(); box = ccBBox(A, A + newW); } break; case 1: //center { CCVector3 C = box.getCenter(); box = ccBBox(C - newW / 2.0, C + newW / 2.0); } break; case 2: //max corner { CCVector3 B = box.maxCorner(); box = ccBBox(B-newW,B); } break; } } }
GetCellBBoxVisitor() { //invalidate the initial bounding box m_UpdatedBox.maxCorner() = CCVector3(PC_NAN,PC_NAN,PC_NAN); m_UpdatedBox.minCorner() = CCVector3(PC_NAN,PC_NAN,PC_NAN); }