33#define BT_SOFTBODY_TRIANGLE_EXTRUSION btScalar(0.06)
37 m_isSwapped(isSwapped),
38 m_btSoftBodyTriangleCallback(ci.m_dispatcher1, body0Wrap, body1Wrap, isSwapped)
68 for (
int i = 0;
i < m_shapeCache.size();
i++)
73 m_softBody->getWorldInfo()->m_sparsesdf.RemoveReferences(tmp->
m_childShape);
91 const btTransform& tr = m_triBody->getWorldTransform();
92 m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]), tr(triangle[1]), color);
93 m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]), tr(triangle[2]), color);
94 m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]), tr(triangle[0]), color);
100 btTriIndex* shapeIndex = m_shapeCache[triKey];
107 tm->setUserPointer(m_triBody->getCollisionShape()->getUserPointer());
109 btCollisionObjectWrapper softBody(0, m_softBody->getCollisionShape(), m_softBody, m_softBody->getWorldTransform(), -1, -1);
115 colAlgo->
processCollision(&softBody, &triBody, *m_dispatchInfoPtr, m_resultOut);
129 btVector3 normal = (triangle[1] - triangle[0]).
cross(triangle[2] - triangle[0]);
134 btVector3 pts[6] = {triangle[0] + normal,
135 triangle[1] + normal,
136 triangle[2] + normal,
137 triangle[0] - normal,
138 triangle[1] - normal,
139 triangle[2] - normal};
149 tm->setUserPointer(m_triBody->getCollisionShape()->getUserPointer());
151 btCollisionObjectWrapper softBody(0, m_softBody->getCollisionShape(), m_softBody, m_softBody->getWorldTransform(), -1, -1);
157 colAlgo->
processCollision(&softBody, &triBody, *m_dispatchInfoPtr, m_resultOut);
162 m_shapeCache.insert(triKey, triIndex);
168 m_dispatchInfoPtr = &dispatchInfo;
170 m_resultOut = resultOut;
172 btVector3 aabbWorldSpaceMin, aabbWorldSpaceMax;
173 m_softBody->getAabb(aabbWorldSpaceMin, aabbWorldSpaceMax);
175 btVector3 softBodyCenter = (aabbWorldSpaceMax + aabbWorldSpaceMin) *
btScalar(0.5);
178 softTransform.setIdentity();
179 softTransform.setOrigin(softBodyCenter);
182 convexInTriangleSpace = triBodyWrap->
getWorldTransform().inverse() * softTransform;
183 btTransformAabb(halfExtents, m_collisionMarginTriangle, convexInTriangleSpace, m_aabbMin, m_aabbMax);
188 m_btSoftBodyTriangleCallback.clearCache();
203 btScalar collisionMarginTriangle = concaveShape->getMargin();
206 m_btSoftBodyTriangleCallback.setTimeStepAndCounters(collisionMarginTriangle, triBody, dispatchInfo, resultOut);
208 concaveShape->processAllTriangles(&m_btSoftBodyTriangleCallback, m_btSoftBodyTriangleCallback.getAabbMin(), m_btSoftBodyTriangleCallback.getAabbMax());
226 btScalar squareMot0 = (convexbody->getInterpolationWorldTransform().
getOrigin() - convexbody->getWorldTransform().getOrigin()).length2();
236 btTransform triInv = triBody->getWorldTransform().inverse();
237 btTransform convexFromLocal = triInv * convexbody->getWorldTransform();
238 btTransform convexToLocal = triInv * convexbody->getInterpolationWorldTransform();
250 : m_ccdSphereFromTrans(from),
251 m_ccdSphereToTrans(to),
252 m_ccdSphereRadius(ccdSphereRadius),
275 ident, ident, castResult))
283 if (triBody->getCollisionShape()->isConcave())
285 btVector3 rayAabbMin = convexFromLocal.getOrigin();
286 rayAabbMin.setMin(convexToLocal.getOrigin());
287 btVector3 rayAabbMax = convexFromLocal.getOrigin();
288 rayAabbMax.setMax(convexToLocal.getOrigin());
289 btScalar ccdRadius0 = convexbody->getCcdSweptSphereRadius();
290 rayAabbMin -=
btVector3(ccdRadius0, ccdRadius0, ccdRadius0);
291 rayAabbMax +=
btVector3(ccdRadius0, ccdRadius0, ccdRadius0);
294 LocalTriangleSphereCastCallback raycastCallback(convexFromLocal, convexToLocal,
295 convexbody->getCcdSweptSphereRadius(), curHitFraction);
297 raycastCallback.m_hitFraction = convexbody->getHitFraction();
305 triangleMesh->processAllTriangles(&raycastCallback, rayAabbMin, rayAabbMax);
308 if (raycastCallback.m_hitFraction < convexbody->getHitFraction())
310 convexbody->setHitFraction(raycastCallback.m_hitFraction);
311 return raycastCallback.m_hitFraction;
SIMD_FORCE_INLINE void btTransformAabb(const btVector3 &halfExtents, btScalar margin, const btTransform &t, btVector3 &aabbMinOut, btVector3 &aabbMaxOut)
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...
virtual void processTriangle(btVector3 *triangle, int partId, int triangleIndex)
btConvexHullShape(const btScalar *points=0, int numPoints=0, int stride=sizeof(btVector3))
@ BT_CLOSEST_POINT_ALGORITHMS
@ BT_CONTACT_POINT_ALGORITHMS
SIMD_FORCE_INLINE const btScalar & getX() const
Return the x value.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
#define BT_SOFTBODY_TRIANGLE_EXTRUSION
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...
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.
virtual void processCollision(const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut)
btSoftBodyConcaveCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo &ci, const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, bool isSwapped)
btScalar calculateTimeOfImpact(btCollisionObject *body0, btCollisionObject *body1, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut)
virtual ~btSoftBodyConcaveCollisionAlgorithm()
virtual void processTriangle(btVector3 *triangle, int partId, int triangleIndex)
btSoftBodyTriangleCallback(btDispatcher *dispatcher, const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, bool isSwapped)
virtual ~btSoftBodyTriangleCallback()
void setTimeStepAndCounters(btScalar collisionMarginTriangle, const btCollisionObjectWrapper *triObjWrap, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut)
virtual bool calcTimeOfImpact(const btTransform &fromA, const btTransform &toA, const btTransform &fromB, const btTransform &toB, CastResult &result)
VecBase< float, 3 > cross(VecOp< float, 3 >, VecOp< float, 3 >) RET
btDispatcher * m_dispatcher1
SIMD_FORCE_INLINE const btCollisionShape * getCollisionShape() const
SIMD_FORCE_INLINE const btTransform & getWorldTransform() const
SIMD_FORCE_INLINE const btCollisionObject * getCollisionObject() const
class btCollisionShape * m_childShape