bool octreeSolid::isColidWithBox(octreeSNode* node, Box &b) { GeometricFunc geoF; if (geoF.collisionBtwBox(b, Box(node->leftDownTight, node->rightUpTight))) { if (node->bEnd) { if (geoF.isPointInBox(b.leftDown, b.rightUp, (node->leftDownTight+node->rightUpTight)/2)) { return true; } return false; } else { for (int i = 0; i < 8; i++) { if (node->children[i]) { if (isColidWithBox(node->children[i], b)) { return true; } } } return false; } } else return false; }
void octreeSolid::intersectWithBox(octreeSNode* node, Vec3f &ldf, Vec3f &ruf, arrayInt &idxs) { if (!node) { return; } GeometricFunc geoFc; Box boxNode(node->leftDownTight, node->rightUpTight); if (geoFc.collisionBtwBox(Box(ldf, ruf), boxNode)) { if (node->bEnd && geoFc.isPointInBox(ldf, ruf, boxNode.center)) { // Sine boxIn may slightly cover the node box, we check the center point idxs.push_back(node->idxInLeaf); } else { for (int i = 0; i < 8; i++) { intersectWithBox(node->children[i], ldf, ruf, idxs); } } } }
void octreeSolid::intersectWithBox(octreeSNode* node, Box boxIn, Box &intersectBox, float &volumeSide) { if (!node) return; GeometricFunc geoFc; BOOL isInside; if (geoFc.isBoxInBox(boxIn.leftDown, boxIn.rightUp, node->leftDownTight, node->rightUpTight)) { // Cover entirely. Fit intersect box volumeSide += node->volumef; geoFc.fitBoxToCoverBox(intersectBox, node->leftDownTight, node->rightUpTight); } else { Box boxNode(node->leftDownTight, node->rightUpTight); if(geoFc.collisionBtwBox(boxIn, boxNode)) { if (node->bEnd && geoFc.isPointInBox(boxIn.leftDown, boxIn.rightUp, boxNode.center)) { // Sine boxIn may slightly cover the node box, we check the center point volumeSide += node->volumef; geoFc.fitBoxToCoverBox(intersectBox, node->leftDownTight, node->rightUpTight); } else { for (int i = 0; i < 8; i++) { intersectWithBox(node->children[i], boxIn, intersectBox, volumeSide); } } } } }
void octreeSolid::intersectWithBox(octreeSNode* node, meshPiece &boxOut, meshPiece &boxIn) { if (!node) return; GeometricFunc geoFc; BOOL isInside; if (geoFc.isBoxInBox(boxIn.leftDown, boxIn.rightUp, node->leftDownTight, node->rightUpTight)) { // Cover entirely. Fit intersect box boxOut.volumef += node->volumef; enlargerToCoverBox(boxOut, node->leftDownTight, node->rightUpTight); } else { Box boxNode(node->leftDownTight, node->rightUpTight); if(geoFc.collisionBtwBox(Box(boxIn.leftDown, boxIn.rightUp), boxNode)) { if (node->bEnd && geoFc.isPointInBox(boxIn.leftDown, boxIn.rightUp, boxNode.center)) { // Sine boxIn may slightly cover the node box, we check the center point boxOut.volumef += node->volumef; enlargerToCoverBox(boxOut, node->leftDownTight, node->rightUpTight); } else { for (int i = 0; i < 8; i++) { intersectWithBox(node->children[i], boxOut, boxIn); } } } } }