51 m_sbi.m_broadphase = pairCache;
52 m_sbi.m_dispatcher = dispatcher;
53 m_sbi.m_sparsesdf.Initialize();
54 m_sbi.m_sparsesdf.setDefaultVoxelsz(0.005);
55 m_sbi.m_sparsesdf.Reset();
58 m_sbi.water_density = 0;
59 m_sbi.water_offset = 0;
61 m_sbi.m_gravity.setValue(0, -9.8, 0);
80 (*m_internalPreTickCallback)(
this, timeStep);
165 BT_PROFILE(
"btDeformableMultiBodyDynamicsWorld::applyRepulsionForce");
178 BT_PROFILE(
"btDeformableMultiBodyDynamicsWorld::performGeometricCollisions");
187 for (
int j = 0; j <
m_softBodies[i]->m_faces.size(); ++j)
234 int penetration_count = 0;
243 if (penetration_count == 0)
262 BT_PROFILE(
"btDeformableMultiBodyDynamicsWorld::softBodySelfCollision");
285 if (pushVelocity[0] != 0.f || pushVelocity[1] != 0 || pushVelocity[2] != 0 || turnVelocity[0] != 0.f || turnVelocity[1] != 0 || turnVelocity[2] != 0)
307 btScalar clampDeltaV = maxDisplacement / timeStep;
308 for (
int c = 0; c < 3; c++)
310 if (node.
m_v[c] > clampDeltaV)
312 node.
m_v[c] = clampDeltaV;
314 if (node.
m_v[c] < -clampDeltaV)
316 node.
m_v[c] = -clampDeltaV;
334 if (multibodyLinkCol)
381 BT_PROFILE(
"btDeformableMultiBodyDynamicsWorld::solveConstraints");
458 bool isSleeping =
false;
483 bool isConstraintPass =
true;
510 collisionFilterGroup,
511 collisionFilterMask);
582 bool isSleeping =
false;
599 bool isConstraintPass =
false;
610 btAssert(
" RK4Integration is not supported");
637 bool isSleeping =
false;
665 (*m_internalTickCallback)(
this, timeStep);
686 for (
int i = 0; i < forces.
size(); ++i)
690 forces[i]->addSoftBody(psb);
706 int removed_index = -1;
707 for (
int i = 0; i < forces.
size(); ++i)
711 forces[i]->removeSoftBody(psb);
717 if (removed_index >= 0)
724 for (
int i = 0; i < forces.
size(); ++i)
726 forces[i]->removeSoftBody(psb);
752 int numSimulationSubSteps = 0;
761 numSimulationSubSteps = int(
m_localTime / fixedTimeStep);
762 m_localTime -= numSimulationSubSteps * fixedTimeStep;
768 fixedTimeStep = timeStep;
773 numSimulationSubSteps = 0;
778 numSimulationSubSteps = 1;
789 if (numSimulationSubSteps)
792 int clampedSimulationSteps = (numSimulationSubSteps > maxSubSteps) ? maxSubSteps : numSimulationSubSteps;
796 for (
int i = 0; i < clampedSimulationSteps; i++)
810 CProfileManager::Increment_Frame_Counter();
813 return numSimulationSubSteps;
#define DISABLE_DEACTIVATION
#define WANTS_DEACTIVATION
btQuaternion inverse(const btQuaternion &q)
Return the inverse of a quaternion.
bool gDisableDeactivation
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
bool btFuzzyZero(btScalar x)
static btMatrix3x3 OuterProduct(const btScalar *v1, const btScalar *v2, const btScalar *v3, const btScalar *u1, const btScalar *u2, const btScalar *u3, int ndof)
static btVector3 generateUnitOrthogonalVector(const btVector3 &u)
static void findJacobian(const btMultiBodyLinkCollider *multibodyLinkCol, btMultiBodyJacobianData &jacobianData, const btVector3 &contact_point, const btVector3 &dir)
btSoftBody implementation by Nathanael Presson
static btMatrix3x3 Diagonal(btScalar x)
btVector3 btCross(const btVector3 &v1, const btVector3 &v2)
Return the cross product of two vectors.
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
int size() const
return the number of elements in the array
void removeAtIndex(int index)
void push_back(const T &_Val)
The btBroadphaseInterface class provides an interface to detect aabb-overlapping object pairs.
btCollisionConfiguration allows to configure Bullet collision detection stack allocator size,...
btCollisionObject can be used to manage collision detection objects.
btTransform & getWorldTransform()
int getInternalType() const
reserved for Bullet internal usage
void setActivationState(int newState) const
void setWorldTransform(const btTransform &worldTrans)
const btCollisionShape * getCollisionShape() const
int getActivationState() const
The btCollisionShape class provides an interface for collision shapes that can be shared among btColl...
btDispatcher * getDispatcher()
btDispatcherInfo & getDispatchInfo()
virtual btIDebugDraw * getDebugDrawer()
virtual void removeCollisionObject(btCollisionObject *collisionObject)
virtual void addCollisionObject(btCollisionObject *collisionObject, int collisionFilterGroup=btBroadphaseProxy::DefaultFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter)
virtual void performDiscreteCollisionDetection()
btIDebugDraw * m_debugDrawer
void applyRigidBodyGravity(btScalar timeStep)
btDeformableMultiBodyDynamicsWorld(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btDeformableMultiBodyConstraintSolver *constraintSolver, btCollisionConfiguration *collisionConfiguration, btDeformableBodySolver *deformableBodySolver=0)
void removeCollisionObject(btCollisionObject *collisionObject)
removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise ca...
virtual void addSoftBody(btSoftBody *body, int collisionFilterGroup=btBroadphaseProxy::DefaultFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter)
void removeSoftBodyForce(btSoftBody *psb)
void removeSoftBody(btSoftBody *body)
void reinitialize(btScalar timeStep)
void positionCorrection(btScalar timeStep)
virtual void predictUnconstraintMotion(btScalar timeStep)
void afterSolverCallbacks(btScalar timeStep)
void applyRepulsionForce(btScalar timeStep)
virtual void debugDrawWorld()
void solveConstraints(btScalar timeStep)
void addForce(btSoftBody *psb, btDeformableLagrangianForce *force)
void softBodySelfCollision()
btSolverCallback m_solverCallback
void performGeometricCollisions(btScalar timeStep)
virtual void integrateTransforms(btScalar timeStep)
void removeForce(btSoftBody *psb, btDeformableLagrangianForce *force)
btSoftBodyWorldInfo m_sbi
virtual void internalSingleStepSimulation(btScalar timeStep)
void updateActivationState(btScalar timeStep)
virtual ~btDeformableMultiBodyDynamicsWorld()
void solveContactConstraints()
virtual int stepSimulation(btScalar timeStep, int maxSubSteps=1, btScalar fixedTimeStep=btScalar(1.)/btScalar(60.))
if maxSubSteps > 0, it will interpolate motion between fixedTimeStep's
btSoftBodyArray m_softBodies
DeformableBodyInplaceSolverIslandCallback * m_solverDeformableBodyIslandCallback
btSoftBodyArray & getSoftBodyArray()
void beforeSolverCallbacks(btScalar timeStep)
void performDeformableCollisionDetection()
btDeformableBodySolver * m_deformableBodySolver
Solver classes that encapsulate multiple deformable bodies for solving.
void updateActions(btScalar timeStep)
bool m_latencyMotionStateInterpolation
btAlignedObjectArray< btTypedConstraint * > m_sortedConstraints
virtual void synchronizeMotionStates()
btSimulationIslandManager * m_islandManager
btAlignedObjectArray< btTypedConstraint * > m_constraints
btAlignedObjectArray< btRigidBody * > m_nonStaticRigidBodies
virtual int getNumConstraints() const
virtual void removeCollisionObject(btCollisionObject *collisionObject)
removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise ca...
btConstraintSolver * m_constraintSolver
btCollisionWorld * getCollisionWorld()
void startProfiling(btScalar timeStep)
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
btContactSolverInfo m_solverInfo
btContactSolverInfo & getSolverInfo()
btInternalTickCallback m_internalTickCallback
btInternalTickCallback m_internalPreTickCallback
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
virtual int getDebugMode() const =0
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
btMatrix3x3 transpose() const
Return the transpose of the matrix.
btAlignedObjectArray< btMultiBodyConstraint * > m_multiBodyConstraints
virtual void clearForces()
the forces on each rigidbody is accumulating together with gravity. clear this after each timestep.
virtual void updateActivationState(btScalar timeStep)
btAlignedObjectArray< btMatrix3x3 > m_scratch_m
btAlignedObjectArray< btVector3 > m_scratch_v
virtual void predictUnconstraintMotion(btScalar timeStep)
virtual void calculateSimulationIslands()
virtual void integrateTransforms(btScalar timeStep)
btAlignedObjectArray< btMultiBody * > m_multiBodies
btAlignedObjectArray< btScalar > m_scratch_r
btAlignedObjectArray< btMultiBodyConstraint * > m_sortedMultiBodyConstraints
btMultiBodyDynamicsWorld(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btMultiBodyConstraintSolver *constraintSolver, btCollisionConfiguration *collisionConfiguration)
virtual void clearMultiBodyConstraintForces()
virtual void saveKinematicState(btScalar timeStep)
virtual void applyGravity()
apply gravity, call this once per timestep
virtual void debugDrawWorld()
static btMultiBodyLinkCollider * upcast(btCollisionObject *colObj)
btMultiBody * m_multiBody
void computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar dt, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m, bool isConstraintPass, bool jointFeedbackInWorldSpace, bool jointFeedbackInJointFrame)
const btMultibodyLink & getLink(int index) const
btScalar getLinkMass(int i) const
void addLinkForce(int i, const btVector3 &f)
void processDeltaVeeMultiDof2()
bool isUsingRK4Integration() const
const btMultiBodyLinkCollider * getBaseCollider() const
bool internalNeedsJointFeedback() const
btScalar getBaseMass() const
void addBaseForce(const btVector3 &f)
The btRigidBody is the main class for rigid body objects.
void integrateVelocities(btScalar step)
void setTurnVelocity(const btVector3 &v)
void setPushVelocity(const btVector3 &v)
btVector3 getPushVelocity() const
btVector3 getTurnVelocity() const
btMultiBodyJacobianData jacobianData_t1
btMultiBodyJacobianData jacobianData_normal
btMultiBodyJacobianData jacobianData_t2
The btSoftBody is an class to simulate cloth and volumetric soft bodies.
void interpolateRenderMesh()
void defaultCollisionHandler(const btCollisionObjectWrapper *pcoWrap)
btSoftBodyWorldInfo * m_worldInfo
void setSoftBodySolver(btSoftBodySolver *softBodySolver)
btAlignedObjectArray< DeformableFaceNodeContact > m_faceNodeContacts
void updateDeactivation(btScalar timeStep)
void applyRepulsionForce(btScalar timeStep, bool applySpringForce)
btAlignedObjectArray< DeformableNodeRigidAnchor > m_deformableAnchors
btSoftBodyWorldInfo * getWorldInfo()
static const btSoftBody * upcast(const btCollisionObject *colObj)
TypedConstraint is the baseclass for Bullet constraints and vehicles.
btVector3 can be used to represent 3D points and vectors.
const btScalar & getZ() const
Return the z value.
const btScalar & getY() const
Return the y value.
const btScalar & getX() const
Return the x value.
class btIDebugDraw * m_debugDraw
btAlignedObjectArray< btScalar > m_deltaVelocitiesUnitImpulse
btAlignedObjectArray< btScalar > m_jacobians
class btMultiBodyLinkCollider * m_collider
static void Draw(btSoftBody *psb, btIDebugDraw *idraw, int drawflags=fDrawFlags::Std)
static void DrawFrame(btSoftBody *psb, btIDebugDraw *idraw)
btSparseSdf< 3 > m_sparsesdf
btScalar m_maxDisplacement
const btCollisionObject * m_colObj
btScalar Evaluate(const btVector3 &x, const btCollisionShape *shape, btVector3 &normal, btScalar margin)