13
13
3. This notice may not be removed or altered from any source distribution.
18
#include "BulletCollision/CollisionShapes/btConvexShape.h"
19
#include "BulletCollision/CollisionShapes/btTriangleShape.h"
20
#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h"
21
#include "BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h"
22
#include "BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h"
23
#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
17
24
#include "btRaycastCallback.h"
19
26
btTriangleRaycastCallback::btTriangleRaycastCallback(const btVector3& from,const btVector3& to)
30
37
void btTriangleRaycastCallback::processTriangle(btVector3* triangle,int partId, int triangleIndex)
34
39
const btVector3 &vert0=triangle[0];
35
40
const btVector3 &vert1=triangle[1];
36
41
const btVector3 &vert2=triangle[2];
109
btTriangleConvexcastCallback::btTriangleConvexcastCallback (const btConvexShape* convexShape, const btTransform& convexShapeFrom, const btTransform& convexShapeTo, const btTransform& triangleToWorld, const btScalar triangleCollisionMargin)
111
m_convexShape = convexShape;
112
m_convexShapeFrom = convexShapeFrom;
113
m_convexShapeTo = convexShapeTo;
114
m_triangleToWorld = triangleToWorld;
116
m_triangleCollisionMargin = triangleCollisionMargin;
120
btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId, int triangleIndex)
122
btTriangleShape triangleShape (triangle[0], triangle[1], triangle[2]);
123
triangleShape.setMargin(m_triangleCollisionMargin);
125
btVoronoiSimplexSolver simplexSolver;
126
btGjkEpaPenetrationDepthSolver gjkEpaPenetrationSolver;
128
//#define USE_SUBSIMPLEX_CONVEX_CAST 1
129
//if you reenable USE_SUBSIMPLEX_CONVEX_CAST see commented out code below
130
#ifdef USE_SUBSIMPLEX_CONVEX_CAST
131
btSubsimplexConvexCast convexCaster(m_convexShape, &triangleShape, &simplexSolver);
133
//btGjkConvexCast convexCaster(m_convexShape,&triangleShape,&simplexSolver);
134
btContinuousConvexCollision convexCaster(m_convexShape,&triangleShape,&simplexSolver,&gjkEpaPenetrationSolver);
135
#endif //#USE_SUBSIMPLEX_CONVEX_CAST
137
btConvexCast::CastResult castResult;
138
castResult.m_fraction = btScalar(1.);
139
if (convexCaster.calcTimeOfImpact(m_convexShapeFrom,m_convexShapeTo,m_triangleToWorld, m_triangleToWorld, castResult))
142
if (castResult.m_normal.length2() > btScalar(0.0001))
144
if (castResult.m_fraction < m_hitFraction)
146
/* btContinuousConvexCast's normal is already in world space */
148
#ifdef USE_SUBSIMPLEX_CONVEX_CAST
149
//rotate normal into worldspace
150
castResult.m_normal = m_convexShapeFrom.getBasis() * castResult.m_normal;
151
#endif //USE_SUBSIMPLEX_CONVEX_CAST
153
castResult.m_normal.normalize();
155
reportHit (castResult.m_normal,
156
castResult.m_hitPoint,
157
castResult.m_fraction,