29 btMultiBodyConstraintSolver* constraintSolver,
32 m_softBodySolver(softBodySolver),
35 if (!m_softBodySolver)
43 m_drawNodeTree =
true;
44 m_drawFaceTree =
false;
45 m_drawClusterTree =
false;
73 BT_PROFILE(
"predictUnconstraintMotionSoftBody");
85 btAssert(
"Solver initialization failed\n");
94 for (
int i = 0; i < m_softBodies.
size(); i++)
111 if (m_softBodies.
size())
129 collisionFilterGroup,
130 collisionFilterMask);
135 m_softBodies.
remove(body);
153 if (getDebugDrawer())
156 for (i = 0; i < this->m_softBodies.
size(); i++)
197 btVector3 rayDir = (rayToWorld - rayFromWorld);
225 #ifdef RECALCULATE_AABB
226 btVector3 collisionObjectAabbMin,collisionObjectAabbMax;
227 collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(),collisionObjectAabbMin,collisionObjectAabbMax);
230 const btVector3& collisionObjectAabbMin = collisionObject->getBroadphaseHandle()->m_aabbMin;
231 const btVector3& collisionObjectAabbMax = collisionObject->getBroadphaseHandle()->m_aabbMax;
240 collisionObject->getCollisionShape(),
241 collisionObject->getWorldTransform(),
256 #ifndef USE_BRUTEFORCE_RAYBROADPHASE
257 m_broadphasePairCache->rayTest(rayFromWorld, rayToWorld, rayCB);
259 for (
int i = 0; i < this->getNumCollisionObjects(); i++)
270 RayResultCallback& resultCallback)
272 if (collisionShape->isSoftBody())
278 if (softBody->
rayTest(rayFromTrans.getOrigin(), rayToTrans.getOrigin(), softResult))
280 if (softResult.
fraction <= resultCallback.m_closestHitFraction)
286 btVector3 rayDir = rayToTrans.getOrigin() - rayFromTrans.getOrigin();
293 if (
normal.dot(rayDir) > 0)
304 bool normalInWorldSpace =
true;
305 resultCallback.addSingleResult(rayResult, normalInWorldSpace);
320 for (i = 0; i < m_collisionObjects.size(); i++)
325 int len = colObj->calculateSerializeBufferSize();
327 const char* structType = colObj->serialize(chunk->
m_oldPtr, serializer);
345 serializeCollisionObjects(serializer);
347 serializeContactManifolds(serializer);
#define btAlignedFree(ptr)
#define btAlignedAlloc(size, alignment)
SIMD_FORCE_INLINE btBroadphaseProxy * getBroadphaseHandle()
btCollisionShape
The btCollisionShape class provides an interface for collision shapes that can be shared among btColl...
void serializeRigidBodies(btSerializer *serializer)
void serializeDynamicsWorldInfo(btSerializer *serializer)
virtual void predictUnconstraintMotion(btScalar timeStep)
virtual void removeCollisionObject(btCollisionObject *collisionObject)
removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise ca...
virtual void internalSingleStepSimulation(btScalar timeStep)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
void remove(const T &key)
SIMD_FORCE_INLINE void push_back(const T &_Val)
virtual void removeCollisionObject(btCollisionObject *collisionObject)
virtual void addCollisionObject(btCollisionObject *collisionObject, int collisionFilterGroup=btBroadphaseProxy::DefaultFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter)
static void rayTestSingle(const btTransform &rayFromTrans, const btTransform &rayToTrans, btCollisionObject *collisionObject, const btCollisionShape *collisionShape, const btTransform &colObjWorldTransform, RayResultCallback &resultCallback)
virtual void serializeMultiBodies(btSerializer *serializer)
virtual void debugDrawWorld()
virtual btChunk * allocate(size_t size, int numElements)=0
virtual void finishSerialization()=0
virtual void startSerialization()=0
virtual void finalizeChunk(btChunk *chunk, const char *structType, int chunkCode, void *oldPtr)=0
virtual void predictMotion(btScalar solverdt)=0
virtual bool checkInitialized()=0
virtual ~btSoftBodySolver()
virtual void updateSoftBodies()=0
virtual void solveConstraints(btScalar solverdt)=0
virtual void optimize(btAlignedObjectArray< btSoftBody * > &softBodies, bool forceUpdate=false)=0
void defaultCollisionHandler(const btCollisionObjectWrapper *pcoWrap)
bool rayTest(const btVector3 &rayFrom, const btVector3 &rayTo, sRayCast &results)
Ray casting using rayFrom and rayTo in worldspace, (not direction!)
void setSoftBodySolver(btSoftBodySolver *softBodySolver)
static void solveClusters(const btAlignedObjectArray< btSoftBody * > &bodies)
static const btSoftBody * upcast(const btCollisionObject *colObj)
virtual void predictUnconstraintMotion(btScalar timeStep)
static void rayTestSingle(const btTransform &rayFromTrans, const btTransform &rayToTrans, btCollisionObject *collisionObject, const btCollisionShape *collisionShape, const btTransform &colObjWorldTransform, RayResultCallback &resultCallback)
void removeSoftBody(btSoftBody *body)
virtual void internalSingleStepSimulation(btScalar timeStep)
virtual void debugDrawWorld()
virtual void serialize(btSerializer *serializer)
virtual ~btSoftMultiBodyDynamicsWorld()
void solveSoftBodiesConstraints(btScalar timeStep)
btSoftBodyArray & getSoftBodyArray()
virtual void removeCollisionObject(btCollisionObject *collisionObject)
removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise ca...
void addSoftBody(btSoftBody *body, int collisionFilterGroup=btBroadphaseProxy::DefaultFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter)
virtual void rayTest(const btVector3 &rayFromWorld, const btVector3 &rayToWorld, RayResultCallback &resultCallback) const
btSoftMultiBodyDynamicsWorld(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btMultiBodyConstraintSolver *constraintSolver, btCollisionConfiguration *collisionConfiguration, btSoftBodySolver *softBodySolver=0)
void serializeSoftBodies(btSerializer *serializer)
IconTextureDrawCall normal
btVector3 m_rayDirectionInverse
added some cached data to accelerate ray-AABB tests
RayResultCallback is used to report new raycast results.
btScalar m_closestHitFraction
virtual bool needsCollision(btBroadphaseProxy *proxy0) const
static void DrawNodeTree(btSoftBody *psb, btIDebugDraw *idraw, int mindepth=0, int maxdepth=-1)
static void DrawFaceTree(btSoftBody *psb, btIDebugDraw *idraw, int mindepth=0, int maxdepth=-1)
static void DrawClusterTree(btSoftBody *psb, btIDebugDraw *idraw, int mindepth=0, int maxdepth=-1)
static void Draw(btSoftBody *psb, btIDebugDraw *idraw, int drawflags=fDrawFlags::Std)
static void DrawFrame(btSoftBody *psb, btIDebugDraw *idraw)
btDispatcher * m_dispatcher
btSparseSdf< 3 > m_sparsesdf
btBroadphaseInterface * m_broadphase
eFeature::_ feature
soft body
btScalar fraction
feature index
btTransform m_rayFromTrans
const btSoftMultiBodyDynamicsWorld * m_world
btSoftSingleRayCallback(const btVector3 &rayFromWorld, const btVector3 &rayToWorld, const btSoftMultiBodyDynamicsWorld *world, btCollisionWorld::RayResultCallback &resultCallback)
btCollisionWorld::RayResultCallback & m_resultCallback
virtual bool process(const btBroadphaseProxy *proxy)
void Initialize(int hashsize=2383, int clampCells=256 *1024)