btCompoundFromGimpact.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #ifndef BT_COMPOUND_FROM_GIMPACT
  2. #define BT_COMPOUND_FROM_GIMPACT
  3. #include "BulletCollision/CollisionShapes/btCompoundShape.h"
  4. #include "btGImpactShape.h"
  5. #include "BulletCollision/NarrowPhaseCollision/btRaycastCallback.h"
  6. ATTRIBUTE_ALIGNED16(class)
  7. btCompoundFromGimpactShape : public btCompoundShape
  8. {
  9. public:
  10. BT_DECLARE_ALIGNED_ALLOCATOR();
  11. virtual ~btCompoundFromGimpactShape()
  12. {
  13. /*delete all the btBU_Simplex1to4 ChildShapes*/
  14. for (int i = 0; i < m_children.size(); i++)
  15. {
  16. delete m_children[i].m_childShape;
  17. }
  18. }
  19. };
  20. struct MyCallback : public btTriangleRaycastCallback
  21. {
  22. int m_ignorePart;
  23. int m_ignoreTriangleIndex;
  24. MyCallback(const btVector3& from, const btVector3& to, int ignorePart, int ignoreTriangleIndex)
  25. : btTriangleRaycastCallback(from, to),
  26. m_ignorePart(ignorePart),
  27. m_ignoreTriangleIndex(ignoreTriangleIndex)
  28. {
  29. }
  30. virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex)
  31. {
  32. if (partId != m_ignorePart || triangleIndex != m_ignoreTriangleIndex)
  33. {
  34. if (hitFraction < m_hitFraction)
  35. return hitFraction;
  36. }
  37. return m_hitFraction;
  38. }
  39. };
  40. struct MyInternalTriangleIndexCallback : public btInternalTriangleIndexCallback
  41. {
  42. const btGImpactMeshShape* m_gimpactShape;
  43. btCompoundShape* m_colShape;
  44. btScalar m_depth;
  45. MyInternalTriangleIndexCallback(btCompoundShape* colShape, const btGImpactMeshShape* meshShape, btScalar depth)
  46. : m_colShape(colShape),
  47. m_gimpactShape(meshShape),
  48. m_depth(depth)
  49. {
  50. }
  51. virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
  52. {
  53. btVector3 scale = m_gimpactShape->getLocalScaling();
  54. btVector3 v0 = triangle[0] * scale;
  55. btVector3 v1 = triangle[1] * scale;
  56. btVector3 v2 = triangle[2] * scale;
  57. btVector3 centroid = (v0 + v1 + v2) / 3;
  58. btVector3 normal = (v1 - v0).cross(v2 - v0);
  59. normal.normalize();
  60. btVector3 rayFrom = centroid;
  61. btVector3 rayTo = centroid - normal * m_depth;
  62. MyCallback cb(rayFrom, rayTo, partId, triangleIndex);
  63. m_gimpactShape->processAllTrianglesRay(&cb, rayFrom, rayTo);
  64. if (cb.m_hitFraction < 1)
  65. {
  66. rayTo.setInterpolate3(cb.m_from, cb.m_to, cb.m_hitFraction);
  67. //rayTo = cb.m_from;
  68. //rayTo = rayTo.lerp(cb.m_to,cb.m_hitFraction);
  69. //gDebugDraw.drawLine(tr(centroid),tr(centroid+normal),btVector3(1,0,0));
  70. }
  71. btBU_Simplex1to4* tet = new btBU_Simplex1to4(v0, v1, v2, rayTo);
  72. btTransform ident;
  73. ident.setIdentity();
  74. m_colShape->addChildShape(ident, tet);
  75. }
  76. };
  77. btCompoundShape* btCreateCompoundFromGimpactShape(const btGImpactMeshShape* gimpactMesh, btScalar depth)
  78. {
  79. btCompoundShape* colShape = new btCompoundFromGimpactShape();
  80. btTransform tr;
  81. tr.setIdentity();
  82. MyInternalTriangleIndexCallback cb(colShape, gimpactMesh, depth);
  83. btVector3 aabbMin, aabbMax;
  84. gimpactMesh->getAabb(tr, aabbMin, aabbMax);
  85. gimpactMesh->getMeshInterface()->InternalProcessAllTriangles(&cb, aabbMin, aabbMax);
  86. return colShape;
  87. }
  88. #endif //BT_COMPOUND_FROM_GIMPACT