// Support function for finding collided nodes using a subset of nodes in the scene // recursive method for going through all scene nodes void getNodeRayBB(ISceneNode* root, const core::line3df& ray, s32 bits, bool recurse, f32& outbestdistance, ISceneNode*& outbestnode) { core::vector3df edges[8]; const core::list<ISceneNode*>& children = root->getChildren(); core::list<ISceneNode*>::ConstIterator it = children.begin(); for (; it != children.end(); ++it) { ISceneNode* current = *it; if (current->isVisible() && // (bNoDebugObjects ? !current->isDebugObject() : true) && (bits==0 || (bits != 0 && (current->getID() & bits)))) { // get world to object space transform core::matrix4 mat; if (!current->getAbsoluteTransformation().getInverse(mat)) continue; // transform vector from world space to object space core::line3df line(ray); mat.transformVect(line.start); mat.transformVect(line.end); const core::aabbox3df& box = current->getBoundingBox(); // do intersection test in object space if (box.intersectsWithLine(line)) { box.getEdges(edges); f32 distance = 0.0f; for (s32 e=0; e<8; ++e) { f32 t = edges[e].getDistanceFromSQ(line.start); if (t > distance) distance = t; } if (distance < outbestdistance) { outbestnode = current; outbestdistance = distance; } } } if ( recurse ) getNodeRayBB(current, ray, bits, recurse, outbestdistance, outbestnode); } }
// Support function for finding collided nodes using a subset of nodes in the scene // recursive method for going through all scene nodes and testing them against a point bool getNodePointBB(ISceneNode* root, vector3df point, s32 bits, bool recurse, ISceneNode*& outbestnode) { core::vector3df edges[8]; const core::list<ISceneNode*>& children = root->getChildren(); core::list<ISceneNode*>::ConstIterator it = children.begin(); for (; it != children.end(); ++it) { ISceneNode* current = *it; if (current->isVisible() && // (bNoDebugObjects ? !current->isDebugObject() : true) && (bits==0 || (bits != 0 && (current->getID() & bits)))) { // get world to object space transform core::matrix4 mat; if (!current->getAbsoluteTransformation().getInverse(mat)) continue; // transform vector from world space to object space vector3df currentPoint( point ); mat.transformVect(currentPoint); const core::aabbox3df& box = current->getBoundingBox(); // do intersection test in object space if (box.isPointInside( currentPoint )) { outbestnode = current; return true; } } if ( recurse ) if ( getNodePointBB(current, point, bits, recurse, outbestnode)) return true; } return false; }