void btGImpactMeshShapePart::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const { lockChildShapes(); btAABB box; box.m_min = aabbMin; box.m_max = aabbMax; btAlignedObjectArray<int> collided; m_box_set.boxQuery(box,collided); if(collided.size()==0) { unlockChildShapes(); return; } int part = (int)getPart(); btPrimitiveTriangle triangle; int i = collided.size(); while(i--) { this->getPrimitiveTriangle(collided[i],triangle); callback->processTriangle(triangle.m_vertices,part,collided[i]); } unlockChildShapes(); }
void btGImpactMeshShapePart::processAllTrianglesRay(btTriangleCallback* callback,const btVector3& rayFrom, const btVector3& rayTo) const { lockChildShapes(); btAlignedObjectArray<int> collided; btVector3 rayDir(rayTo - rayFrom); rayDir.normalize(); m_box_set.rayQuery(rayDir, rayFrom, collided); if(collided.size()==0) { unlockChildShapes(); return; } int part = (int)getPart(); btPrimitiveTriangle triangle; int i = collided.size(); while(i--) { getPrimitiveTriangle(collided[i],triangle); callback->processTriangle(triangle.m_vertices,part,collided[i]); } unlockChildShapes(); }
void btGImpactCompoundShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const { lockChildShapes(); #ifdef CALC_EXACT_INERTIA inertia.setValue(0.f,0.f,0.f); int i = this->getNumChildShapes(); btScalar shapemass = mass/btScalar(i); while(i--) { btVector3 temp_inertia; m_childShapes[i]->calculateLocalInertia(shapemass,temp_inertia); if(childrenHasTransform()) { inertia = gim_inertia_add_transformed( inertia,temp_inertia,m_childTransforms[i]); } else { inertia = gim_inertia_add_transformed( inertia,temp_inertia,btTransform::getIdentity()); } } #else // Calc box inertia btScalar lx= m_localAABB.m_max[0] - m_localAABB.m_min[0]; btScalar ly= m_localAABB.m_max[1] - m_localAABB.m_min[1]; btScalar lz= m_localAABB.m_max[2] - m_localAABB.m_min[2]; const btScalar x2 = lx*lx; const btScalar y2 = ly*ly; const btScalar z2 = lz*lz; const btScalar scaledmass = mass * btScalar(0.08333333); inertia = scaledmass * (btVector3(y2+z2,x2+z2,x2+y2)); #endif unlockChildShapes(); }
void btGImpactMeshShapePart::calculateLocalInertia(btScalar mass,btVector3& inertia) const { lockChildShapes(); #ifdef CALC_EXACT_INERTIA inertia.setValue(0.f,0.f,0.f); int i = this->getVertexCount(); btScalar pointmass = mass/btScalar(i); while(i--) { btVector3 pointintertia; this->getVertex(i,pointintertia); pointintertia = gim_get_point_inertia(pointintertia,pointmass); inertia+=pointintertia; } #else // Calc box inertia btScalar lx= m_localAABB.m_max[0] - m_localAABB.m_min[0]; btScalar ly= m_localAABB.m_max[1] - m_localAABB.m_min[1]; btScalar lz= m_localAABB.m_max[2] - m_localAABB.m_min[2]; const btScalar x2 = lx*lx; const btScalar y2 = ly*ly; const btScalar z2 = lz*lz; const btScalar scaledmass = mass * btScalar(0.08333333); inertia = scaledmass * (btVector3(y2+z2,x2+z2,x2+y2)); #endif unlockChildShapes(); }