32 m_softBodySolver(softBodySolver),
35 if (!m_softBodySolver)
43 m_drawNodeTree =
true;
44 m_drawFaceTree =
false;
45 m_drawClusterTree =
false;
46 m_sbi.m_broadphase = pairCache;
47 m_sbi.m_dispatcher = dispatcher;
48 m_sbi.m_sparsesdf.Initialize();
49 m_sbi.m_sparsesdf.Reset();
52 m_sbi.water_density = 0;
53 m_sbi.water_offset = 0;
55 m_sbi.m_gravity.setValue(0, -10, 0);
57 m_sbi.m_sparsesdf.Initialize();
64 m_softBodySolver->~btSoftBodySolver();
71 btDiscreteDynamicsWorld::predictUnconstraintMotion(timeStep);
73 BT_PROFILE(
"predictUnconstraintMotionSoftBody");
74 m_softBodySolver->predictMotion(
float(timeStep));
83 if (!m_softBodySolver->checkInitialized())
85 btAssert(
"Solver initialization failed\n");
88 btDiscreteDynamicsWorld::internalSingleStepSimulation(timeStep);
94 for (
int i = 0;
i < m_softBodies.size();
i++)
101 m_softBodySolver->updateSoftBodies();
111 if (m_softBodies.size())
117 m_softBodySolver->solveConstraints(timeStep * m_softBodySolver->getTimeScale());
122 m_softBodies.push_back(body);
129 collisionFilterGroup,
130 collisionFilterMask);
135 m_softBodies.remove(body);
146 btDiscreteDynamicsWorld::removeCollisionObject(collisionObject);
151 btDiscreteDynamicsWorld::debugDrawWorld();
153 if (getDebugDrawer())
156 for (
i = 0;
i < this->m_softBodies.size();
i++)
197 btVector3 rayDir = (rayToWorld - rayFromWorld);
220 if (
m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
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++)
323 if (colObj->getInternalType() & btCollisionObject::CO_SOFT_BODY)
325 int len = colObj->calculateSerializeBufferSize();
327 const char* structType = colObj->serialize(chunk->
m_oldPtr, serializer);
343 serializeCollisionObjects(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)
btDiscreteDynamicsWorld(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btConstraintSolver *constraintSolver, btCollisionConfiguration *collisionConfiguration)
this btDiscreteDynamicsWorld constructor gets created objects from the user, and will not delete thos...
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...
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 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
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)
void serializeSoftBodies(btSerializer *serializer)
void removeSoftBody(btSoftBody *body)
virtual void debugDrawWorld()
virtual ~btSoftRigidDynamicsWorld()
btSoftBodyArray & getSoftBodyArray()
void addSoftBody(btSoftBody *body, int collisionFilterGroup=btBroadphaseProxy::DefaultFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter)
virtual void rayTest(const btVector3 &rayFromWorld, const btVector3 &rayToWorld, RayResultCallback &resultCallback) const
static void rayTestSingle(const btTransform &rayFromTrans, const btTransform &rayToTrans, btCollisionObject *collisionObject, const btCollisionShape *collisionShape, const btTransform &colObjWorldTransform, RayResultCallback &resultCallback)
virtual void predictUnconstraintMotion(btScalar timeStep)
virtual void serialize(btSerializer *serializer)
virtual void internalSingleStepSimulation(btScalar timeStep)
btSoftRigidDynamicsWorld(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btConstraintSolver *constraintSolver, btCollisionConfiguration *collisionConfiguration, btSoftBodySolver *softBodySolver=0)
virtual void removeCollisionObject(btCollisionObject *collisionObject)
removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise ca...
void solveSoftBodiesConstraints(btScalar timeStep)
btVector3 m_rayDirectionInverse
added some cached data to accelerate ray-AABB tests
RayResultCallback is used to report new raycast results.
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)
eFeature::_ feature
soft body
btScalar fraction
feature index
btTransform m_rayFromTrans
const btSoftMultiBodyDynamicsWorld * m_world
btCollisionWorld::RayResultCallback & m_resultCallback
virtual bool process(const btBroadphaseProxy *proxy)
btSoftSingleRayCallback(const btVector3 &rayFromWorld, const btVector3 &rayToWorld, const btSoftRigidDynamicsWorld *world, btCollisionWorld::RayResultCallback &resultCallback)