Bullet Collision Detection & Physics Library
btCompoundFromGimpact.h
Go to the documentation of this file.
1 #ifndef BT_COMPOUND_FROM_GIMPACT
2 #define BT_COMPOUND_FROM_GIMPACT
3 
5 #include "btGImpactShape.h"
7 
9  {
12 
13 
14  MyCallback(const btVector3& from, const btVector3& to, int ignorePart, int ignoreTriangleIndex)
15  :btTriangleRaycastCallback(from,to),
16  m_ignorePart(ignorePart),
17  m_ignoreTriangleIndex(ignoreTriangleIndex)
18  {
19 
20  }
21  virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex)
22  {
23  if (partId!=m_ignorePart || triangleIndex!=m_ignoreTriangleIndex)
24  {
25  if (hitFraction < m_hitFraction)
26  return hitFraction;
27  }
28 
29  return m_hitFraction;
30  }
31  };
33  {
37 
39  :m_colShape(colShape),
40  m_gimpactShape(meshShape),
41  m_depth(depth)
42  {
43  }
44 
45  virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
46  {
47  btVector3 scale = m_gimpactShape->getLocalScaling();
48  btVector3 v0=triangle[0]*scale;
49  btVector3 v1=triangle[1]*scale;
50  btVector3 v2=triangle[2]*scale;
51 
52  btVector3 centroid = (v0+v1+v2)/3;
53  btVector3 normal = (v1-v0).cross(v2-v0);
54  normal.normalize();
55  btVector3 rayFrom = centroid;
56  btVector3 rayTo = centroid-normal*m_depth;
57 
58  MyCallback cb(rayFrom,rayTo,partId,triangleIndex);
59 
60  m_gimpactShape->processAllTrianglesRay(&cb,rayFrom, rayTo);
61  if (cb.m_hitFraction<1)
62  {
63  rayTo.setInterpolate3(cb.m_from,cb.m_to,cb.m_hitFraction);
64  //rayTo = cb.m_from;
65  //rayTo = rayTo.lerp(cb.m_to,cb.m_hitFraction);
66  //gDebugDraw.drawLine(tr(centroid),tr(centroid+normal),btVector3(1,0,0));
67  }
68 
69 
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 
79 {
80  btCompoundShape* colShape = new btCompoundShape();
81 
82  btTransform tr;
83  tr.setIdentity();
84 
85  MyInternalTriangleIndexCallback cb(colShape,gimpactMesh, depth);
86  btVector3 aabbMin,aabbMax;
87  gimpactMesh->getAabb(tr,aabbMin,aabbMax);
88  gimpactMesh->getMeshInterface()->InternalProcessAllTriangles(&cb,aabbMin,aabbMax);
89 
90  return colShape;
91 }
92 
93 #endif //BT_COMPOUND_FROM_GIMPACT
virtual void internalProcessTriangleIndex(btVector3 *triangle, int partId, int triangleIndex)
const btGImpactMeshShape * m_gimpactShape
void setIdentity()
Set this transformation to the identity.
Definition: btTransform.h:172
btCompoundShape * btCreateCompoundFromGimpactShape(const btGImpactMeshShape *gimpactMesh, btScalar depth)
void addChildShape(const btTransform &localTransform, btCollisionShape *shape)
This class manages a mesh supplied by the btStridingMeshInterface interface.
void getAabb(const btTransform &t, btVector3 &aabbMin, btVector3 &aabbMax) const
If the Bounding box is not updated, then this class attemps to calculate it.
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
Definition: btVector3.h:297
btStridingMeshInterface * getMeshInterface()
virtual void processAllTrianglesRay(btTriangleCallback *callback, const btVector3 &rayFrom, const btVector3 &rayTo) const
Function for retrieve triangles.
The btBU_Simplex1to4 implements tetrahedron, triangle, line, vertex collision shapes. In most cases it is better to use btConvexHullShape instead.
btVector3 can be used to represent 3D points and vectors.
Definition: btVector3.h:83
MyInternalTriangleIndexCallback(btCompoundShape *colShape, const btGImpactMeshShape *meshShape, btScalar depth)
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition: btTransform.h:34
virtual const btVector3 & getLocalScaling() const
virtual btScalar reportHit(const btVector3 &hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex)
The btCompoundShape allows to store multiple other btCollisionShapes This allows for moving concave c...
void setInterpolate3(const btVector3 &v0, const btVector3 &v1, btScalar rt)
Definition: btVector3.h:491
MyCallback(const btVector3 &from, const btVector3 &to, int ignorePart, int ignoreTriangleIndex)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition: btScalar.h:278
virtual void InternalProcessAllTriangles(btInternalTriangleIndexCallback *callback, const btVector3 &aabbMin, const btVector3 &aabbMax) const