void CalBone::calculateBoundingBox() { if(!getCoreBone()->isBoundingBoxPrecomputed()) return; CalVector dir = CalVector(1.0f,0.0f,0.0f); dir*=getTransformMatrix(); m_boundingBox.plane[0].setNormal(dir); dir = CalVector(-1.0f,0.0f,0.0f); dir*=getTransformMatrix(); m_boundingBox.plane[1].setNormal(dir); dir = CalVector(0.0f,1.0f,0.0f); dir*=getTransformMatrix(); m_boundingBox.plane[2].setNormal(dir); dir = CalVector(0.0f,-1.0f,0.0f); dir*=getTransformMatrix(); m_boundingBox.plane[3].setNormal(dir); dir = CalVector(0.0f,0.0f,1.0f); dir*=getTransformMatrix(); m_boundingBox.plane[4].setNormal(dir); dir = CalVector(0.0f,0.0f,-1.0f); dir*=getTransformMatrix(); m_boundingBox.plane[5].setNormal(dir); int i; for(i=0;i< 6; i++) { CalVector position; getCoreBone()->getBoundingData(i,position); position*=getTransformMatrix(); position+=getTranslationBoneSpace(); int planeId; for(planeId = 0; planeId < 6; ++planeId) { if(m_boundingBox.plane[planeId].eval(position) < 0.0f) { m_boundingBox.plane[planeId].setPosition(position); } } } }
CalCoreBone* CalCoreSkeleton::getCoreBone(const std::string& strName) { return getCoreBone( getCoreBoneId( strName )); }