33#define BT_SOFTBODY_TRIANGLE_EXTRUSION btScalar(0.06)
38 m_btSoftBodyTriangleCallback(ci.m_dispatcher1, body0Wrap, body1Wrap, isSwapped)
68 for (
int i = 0; i < m_shapeCache.
size(); i++)
90 btVector3
color(1, 1, 0);
91 const btTransform& tr = m_triBody->getWorldTransform();
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);
174 btVector3 halfExtents = (aabbWorldSpaceMax - aabbWorldSpaceMin) *
btScalar(0.5);
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);
199 const btConcaveShape* concaveShape =
static_cast<const btConcaveShape*
>(triOb->getCollisionShape());
203 btScalar collisionMarginTriangle = concaveShape->getMargin();
206 m_btSoftBodyTriangleCallback.
setTimeStepAndCounters(collisionMarginTriangle, triBody, dispatchInfo, resultOut);
208 concaveShape->processAllTriangles(&m_btSoftBodyTriangleCallback, m_btSoftBodyTriangleCallback.
getAabbMin(), m_btSoftBodyTriangleCallback.
getAabbMax());
219 btCollisionObject* convexbody = m_isSwapped ? body1 : body0;
220 btCollisionObject* triBody = m_isSwapped ? body0 : body1;
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),
257 virtual void processTriangle(btVector3* triangle,
int partId,
int triangleIndex)
267 btTriangleShape triShape(triangle[0], triangle[1], triangle[2]);
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();
299 btCollisionObject* concavebody = triBody;
301 btConcaveShape* triangleMesh = (btConcaveShape*)concavebody->getCollisionShape();
305 triangleMesh->processAllTriangles(&raycastCallback, rayAabbMin, rayAabbMax);
308 if (raycastCallback.m_hitFraction < convexbody->getHitFraction())
310 convexbody->setHitFraction(raycastCallback.m_hitFraction);
311 return raycastCallback.m_hitFraction;
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a color
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)
const btDispatcherInfo * m_dispatchInfoPtr
btDispatcher * m_dispatcher
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)
SIMD_FORCE_INLINE btScalar length2() const
Return the length of the vector squared.
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
void insert(const Key &key, const Value &value)
const Value * getAtIndex(int index) const
virtual void drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color)=0
virtual int getDebugMode() const =0
btManifoldResult is a helper class to manage contact results.
btScalar m_closestPointDistanceThreshold
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)
SIMD_FORCE_INLINE const btVector3 & getAabbMax() const
virtual ~btSoftBodyTriangleCallback()
SIMD_FORCE_INLINE const btVector3 & getAabbMin() const
void setTimeStepAndCounters(btScalar collisionMarginTriangle, const btCollisionObjectWrapper *triObjWrap, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut)
btSoftBodyWorldInfo * getWorldInfo()
virtual void getAabb(btVector3 &aabbMin, btVector3 &aabbMax) const
virtual bool calcTimeOfImpact(const btTransform &fromA, const btTransform &toA, const btTransform &fromB, const btTransform &toB, CastResult &result)
ccl_device_inline float cross(const float2 a, const float2 b)
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 btIDebugDraw * m_debugDraw
btSparseSdf< 3 > m_sparsesdf
int RemoveReferences(btCollisionShape *pcs)
class btCollisionShape * m_childShape