33 m_btConvexTriangleCallback(ci.m_dispatcher1, body0Wrap, body1Wrap, isSwapped),
38btConvexConcaveCollisionAlgorithm::~btConvexConcaveCollisionAlgorithm()
42void btConvexConcaveCollisionAlgorithm::getAllContactManifolds(
btManifoldArray& manifoldArray)
44 if (m_btConvexTriangleCallback.m_manifoldPtr)
46 manifoldArray.
push_back(m_btConvexTriangleCallback.m_manifoldPtr);
64btConvexTriangleCallback::~btConvexTriangleCallback()
70void btConvexTriangleCallback::clearCache()
75void btConvexTriangleCallback::processTriangle(
btVector3* triangle,
int partId,
int triangleIndex)
77 BT_PROFILE(
"btConvexTriangleCallback::processTriangle");
112 if (
m_resultOut->m_closestPointDistanceThreshold > 0)
126 m_resultOut->setShapeIdentifiersA(partId, triangleIndex);
132 m_resultOut->setShapeIdentifiersB(partId, triangleIndex);
168 btVector3 extra(extraMargin, extraMargin, extraMargin);
174void btConvexConcaveCollisionAlgorithm::clearCache()
176 m_btConvexTriangleCallback.clearCache();
181 BT_PROFILE(
"btConvexConcaveCollisionAlgorithm::processCollision");
196 if (convex->isPolyhedral())
199 for (
int v = 0;
v < poly->getNumVertices();
v++)
202 poly->getVertex(
v, vtx);
214 if (queryVertices.
size())
220 for (
int v = 0;
v < queryVertices.
size();
v++)
228 if (sdfShape->
queryPoint(vtxInSdf, dist, normalLocal))
232 normalLocal.safeNormalize();
238 dist -= sphere->getRadius();
239 vtxWorldSpace -= sphere->getRadius() * normal;
241 resultOut->
addContactPoint(normal, vtxWorldSpace - normal * dist, dist);
255 btScalar collisionMarginTriangle = concaveShape->getMargin();
258 m_btConvexTriangleCallback.setTimeStepAndCounters(collisionMarginTriangle, dispatchInfo, convexBodyWrap, triBodyWrap, resultOut);
262 concaveShape->processAllTriangles(&m_btConvexTriangleCallback, m_btConvexTriangleCallback.getAabbMin(), m_btConvexTriangleCallback.getAabbMax());
266 m_btConvexTriangleCallback.clearWrapperData();
283 btScalar squareMot0 = (convexbody->getInterpolationWorldTransform().
getOrigin() - convexbody->getWorldTransform().getOrigin()).length2();
293 btTransform triInv = triBody->getWorldTransform().inverse();
294 btTransform convexFromLocal = triInv * convexbody->getWorldTransform();
295 btTransform convexToLocal = triInv * convexbody->getInterpolationWorldTransform();
307 : m_ccdSphereFromTrans(from),
308 m_ccdSphereToTrans(to),
309 m_ccdSphereRadius(ccdSphereRadius),
322 btConvexCast::CastResult castResult;
327 btSubsimplexConvexCast convexCaster(&pointShape, &triShape, &simplexSolver);
332 if (convexCaster.calcTimeOfImpact(m_ccdSphereFromTrans, m_ccdSphereToTrans,
333 ident, ident, castResult))
341 if (triBody->getCollisionShape()->isConcave())
343 btVector3 rayAabbMin = convexFromLocal.getOrigin();
344 rayAabbMin.setMin(convexToLocal.getOrigin());
345 btVector3 rayAabbMax = convexFromLocal.getOrigin();
346 rayAabbMax.setMax(convexToLocal.getOrigin());
347 btScalar ccdRadius0 = convexbody->getCcdSweptSphereRadius();
348 rayAabbMin -=
btVector3(ccdRadius0, ccdRadius0, ccdRadius0);
349 rayAabbMax +=
btVector3(ccdRadius0, ccdRadius0, ccdRadius0);
352 LocalTriangleSphereCastCallback raycastCallback(convexFromLocal, convexToLocal,
353 convexbody->getCcdSweptSphereRadius(), curHitFraction);
355 raycastCallback.m_hitFraction = convexbody->getHitFraction();
363 triangleMesh->processAllTriangles(&raycastCallback, rayAabbMin, rayAabbMax);
366 if (raycastCallback.m_hitFraction < convexbody->getHitFraction())
368 convexbody->setHitFraction(raycastCallback.m_hitFraction);
369 return raycastCallback.m_hitFraction;
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE bool TestTriangleAgainstAabb2(const btVector3 *vertices, const btVector3 &aabbMin, const btVector3 &aabbMax)
conservative test for overlap between triangle and aabb
btAlignedObjectArray< btPersistentManifold * > btManifoldArray
btScalar m_hitFraction
time of impact calculation
btScalar getCcdSquareMotionThreshold() const
btCollisionShape
The btCollisionShape class provides an interface for collision shapes that can be shared among btColl...
btManifoldResult * m_resultOut
btPersistentManifold * m_manifoldPtr
btScalar m_collisionMarginTriangle
const btCollisionObjectWrapper * m_triBodyWrap
const btDispatcherInfo * m_dispatchInfoPtr
btDispatcher * m_dispatcher
const btCollisionObjectWrapper * m_convexBodyWrap
btConvexShape()
not supported on IBM SDK, until we fix the alignment of btVector3
@ BT_CLOSEST_POINT_ALGORITHMS
@ BT_CONTACT_POINT_ALGORITHMS
btPolyhedralConvexShape()
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btSphereShape(btScalar radius)
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
This class is not enabled yet (work-in-progress) to more aggressively activate objects.
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
SIMD_FORCE_INLINE void push_back(const T &_Val)
virtual void processCollision(const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut)=0
virtual ~btCollisionAlgorithm()
virtual void freeCollisionAlgorithm(void *ptr)=0
virtual btCollisionAlgorithm * findAlgorithm(const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, btPersistentManifold *sharedManifold, ebtDispatcherQueryType queryType)=0
btManifoldResult is a helper class to manage contact results.
void setPersistentManifold(btPersistentManifold *manifoldPtr)
btScalar m_closestPointDistanceThreshold
SIMD_FORCE_INLINE void refreshContactPoints()
virtual void addContactPoint(const btVector3 &normalOnBInWorld, const btVector3 &pointInWorld, btScalar depth)
bool queryPoint(const btVector3 &ptInSDF, btScalar &distOut, btVector3 &normal)
virtual void processTriangle(btVector3 *triangle, int partId, int triangleIndex)=0
btDispatcher * m_dispatcher1
SIMD_FORCE_INLINE const btCollisionShape * getCollisionShape() const
SIMD_FORCE_INLINE const btTransform & getWorldTransform() const
SIMD_FORCE_INLINE const btCollisionObject * getCollisionObject() const