1 #ifndef BT_COMPOUND_FROM_GIMPACT
2 #define BT_COMPOUND_FROM_GIMPACT
4 #include "BulletCollision/CollisionShapes/btCompoundShape.h"
5 #include "btGImpactShape.h"
6 #include "BulletCollision/NarrowPhaseCollision/btRaycastCallback.h"
8 ATTRIBUTE_ALIGNED16(class)
9 btCompoundFromGimpactShape : public btCompoundShape
12 BT_DECLARE_ALIGNED_ALLOCATOR();
14 virtual ~btCompoundFromGimpactShape()
16 /*delete all the btBU_Simplex1to4 ChildShapes*/
17 for (int i = 0; i < m_children.size(); i++)
19 delete m_children[i].m_childShape;
24 struct MyCallback : public btTriangleRaycastCallback
27 int m_ignoreTriangleIndex;
29 MyCallback(const btVector3& from, const btVector3& to, int ignorePart, int ignoreTriangleIndex)
30 : btTriangleRaycastCallback(from, to),
31 m_ignorePart(ignorePart),
32 m_ignoreTriangleIndex(ignoreTriangleIndex)
35 virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex)
37 if (partId != m_ignorePart || triangleIndex != m_ignoreTriangleIndex)
39 if (hitFraction < m_hitFraction)
46 struct MyInternalTriangleIndexCallback : public btInternalTriangleIndexCallback
48 const btGImpactMeshShape* m_gimpactShape;
49 btCompoundShape* m_colShape;
52 MyInternalTriangleIndexCallback(btCompoundShape* colShape, const btGImpactMeshShape* meshShape, btScalar depth)
53 : m_colShape(colShape),
54 m_gimpactShape(meshShape),
59 virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
61 btVector3 scale = m_gimpactShape->getLocalScaling();
62 btVector3 v0 = triangle[0] * scale;
63 btVector3 v1 = triangle[1] * scale;
64 btVector3 v2 = triangle[2] * scale;
66 btVector3 centroid = (v0 + v1 + v2) / 3;
67 btVector3 normal = (v1 - v0).cross(v2 - v0);
69 btVector3 rayFrom = centroid;
70 btVector3 rayTo = centroid - normal * m_depth;
72 MyCallback cb(rayFrom, rayTo, partId, triangleIndex);
74 m_gimpactShape->processAllTrianglesRay(&cb, rayFrom, rayTo);
75 if (cb.m_hitFraction < 1)
77 rayTo.setInterpolate3(cb.m_from, cb.m_to, cb.m_hitFraction);
79 //rayTo = rayTo.lerp(cb.m_to,cb.m_hitFraction);
80 //gDebugDraw.drawLine(tr(centroid),tr(centroid+normal),btVector3(1,0,0));
83 btBU_Simplex1to4* tet = new btBU_Simplex1to4(v0, v1, v2, rayTo);
86 m_colShape->addChildShape(ident, tet);
90 btCompoundShape* btCreateCompoundFromGimpactShape(const btGImpactMeshShape* gimpactMesh, btScalar depth)
92 btCompoundShape* colShape = new btCompoundFromGimpactShape();
97 MyInternalTriangleIndexCallback cb(colShape, gimpactMesh, depth);
98 btVector3 aabbMin, aabbMax;
99 gimpactMesh->getAabb(tr, aabbMin, aabbMax);
100 gimpactMesh->getMeshInterface()->InternalProcessAllTriangles(&cb, aabbMin, aabbMax);
105 #endif //BT_COMPOUND_FROM_GIMPACT