Blender V2.61 - r43446

btGImpactShape.cpp

Go to the documentation of this file.
00001 /*
00002 This source file is part of GIMPACT Library.
00003 
00004 For the latest info, see http://gimpact.sourceforge.net/
00005 
00006 Copyright (c) 2007 Francisco Leon Najera. C.C. 80087371.
00007 email: projectileman@yahoo.com
00008 
00009 
00010 This software is provided 'as-is', without any express or implied warranty.
00011 In no event will the authors be held liable for any damages arising from the use of this software.
00012 Permission is granted to anyone to use this software for any purpose,
00013 including commercial applications, and to alter it and redistribute it freely,
00014 subject to the following restrictions:
00015 
00016 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
00017 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
00018 3. This notice may not be removed or altered from any source distribution.
00019 */
00020 
00021 
00022 #include "btGImpactShape.h"
00023 #include "btGImpactMassUtil.h"
00024 
00025 
00026 #define CALC_EXACT_INERTIA 1
00027 
00028 void btGImpactCompoundShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
00029 {
00030     lockChildShapes();
00031 #ifdef CALC_EXACT_INERTIA
00032     inertia.setValue(0.f,0.f,0.f);
00033 
00034     int i = this->getNumChildShapes();
00035     btScalar shapemass = mass/btScalar(i);
00036 
00037     while(i--)
00038     {
00039         btVector3 temp_inertia;
00040         m_childShapes[i]->calculateLocalInertia(shapemass,temp_inertia);
00041         if(childrenHasTransform())
00042         {
00043             inertia = gim_inertia_add_transformed( inertia,temp_inertia,m_childTransforms[i]);
00044         }
00045         else
00046         {
00047             inertia = gim_inertia_add_transformed( inertia,temp_inertia,btTransform::getIdentity());
00048         }
00049 
00050     }
00051 
00052 #else
00053 
00054     // Calc box inertia
00055 
00056     btScalar lx= m_localAABB.m_max[0] - m_localAABB.m_min[0];
00057     btScalar ly= m_localAABB.m_max[1] - m_localAABB.m_min[1];
00058     btScalar lz= m_localAABB.m_max[2] - m_localAABB.m_min[2];
00059     const btScalar x2 = lx*lx;
00060     const btScalar y2 = ly*ly;
00061     const btScalar z2 = lz*lz;
00062     const btScalar scaledmass = mass * btScalar(0.08333333);
00063 
00064     inertia = scaledmass * (btVector3(y2+z2,x2+z2,x2+y2));
00065 
00066 #endif
00067     unlockChildShapes();
00068 }
00069 
00070 
00071 
00072 void btGImpactMeshShapePart::calculateLocalInertia(btScalar mass,btVector3& inertia) const
00073 {
00074     lockChildShapes();
00075 
00076 
00077 #ifdef CALC_EXACT_INERTIA
00078     inertia.setValue(0.f,0.f,0.f);
00079 
00080     int i = this->getVertexCount();
00081     btScalar pointmass = mass/btScalar(i);
00082 
00083     while(i--)
00084     {
00085         btVector3 pointintertia;
00086         this->getVertex(i,pointintertia);
00087         pointintertia = gim_get_point_inertia(pointintertia,pointmass);
00088         inertia+=pointintertia;
00089     }
00090 
00091 #else
00092 
00093     // Calc box inertia
00094 
00095     btScalar lx= m_localAABB.m_max[0] - m_localAABB.m_min[0];
00096     btScalar ly= m_localAABB.m_max[1] - m_localAABB.m_min[1];
00097     btScalar lz= m_localAABB.m_max[2] - m_localAABB.m_min[2];
00098     const btScalar x2 = lx*lx;
00099     const btScalar y2 = ly*ly;
00100     const btScalar z2 = lz*lz;
00101     const btScalar scaledmass = mass * btScalar(0.08333333);
00102 
00103     inertia = scaledmass * (btVector3(y2+z2,x2+z2,x2+y2));
00104 
00105 #endif
00106 
00107     unlockChildShapes();
00108 }
00109 
00110 void btGImpactMeshShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
00111 {
00112 
00113 #ifdef CALC_EXACT_INERTIA
00114     inertia.setValue(0.f,0.f,0.f);
00115 
00116     int i = this->getMeshPartCount();
00117     btScalar partmass = mass/btScalar(i);
00118 
00119     while(i--)
00120     {
00121         btVector3 partinertia;
00122         getMeshPart(i)->calculateLocalInertia(partmass,partinertia);
00123         inertia+=partinertia;
00124     }
00125 
00126 #else
00127 
00128     // Calc box inertia
00129 
00130     btScalar lx= m_localAABB.m_max[0] - m_localAABB.m_min[0];
00131     btScalar ly= m_localAABB.m_max[1] - m_localAABB.m_min[1];
00132     btScalar lz= m_localAABB.m_max[2] - m_localAABB.m_min[2];
00133     const btScalar x2 = lx*lx;
00134     const btScalar y2 = ly*ly;
00135     const btScalar z2 = lz*lz;
00136     const btScalar scaledmass = mass * btScalar(0.08333333);
00137 
00138     inertia = scaledmass * (btVector3(y2+z2,x2+z2,x2+y2));
00139 
00140 #endif
00141 }
00142 
00143 void btGImpactMeshShape::rayTest(const btVector3& rayFrom, const btVector3& rayTo, btCollisionWorld::RayResultCallback& resultCallback) const
00144 {
00145 }
00146 
00147 
00148 void btGImpactMeshShapePart::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
00149 {
00150     lockChildShapes();
00151     btAABB box;
00152     box.m_min = aabbMin;
00153     box.m_max = aabbMax;
00154 
00155     btAlignedObjectArray<int> collided;
00156     m_box_set.boxQuery(box,collided);
00157 
00158     if(collided.size()==0)
00159     {
00160         unlockChildShapes();
00161         return;
00162     }
00163 
00164     int part = (int)getPart();
00165     btPrimitiveTriangle triangle;
00166     int i = collided.size();
00167     while(i--)
00168     {
00169         this->getPrimitiveTriangle(collided[i],triangle);
00170         callback->processTriangle(triangle.m_vertices,part,collided[i]);
00171     }
00172     unlockChildShapes();
00173 
00174 }
00175 
00176 void btGImpactMeshShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
00177 {
00178     int i = m_mesh_parts.size();
00179     while(i--)
00180     {
00181         m_mesh_parts[i]->processAllTriangles(callback,aabbMin,aabbMax);
00182     }
00183 }
00184 
00185 
00187 const char* btGImpactMeshShape::serialize(void* dataBuffer, btSerializer* serializer) const
00188 {
00189     btGImpactMeshShapeData* trimeshData = (btGImpactMeshShapeData*) dataBuffer;
00190 
00191     btCollisionShape::serialize(&trimeshData->m_collisionShapeData,serializer);
00192 
00193     m_meshInterface->serialize(&trimeshData->m_meshInterface, serializer);
00194 
00195     trimeshData->m_collisionMargin = float(m_collisionMargin);
00196 
00197     localScaling.serializeFloat(trimeshData->m_localScaling);
00198 
00199     trimeshData->m_gimpactSubType = int(getGImpactShapeType());
00200 
00201     return "btGImpactMeshShapeData";
00202 }
00203