Changeset View
Changeset View
Standalone View
Standalone View
extern/bullet2/src/BulletCollision/Gimpact/btCompoundFromGimpact.h
| #ifndef BT_COMPOUND_FROM_GIMPACT | #ifndef BT_COMPOUND_FROM_GIMPACT | ||||
| #define BT_COMPOUND_FROM_GIMPACT | #define BT_COMPOUND_FROM_GIMPACT | ||||
| #include "BulletCollision/CollisionShapes/btCompoundShape.h" | #include "BulletCollision/CollisionShapes/btCompoundShape.h" | ||||
| #include "btGImpactShape.h" | #include "btGImpactShape.h" | ||||
| #include "BulletCollision/NarrowPhaseCollision/btRaycastCallback.h" | #include "BulletCollision/NarrowPhaseCollision/btRaycastCallback.h" | ||||
| ATTRIBUTE_ALIGNED16(class) | |||||
| btCompoundFromGimpactShape : public btCompoundShape | |||||
| { | |||||
| public: | |||||
| BT_DECLARE_ALIGNED_ALLOCATOR(); | |||||
| virtual ~btCompoundFromGimpactShape() | |||||
| { | |||||
| /*delete all the btBU_Simplex1to4 ChildShapes*/ | |||||
| for (int i = 0; i < m_children.size(); i++) | |||||
| { | |||||
| delete m_children[i].m_childShape; | |||||
| } | |||||
| } | |||||
| }; | |||||
| struct MyCallback : public btTriangleRaycastCallback | struct MyCallback : public btTriangleRaycastCallback | ||||
| { | { | ||||
| int m_ignorePart; | int m_ignorePart; | ||||
| int m_ignoreTriangleIndex; | int m_ignoreTriangleIndex; | ||||
| MyCallback(const btVector3& from, const btVector3& to, int ignorePart, int ignoreTriangleIndex) | MyCallback(const btVector3& from, const btVector3& to, int ignorePart, int ignoreTriangleIndex) | ||||
| :btTriangleRaycastCallback(from,to), | : btTriangleRaycastCallback(from, to), | ||||
| m_ignorePart(ignorePart), | m_ignorePart(ignorePart), | ||||
| m_ignoreTriangleIndex(ignoreTriangleIndex) | m_ignoreTriangleIndex(ignoreTriangleIndex) | ||||
| { | { | ||||
| } | } | ||||
| virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex) | virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex) | ||||
| { | { | ||||
| if (partId!=m_ignorePart || triangleIndex!=m_ignoreTriangleIndex) | if (partId != m_ignorePart || triangleIndex != m_ignoreTriangleIndex) | ||||
| { | { | ||||
| if (hitFraction < m_hitFraction) | if (hitFraction < m_hitFraction) | ||||
| return hitFraction; | return hitFraction; | ||||
| } | } | ||||
| return m_hitFraction; | return m_hitFraction; | ||||
| } | } | ||||
| }; | }; | ||||
| struct MyInternalTriangleIndexCallback :public btInternalTriangleIndexCallback | struct MyInternalTriangleIndexCallback : public btInternalTriangleIndexCallback | ||||
| { | { | ||||
| const btGImpactMeshShape* m_gimpactShape; | const btGImpactMeshShape* m_gimpactShape; | ||||
| btCompoundShape* m_colShape; | btCompoundShape* m_colShape; | ||||
| btScalar m_depth; | btScalar m_depth; | ||||
| MyInternalTriangleIndexCallback (btCompoundShape* colShape, const btGImpactMeshShape* meshShape, btScalar depth) | MyInternalTriangleIndexCallback(btCompoundShape* colShape, const btGImpactMeshShape* meshShape, btScalar depth) | ||||
| :m_colShape(colShape), | : m_colShape(colShape), | ||||
| m_gimpactShape(meshShape), | m_gimpactShape(meshShape), | ||||
| m_depth(depth) | m_depth(depth) | ||||
| { | { | ||||
| } | } | ||||
| virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex) | virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex) | ||||
| { | { | ||||
| btVector3 scale = m_gimpactShape->getLocalScaling(); | btVector3 scale = m_gimpactShape->getLocalScaling(); | ||||
| btVector3 v0=triangle[0]*scale; | btVector3 v0 = triangle[0] * scale; | ||||
| btVector3 v1=triangle[1]*scale; | btVector3 v1 = triangle[1] * scale; | ||||
| btVector3 v2=triangle[2]*scale; | btVector3 v2 = triangle[2] * scale; | ||||
| btVector3 centroid = (v0+v1+v2)/3; | btVector3 centroid = (v0 + v1 + v2) / 3; | ||||
| btVector3 normal = (v1-v0).cross(v2-v0); | btVector3 normal = (v1 - v0).cross(v2 - v0); | ||||
| normal.normalize(); | normal.normalize(); | ||||
| btVector3 rayFrom = centroid; | btVector3 rayFrom = centroid; | ||||
| btVector3 rayTo = centroid-normal*m_depth; | btVector3 rayTo = centroid - normal * m_depth; | ||||
| MyCallback cb(rayFrom,rayTo,partId,triangleIndex); | MyCallback cb(rayFrom, rayTo, partId, triangleIndex); | ||||
| m_gimpactShape->processAllTrianglesRay(&cb,rayFrom, rayTo); | m_gimpactShape->processAllTrianglesRay(&cb, rayFrom, rayTo); | ||||
| if (cb.m_hitFraction<1) | if (cb.m_hitFraction < 1) | ||||
| { | { | ||||
| rayTo.setInterpolate3(cb.m_from,cb.m_to,cb.m_hitFraction); | rayTo.setInterpolate3(cb.m_from, cb.m_to, cb.m_hitFraction); | ||||
| //rayTo = cb.m_from; | //rayTo = cb.m_from; | ||||
| //rayTo = rayTo.lerp(cb.m_to,cb.m_hitFraction); | //rayTo = rayTo.lerp(cb.m_to,cb.m_hitFraction); | ||||
| //gDebugDraw.drawLine(tr(centroid),tr(centroid+normal),btVector3(1,0,0)); | //gDebugDraw.drawLine(tr(centroid),tr(centroid+normal),btVector3(1,0,0)); | ||||
| } | } | ||||
| btBU_Simplex1to4* tet = new btBU_Simplex1to4(v0,v1,v2,rayTo); | btBU_Simplex1to4* tet = new btBU_Simplex1to4(v0, v1, v2, rayTo); | ||||
| btTransform ident; | btTransform ident; | ||||
| ident.setIdentity(); | ident.setIdentity(); | ||||
| m_colShape->addChildShape(ident,tet); | m_colShape->addChildShape(ident, tet); | ||||
| } | } | ||||
| }; | }; | ||||
| btCompoundShape* btCreateCompoundFromGimpactShape(const btGImpactMeshShape* gimpactMesh, btScalar depth) | btCompoundShape* btCreateCompoundFromGimpactShape(const btGImpactMeshShape* gimpactMesh, btScalar depth) | ||||
| { | { | ||||
| btCompoundShape* colShape = new btCompoundShape(); | btCompoundShape* colShape = new btCompoundFromGimpactShape(); | ||||
| btTransform tr; | btTransform tr; | ||||
| tr.setIdentity(); | tr.setIdentity(); | ||||
| MyInternalTriangleIndexCallback cb(colShape,gimpactMesh, depth); | MyInternalTriangleIndexCallback cb(colShape, gimpactMesh, depth); | ||||
| btVector3 aabbMin,aabbMax; | btVector3 aabbMin, aabbMax; | ||||
| gimpactMesh->getAabb(tr,aabbMin,aabbMax); | gimpactMesh->getAabb(tr, aabbMin, aabbMax); | ||||
| gimpactMesh->getMeshInterface()->InternalProcessAllTriangles(&cb,aabbMin,aabbMax); | gimpactMesh->getMeshInterface()->InternalProcessAllTriangles(&cb, aabbMin, aabbMax); | ||||
| return colShape; | return colShape; | ||||
| } | } | ||||
| #endif //BT_COMPOUND_FROM_GIMPACT | #endif //BT_COMPOUND_FROM_GIMPACT | ||||
| No newline at end of file | |||||