17#ifndef _BT_SOFT_BODY_INTERNALS_H
18#define _BT_SOFT_BODY_INTERNALS_H
69 if (std::abs(
x43.dot(normal)) > mrg)
86 for (
int i = 0; i < 3; ++i)
236static SIMD_FORCE_INLINE void polyDecomposition(
const btScalar&
k0,
const btScalar&
k1,
const btScalar&
k2,
const btScalar&
k3,
const btScalar&
j0,
const btScalar&
j1,
const btScalar&
j2,
btScalar&
u0,
btScalar&
u1,
btScalar& v0,
btScalar& v1)
251 polyDecomposition(
k0,
k1,
k2,
k3,
j0,
j1,
j2,
u0,
u1, v0, v1);
254 btScalar Ypa =
j0 * (1.0 - v0) * (1.0 - v0) + 2.0 *
j1 * v0 * (1.0 - v0) +
j2 * v0 * v0;
263static SIMD_FORCE_INLINE void getJs(
const btScalar&
k0,
const btScalar&
k1,
const btScalar&
k2,
const btScalar&
k3,
const btSoftBody::Node* a,
const btSoftBody::Node* b,
const btSoftBody::Node* c,
const btSoftBody::Node* p,
const btScalar& dt,
btScalar&
j0,
btScalar&
j1,
btScalar&
j2)
306 btScalar Yv0 =
k0 * (1.0 - v0) * (1.0 - v0) * (1.0 - v0) + 3.0 *
k1 * v0 * (1.0 - v0) * (1.0 - v0) + 3.0 *
k2 * v0 * v0 * (1.0 - v0) +
k3 * v0 * v0 * v0;
315static SIMD_FORCE_INLINE bool signDetermination2Internal(
const btScalar&
k0,
const btScalar&
k1,
const btScalar&
k2,
const btScalar&
k3,
const btScalar&
j0,
const btScalar&
j1,
const btScalar&
j2,
const btScalar&
u0,
const btScalar&
u1,
const btScalar& v0,
const btScalar& v1)
338 btScalar Yv0 =
k0 * (1.0 - v0) * (1.0 - v0) * (1.0 - v0) + 3.0 *
k1 * v0 * (1.0 - v0) * (1.0 - v0) + 3.0 *
k2 * v0 * v0 * (1.0 - v0) +
k3 * v0 * v0 * v0;
367 getJs(
k0,
k1,
k2,
k3, face->
m_n[0], face->
m_n[1], face->
m_n[2], node, dt,
j0,
j1,
j2);
377 polyDecomposition(
k0,
k1,
k2,
k3,
j0,
j1,
j2,
u0,
u1, v0, v1);
382 getJs(
k0,
k1,
k2,
k3, face->
m_n[1], face->
m_n[2], face->
m_n[0], node, dt,
j0,
j1,
j2);
392 polyDecomposition(
k0,
k1,
k2,
k3,
j0,
j1,
j2,
u0,
u1, v0, v1);
397 getJs(
k0,
k1,
k2,
k3, face->
m_n[2], face->
m_n[0], face->
m_n[1], node, dt,
j0,
j1,
j2);
407 polyDecomposition(
k0,
k1,
k2,
k3,
j0,
j1,
j2,
u0,
u1, v0, v1);
418 getJs(
k0,
k1,
k2,
k3, face->
m_n[0], face->
m_n[1], face->
m_n[2], node, dt,
j0,
j1,
j2);
422 bool bt0 =
true,
bt1 =
true;
433 polyDecomposition(
k0,
k1,
k2,
k3,
j0,
j1,
j2,
u0,
u1, v0, v1);
434 if (!
signDetermination2Internal(
k0,
k1,
k2,
k3,
j0,
j1,
j2,
u0,
u1, v0, v1))
438 getJs(
k0,
k1,
k2,
k3, face->
m_n[1], face->
m_n[2], face->
m_n[0], node, dt,
j0,
j1,
j2);
442 bool bt0 =
true,
bt1 =
true;
453 polyDecomposition(
k0,
k1,
k2,
k3,
j0,
j1,
j2,
u0,
u1, v0, v1);
454 if (!
signDetermination2Internal(
k0,
k1,
k2,
k3,
j0,
j1,
j2,
u0,
u1, v0, v1))
458 getJs(
k0,
k1,
k2,
k3, face->
m_n[2], face->
m_n[0], face->
m_n[1], node, dt,
j0,
j1,
j2);
462 bool bt0 =
true,
bt1 =
true;
473 polyDecomposition(
k0,
k1,
k2,
k3,
j0,
j1,
j2,
u0,
u1, v0, v1);
474 if (!
signDetermination2Internal(
k0,
k1,
k2,
k3,
j0,
j1,
j2,
u0,
u1, v0, v1))
503 if (
k0 > mrg &&
k1 > mrg &&
k2 > mrg &&
k3 > mrg)
505 if (
k0 < -mrg &&
k1 < -mrg &&
k2 < -mrg &&
k3 < -mrg)
538 return bernsteinVFTest(
k0,
k10,
k20,
k30, mrg, face, node, dt) ||
bernsteinVFTest(
k30,
k21,
k12,
k3, mrg, face, node, dt);
565 if (std::abs(
a3) <
eps)
568 if (std::abs(
a2) <
eps)
570 if (std::abs(
a1) <
eps)
572 if (std::abs(
a0) <
eps)
609 double root =
roots[r];
645 store.resize((n * (n + 1)) / 2, init);
651 return ((r * (r + 1)) / 2 + c);
698 for (
int i = 1; i < 8; ++i)
771 virtual const char*
getName()
const {
return "SOFTCLUSTER"; }
809 return (a + (b - a) *
t);
815 return ((b + a *
t - b *
t) / (a * b));
823 r[0] =
Lerp(a[0], b[0],
t);
824 r[1] =
Lerp(a[1], b[1],
t);
825 r[2] =
Lerp(a[2], b[2],
t);
859 return ((
T)(x < 0 ? -1 : +1));
865 return ((x * y) > 0);
919 for (
int i = 0; i <
ndof; ++i)
970 for (
int i = 0; i < 3; ++i) r[i] = a[i] + b[i];
978 for (
int i = 0; i < 3; ++i) r[i] = a[i] - b[i];
986 for (
int i = 0; i < 3; ++i) r[i] = a[i] * b;
1045 return (a *
btDot(v, a));
1118 if (a > -0.00001 && a < 0.00001)
1177template <
typename T>
1218 if ((
t <= 0) || (
t >= 1))
break;
1241 if (
wfi->water_density > 0)
1328 if ((a ==
ma) && (b ==
mb))
return (0);
1329 if ((a ==
mb) && (b ==
ma))
return (1);
1362 const btScalar w = (a[
q][
q] - a[p][p]) / (2 * a[p][
q]);
1389 const btScalar m[2][3] = {{a[p][0], a[p][1], a[p][2]},
1390 {a[
q][0], a[
q][1], a[
q][2]}};
1393 for (i = 0; i < 3; ++i) a[p][i] = c *
m[0][i] - s *
m[1][i];
1394 for (i = 0; i < 3; ++i) a[
q][i] = c *
m[1][i] + s *
m[0][i];
1398 const btScalar m[2][3] = {{a[0][p], a[1][p], a[2][p]},
1399 {a[0][
q], a[1][
q], a[2][
q]}};
1402 for (i = 0; i < 3; ++i) a[i][p] = c *
m[0][i] - s *
m[1][i];
1403 for (i = 0; i < 3; ++i) a[i][
q] = c *
m[1][i] + s *
m[0][i];
1462 joint.m_refs[0] =
ra *
ba.xform().getBasis();
1463 joint.m_refs[1] =
rb *
bb.xform().getBasis();
1469 joint.m_maxlife = 0;
1474 joint.m_normal = norm;
1476 joint.m_delete =
false;
1479 bb.invMass(),
bb.invWorldInertia(),
joint.m_rpos[1]);
1587 static int count = 0;
1878 for (
int i = 0; i < 3; ++i)
1880 if (face->
m_n[i] == node)
1898 if ((n[0]->m_im <= 0) ||
1899 (n[1]->m_im <= 0) ||
1941 if ((n[0]->m_im <= 0) ||
1942 (n[1]->m_im <= 0) ||
1992#ifndef REPEL_NEIGHBOR
1996 for (
int i = 0; i < 3; ++i)
1998 if (
f2->m_n[i] == node)
2007#ifdef REPEL_NEIGHBOR
2008 for (
int i = 0; i < 3; ++i)
2010 if (
f2->m_n[i] == node)
2089#ifndef REPEL_NEIGHBOR
2093 for (
int i = 0; i < 3; ++i)
2095 if (
f2->m_n[i] == node)
2104#ifdef REPEL_NEIGHBOR
2105 for (
int i = 0; i < 3; ++i)
2107 if (
f2->m_n[i] == node)
#define btAlignedAlloc(size, alignment)
@ SOFTBODY_SHAPE_PROXYTYPE
const T & btMax(const T &a, const T &b)
const T & btMin(const T &a, const T &b)
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
btQuaternion inverse(const btQuaternion &q)
Return the inverse of a quaternion.
btScalar length(const btQuaternion &q)
Return the length of a quaternion.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
#define ATTRIBUTE_ALIGNED16(a)
btScalar btSqrt(btScalar y)
btScalar btFabs(btScalar x)
#define SIMD_FORCE_INLINE
static btVector3 ProjectOnAxis(const btVector3 &v, const btVector3 &a)
static bool bernsteinCCD(const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt, const btScalar &mrg, btVector3 &bary)
static bool nearZero(const btScalar &a)
static void deCasteljau(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btScalar &t0, btScalar &k10, btScalar &k20, btScalar &k30, btScalar &k21, btScalar &k12)
static bool CompGreater(const T &a, const T &b)
static bool getSigns(bool type_c, const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btScalar &t0, const btScalar &t1, btScalar <0, btScalar <1)
static btMatrix3x3 OuterProduct(const btScalar *v1, const btScalar *v2, const btScalar *v3, const btScalar *u1, const btScalar *u2, const btScalar *u3, int ndof)
static btMatrix3x3 Mul(const btMatrix3x3 &a, btScalar b)
static btScalar ImplicitSolve(btSoftBody::ImplicitFn *fn, const btVector3 &a, const btVector3 &b, const btScalar accuracy, const int maxiterations=256)
static void Orthogonalize(btMatrix3x3 &m)
static bool sameSign(const btScalar &a, const btScalar &b)
static btMatrix3x3 Cross(const btVector3 &v)
static btMatrix3x3 MassMatrix(btScalar im, const btMatrix3x3 &iwi, const btVector3 &r)
static btDbvtVolume VolumeOf(const btSoftBody::Face &f, btScalar margin)
static T Lerp(const T &a, const T &b, btScalar t)
static btMatrix3x3 AngularImpulseMatrix(const btMatrix3x3 &iia, const btMatrix3x3 &iib)
static bool continuousCollisionDetection(const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt, const btScalar &mrg, btVector3 &bary)
static bool hasSeparatingPlane(const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt)
static btScalar AreaOf(const btVector3 &x0, const btVector3 &x1, const btVector3 &x2)
static btVector3 generateUnitOrthogonalVector(const btVector3 &u)
static btVector3 NormalizeAny(const btVector3 &v)
static int PolarDecompose(const btMatrix3x3 &m, btMatrix3x3 &q, btMatrix3x3 &s)
static bool lineIntersectsTriangle(const btVector3 &rayStart, const btVector3 &rayEnd, const btVector3 &p1, const btVector3 &p2, const btVector3 &p3, btVector3 §, btVector3 &normal)
static int MatchEdge(const btSoftBody::Node *a, const btSoftBody::Node *b, const btSoftBody::Node *ma, const btSoftBody::Node *mb)
static const int KDOP_COUNT
static void findJacobian(const btMultiBodyLinkCollider *multibodyLinkCol, btMultiBodyJacobianData &jacobianData, const btVector3 &contact_point, const btVector3 &dir)
btSoftBody implementation by Nathanael Presson
static bool CompLess(const T &a, const T &b)
static T BaryEval(const T &a, const T &b, const T &c, const btVector3 &coord)
static btVector3 CenterOf(const btSoftBody::Face &f)
static int getSign(const btVector3 &n, const btVector3 &x)
static bool SameSign(const T &x, const T &y)
static void EvaluateMedium(const btSoftBodyWorldInfo *wfi, const btVector3 &x, btSoftBody::sMedium &medium)
btScalar evaluateBezier2(const btScalar &p0, const btScalar &p1, const btScalar &p2, const btScalar &t, const btScalar &s)
static btVector3 BaryCoord(const btVector3 &a, const btVector3 &b, const btVector3 &c, const btVector3 &p)
static bool rootFindingLemma(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3)
static bool signDetermination1Internal(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btScalar &u0, const btScalar &u1, const btScalar &v0, const btScalar &v1)
static bool diffSign(const btScalar &a, const btScalar &b)
static bool signDetermination1(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt)
static btMatrix3x3 ScaleAlongAxis(const btVector3 &a, btScalar s)
static bool proximityTest(const btVector3 &x1, const btVector3 &x2, const btVector3 &x3, const btVector3 &x4, const btVector3 &normal, const btScalar &mrg, btVector3 &bary)
static void ZeroInitialize(T &value)
static btMatrix3x3 Add(const btMatrix3x3 &a, const btMatrix3x3 &b)
static T InvLerp(const T &a, const T &b, btScalar t)
static bool coplanarAndInsideTest(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt)
static btVector3 ProjectOnPlane(const btVector3 &v, const btVector3 &a)
static btVector3 dop[KDOP_COUNT]
static btScalar ClusterMetric(const btVector3 &x, const btVector3 &y)
static bool signDetermination2(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt)
static void getBernsteinCoeff(const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt, btScalar &k0, btScalar &k1, btScalar &k2, btScalar &k3)
static void polyDecomposition(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btScalar &j0, const btScalar &j1, const btScalar &j2, btScalar &u0, btScalar &u1, btScalar &v0, btScalar &v1)
static bool conservativeCulling(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btScalar &mrg)
static btMatrix3x3 ImpulseMatrix(btScalar dt, btScalar ima, btScalar imb, const btMatrix3x3 &iwi, const btVector3 &r)
static void ApplyClampedForce(btSoftBody::Node &n, const btVector3 &f, btScalar dt)
static bool rayIntersectsTriangle(const btVector3 &origin, const btVector3 &dir, const btVector3 &v0, const btVector3 &v1, const btVector3 &v2, btScalar &t)
static void ProjectOrigin(const btVector3 &a, const btVector3 &b, btVector3 &prj, btScalar &sqd)
static btScalar Dot(const btScalar *a, const btScalar *b, int ndof)
static btMatrix3x3 Sub(const btMatrix3x3 &a, const btMatrix3x3 &b)
static T Sign(const T &x)
static btVector3 Clamp(const btVector3 &v, btScalar maxlength)
btScalar evaluateBezier(const btScalar &p0, const btScalar &p1, const btScalar &p2, const btScalar &p3, const btScalar &t, const btScalar &s)
static bool signDetermination2Internal(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btScalar &j0, const btScalar &j1, const btScalar &j2, const btScalar &u0, const btScalar &u1, const btScalar &v0, const btScalar &v1)
static void getJs(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btSoftBody::Node *a, const btSoftBody::Node *b, const btSoftBody::Node *c, const btSoftBody::Node *p, const btScalar &dt, btScalar &j0, btScalar &j1, btScalar &j2)
static bool bernsteinVFTest(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btScalar &mrg, const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt)
static btMatrix3x3 Diagonal(btScalar x)
static T Cube(const T &x)
btScalar btDot(const btVector3 &v1, const btVector3 &v2)
Return the dot product between two vectors.
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 push_back(const T &_Val)
bool isStaticOrKinematicObject() const
btTransform & getWorldTransform()
void activate(bool forceActivation=false) const
btScalar getFriction() const
const btCollisionShape * getCollisionShape() const
virtual btScalar getMargin() const =0
The btConcaveShape class provides an interface for non-moving (static) concave shapes.
The btConvexInternalShape is an internal base class, shared by most convex shape implementations.
virtual void setMargin(btScalar margin)
virtual btScalar getMargin() const
The btConvexShape is an abstract shape interface, implemented by all convex shapes such as btBoxShape...
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
btMatrix3x3 transpose() const
Return the transpose of the matrix.
void setIdentity()
Set the matrix to the identity.
static btMultiBodyLinkCollider * upcast(btCollisionObject *colObj)
This class is used to compute the polar decomposition of a matrix.
unsigned int decompose(const btMatrix3x3 &a, btMatrix3x3 &u, btMatrix3x3 &h) const
Decomposes a matrix into orthogonal and symmetric, positive-definite parts.
The btRigidBody is the main class for rigid body objects.
btVector3 getVelocityInLocalPoint(const btVector3 &rel_pos) const
btScalar getInvMass() const
const btMatrix3x3 & getInvInertiaTensorWorld() const
virtual void calculateLocalInertia(btScalar, btVector3 &) const
void processAllTriangles(btTriangleCallback *, const btVector3 &, const btVector3 &) const
virtual void setLocalScaling(const btVector3 &)
virtual const char * getName() const
virtual const btVector3 & getLocalScaling() const
btSoftBodyCollisionShape(btSoftBody *backptr)
virtual void getAabb(const btTransform &t, btVector3 &aabbMin, btVector3 &aabbMax) const
getAabb returns the axis aligned bounding box in the coordinate frame of the given transform t.
virtual ~btSoftBodyCollisionShape()
btMultiBodyJacobianData jacobianData_t1
btMultiBodyJacobianData jacobianData_normal
btMultiBodyJacobianData jacobianData_t2
The btSoftBody is an class to simulate cloth and volumetric soft bodies.
btAlignedObjectArray< bool > m_clusterConnectivity
btAlignedObjectArray< DeformableFaceNodeContact > m_faceNodeContactsCCD
btAlignedObjectArray< DeformableFaceNodeContact > m_faceNodeContacts
bool checkDeformableContact(const btCollisionObjectWrapper *colObjWrap, const btVector3 &x, btScalar margin, btSoftBody::sCti &cti, bool predict=false) const
tRContactArray m_rcontacts
btAlignedObjectArray< DeformableFaceRigidContact > m_faceRigidContacts
bool checkDeformableFaceContact(const btCollisionObjectWrapper *colObjWrap, Face &f, btVector3 &contact_point, btVector3 &bary, btScalar margin, btSoftBody::sCti &cti, bool predict=false) const
btAlignedObjectArray< DeformableNodeRigidContact > m_nodeRigidContacts
tSContactArray m_scontacts
bool checkContact(const btCollisionObjectWrapper *colObjWrap, const btVector3 &x, btScalar margin, btSoftBody::sCti &cti) const
virtual void setMargin(btScalar margin)
virtual void getAabb(const btTransform &t, btVector3 &aabbMin, btVector3 &aabbMax) const
getAabb's default implementation is brute force, expected derived classes to implement a fast dedicat...
btSoftClusterCollisionShape(const btSoftBody::Cluster *cluster)
virtual int getShapeType() const
virtual void calculateLocalInertia(btScalar mass, btVector3 &inertia) const
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3 &vec) const
virtual btScalar getMargin() const
const btSoftBody::Cluster * m_cluster
virtual btVector3 localGetSupportingVertex(const btVector3 &vec) const
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3 *vectors, btVector3 *supportVerticesOut, int numVectors) const
virtual const char * getName() const
The btTriangleCallback provides a callback for each overlapping triangle when calling processAllTrian...
btVector3 can be used to represent 3D points and vectors.
const btScalar & getZ() const
Return the z value.
const btScalar & z() const
Return the z value.
btVector3 & safeNormalize()
btScalar length() const
Return the length of the vector.
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
btScalar dot(const btVector3 &v) const
Return the dot product.
btScalar norm() const
Return the norm (length) of the vector.
btVector3 normalized() const
Return a normalized version of this vector.
btScalar length2() const
Return the length of the vector squared.
const btScalar & getY() const
Return the y value.
const btScalar & x() const
Return the x value.
void setMin(const btVector3 &other)
Set each element to the min of the current values and the values of another btVector3.
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
const btScalar & getX() const
Return the x value.
const btScalar & y() const
Return the y value.
int SolveP3(btScalar *x, btScalar a, btScalar b, btScalar c)
int SolveP2(btScalar *x, btScalar a, btScalar b)
const btCollisionShape * getCollisionShape() const
const btCollisionObject * getCollisionObject() const
const btTransform & getWorldTransform() const
static btDbvtAabbMm FromMM(const btVector3 &mi, const btVector3 &mx)
static btDbvtAabbMm FromPoints(const btVector3 *pts, int n)
DBVT_PREFIX void collideTV(const btDbvtNode *root, const btDbvtVolume &volume, DBVT_IPOLICY) const
DBVT_PREFIX void collideTT(const btDbvtNode *root0, const btDbvtNode *root1, DBVT_IPOLICY)
static void mulPQ(btMatrix3x3 &a, btScalar c, btScalar s, int p, int q)
static int system(btMatrix3x3 &a, btMatrix3x3 *vectors, btVector3 *values=0)
static void mulTPQ(btMatrix3x3 &a, btScalar c, btScalar s, int p, int q)
static btScalar SignedDistance(const btVector3 &position, btScalar margin, const btConvexShape *shape, const btTransform &wtrs, sResults &results)
btAlignedObjectArray< btScalar > m_deltaVelocitiesUnitImpulse
btAlignedObjectArray< btScalar > m_jacobians
btAlignedObjectArray< Node * > m_nodes
const btCollisionObject * m_colObj
btMatrix3x3 m_effectiveMass_inv
bool SolveContact(const btGjkEpaSolver2::sResults &res, btSoftBody::Body ba, const btSoftBody::Body bb, btSoftBody::CJoint &joint)
void Process(const btDbvtNode *lnode, const btDbvtNode *lface)
void Repel(btSoftBody::Face *f1, btSoftBody::Face *f2)
void Process(const btDbvntNode *lface1, const btDbvntNode *lface2)
void Process(const btDbvtNode *leaf)
void ProcessColObj(btSoftBody *ps, const btCollisionObjectWrapper *colObWrap)
const btCollisionObjectWrapper * m_colObjWrap
void Process(const btDbvtNode *la, const btDbvtNode *lb)
void ProcessSoftSoft(btSoftBody *psa, btSoftBody *psb)
void Repel(btSoftBody::Face *f1, btSoftBody::Face *f2)
void Process(const btDbvntNode *lface1, const btDbvntNode *lface2)
void DoNode(btSoftBody::Face &f) const
void Process(const btDbvtNode *leaf)
btRigidBody * m_rigidBody
const btCollisionObjectWrapper * m_colObj1Wrap
btRigidBody * m_rigidBody
void Process(const btDbvtNode *leaf)
const btCollisionObjectWrapper * m_colObj1Wrap
void DoNode(btSoftBody::Node &n) const
void DoNode(btSoftBody::Node &n) const
void Process(const btDbvtNode *leaf)
btRigidBody * m_rigidBody
const btCollisionObjectWrapper * m_colObj1Wrap
void Process(const btDbvtNode *lnode, const btDbvtNode *lface)
void Process(const btDbvtNode *lnode, const btDbvtNode *lface)
int index(int c, int r) const
T & operator()(int c, int r)
btAlignedObjectArray< T > store
void resize(int n, const T &init=T())
btSymMatrix(int n, const T &init=T())
const T & operator()(int c, int r) const