17#ifndef _BT_SOFT_BODY_INTERNALS_H
18#define _BT_SOFT_BODY_INTERNALS_H
56 if (ax <= ay && ax <= az)
58 else if (ay <= ax && ay <= az)
69 if (std::abs(x43.
dot(normal)) > mrg)
78 btScalar det = a11 * a22 - a12 * a12;
81 btScalar w1 = (b1 * a22 - b2 * a12) / det;
82 btScalar w2 = (b2 * a11 - b1 * a12) / det;
86 for (
int i = 0; i < 3; ++i)
88 if (bary[i] < -delta || bary[i] > 1 + delta)
159 return p0 * s2 + p1 *
btScalar(2.0) * s * t + p2 * t2;
168 return p0 * s3 + p1 *
btScalar(3.0) * s2 * t + p2 *
btScalar(3.0) * s * t2 + p3 * t3;
230 k0 = (p0ma0).
dot(n0) * 3.0;
231 k1 = (p0ma0).
dot(n_hat) + (p1ma1).
dot(n0);
232 k2 = (p1ma1).
dot(n_hat) + (p0ma0).
dot(n1);
233 k3 = (p1ma1).
dot(n1) * 3.0;
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)
238 btScalar denom = 4.0 * (j1 - j2) * (j1 - j0) + (j2 - j0) * (j2 - j0);
239 u0 = (2.0 * (j1 - j2) * (3.0 * k1 - 2.0 * k0 - k3) - (j0 - j2) * (3.0 * k2 - 2.0 * k3 - k0)) / denom;
240 u1 = (2.0 * (j1 - j0) * (3.0 * k2 - 2.0 * k3 - k0) - (j2 - j0) * (3.0 * k1 - 2.0 * k0 - k3)) / denom;
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)
276 btVector3 n_hat = n0 + n1 - dt * dt * (vb - va).cross(vc - va);
282 btVector3 m_hat = m0 + m1 - dt * dt * (vb - vp).cross(vc - vp);
289 btScalar k1p = 0.25 * k0 + 0.75 * k1;
291 btScalar k3p = 0.75 * k2 + 0.25 * k3;
293 btScalar s0 = (l1 * k0 - l0 * k1p) * 4.0;
294 btScalar s1 = (l2 * k0 - l0 * k2p) * 2.0;
298 j0 = (s1 * k0 - s0 * k1) * 3.0;
299 j1 = (s2 * k0 - s0 * k2) * 1.5;
300 j2 = (s3 * k0 - s0 * k3);
305 btScalar Yu0 = k0 * (1.0 - u0) * (1.0 - u0) * (1.0 - u0) + 3.0 * k1 * u0 * (1.0 - u0) * (1.0 - u0) + 3.0 * k2 * u0 * u0 * (1.0 - u0) + k3 * u0 * u0 * u0;
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;
308 btScalar sign_Ytp = (u0 > u1) ? Yu0 : -Yu0;
310 sign_Ytp = (v0 > v1) ? Yv0 : -Yv0;
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)
317 btScalar Yu0 = k0 * (1.0 - u0) * (1.0 - u0) * (1.0 - u0) + 3.0 * k1 * u0 * (1.0 - u0) * (1.0 - u0) + 3.0 * k2 * u0 * u0 * (1.0 - u0) + k3 * u0 * u0 * u0;
318 btScalar sign_Ytp = (u0 > u1) ? Yu0 : -Yu0, L1, L2;
326 btScalar Yp_u0 = j0 * (1.0 - u0) * (1.0 - u0) + 2.0 * j1 * (1.0 - u0) * u0 + j2 * u0 * u0;
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;
339 sign_Ytp = (v0 > v1) ? Yv0 : -Yv0;
348 btScalar Yp_v0 = j0 * (1.0 - v0) * (1.0 - v0) + 2.0 * j1 * (1.0 - v0) * v0 + j2 * v0 * v0;
365 btScalar j0, j1, j2, u0, u1, v0, v1;
367 getJs(k0, k1, k2, k3, face->
m_n[0], face->
m_n[1], face->
m_n[2], node, dt, j0, j1, j2);
371 getSigns(
true, k0, k1, k2, k3, j0, j2, lt0, lt1);
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);
386 getSigns(
true, k0, k1, k2, k3, j0, j2, lt0, lt1);
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);
401 getSigns(
true, k0, k1, k2, k3, j0, j2, lt0, lt1);
407 polyDecomposition(k0, k1, k2, k3, j0, j1, j2, u0, u1, v0, v1);
416 btScalar 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;
423 getSigns(
false, k0, k1, k2, k3, j0, j2, lt0, lt1);
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;
443 getSigns(
false, k0, k1, k2, k3, j0, j2, lt0, lt1);
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;
463 getSigns(
false, k0, k1, k2, k3, j0, j2, lt0, lt1);
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)
519 k10 = k0 * (1.0 - t0) + k1 * t0;
520 btScalar k11 = k1 * (1.0 - t0) + k2 * t0;
521 k12 = k2 * (1.0 - t0) + k3 * t0;
522 k20 = k10 * (1.0 - t0) + k11 * t0;
523 k21 = k11 * (1.0 - t0) + k12 * t0;
524 k30 = k20 * (1.0 - t0) + k21 * t0;
533 if (
diffSign(k2 - 2.0 * k1 + k0, k3 - 2.0 * k2 + k1))
536 btScalar t0 = (k2 - 2.0 * k1 + k0) / (k0 - 3.0 * k1 + 3.0 * k2 - k3);
537 deCasteljau(k0, k1, k2, k3, t0, k10, k20, k30, k21, k12);
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)
587 num_roots =
SolveP2(roots, a1 / a2, a0 / a2);
592 num_roots =
SolveP3(roots, a2 / a3, a1 / a3, a0 / a3);
597 if (roots[0] > roots[1])
598 btSwap(roots[0], roots[1]);
602 if (roots[0] > roots[2])
603 btSwap(roots[0], roots[2]);
604 if (roots[1] > roots[2])
605 btSwap(roots[1], roots[2]);
607 for (
int r = 0; r < num_roots; ++r)
609 double root = roots[r];
618 btVector3 normal = (x2 - x1).cross(x3 - x1);
645 store.resize((n * (n + 1)) / 2, init);
651 return ((r * (r + 1)) / 2 + c);
697 aabbMin = aabbMax = crns[0];
698 for (
int i = 1; i < 8; ++i)
771 virtual const char*
getName()
const {
return "SOFTCLUSTER"; }
791 memset(&value, 0,
sizeof(T));
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);
832 if (sql > (maxlength * maxlength))
833 return ((v * maxlength) /
btSqrt(sql));
839static inline T
Clamp(
const T& x,
const T& l,
const T& h)
841 return (x < l ? l : x > h ? h : x);
845static inline T
Sq(
const T& x)
851static inline T
Cube(
const T& x)
857static inline T
Sign(
const T& x)
859 return ((T)(x < 0 ? -1 : +1));
865 return ((x * y) > 0);
883 m[0] =
btVector3(1 - xx + xx * s, xy * s - xy, zx * s - zx);
884 m[1] =
btVector3(xy * s - xy, 1 - yy + yy * s, yz * s - yz);
885 m[2] =
btVector3(zx * s - zx, yz * s - yz, 1 - zz + zz * s);
919 for (
int i = 0; i < ndof; ++i)
920 result += a[i] * b[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));
1064 const btScalar t = Clamp<btScalar>(-
btDot(a, d) / m2, 0, 1);
1118 if (a > -0.00001 && a < 0.00001)
1125 if (u < 0.0 || u > 1.0)
1130 if (v < 0.0 || u + v > 1.0)
1156 sect = rayStart + dir * t;
1177template <
typename T>
1183 return (a * coord.
x() + b * coord.
y() + c * coord.
z());
1194 const btScalar isum = 1 / (w[0] + w[1] + w[2]);
1195 return (
btVector3(w[1] * isum, w[2] * isum, w[0] * isum));
1203 const int maxiterations = 256)
1207 if (values[0] > values[1])
1209 btSwap(span[0], span[1]);
1210 btSwap(values[0], values[1]);
1212 if (values[0] > -accuracy)
return (-1);
1213 if (values[1] < +accuracy)
return (-1);
1214 for (
int i = 0; i < maxiterations; ++i)
1216 const btScalar t =
Lerp(span[0], span[1], values[0] / (values[0] - values[1]));
1218 if ((t <= 0) || (t >= 1))
break;
1219 if (
btFabs(v) < accuracy)
return (t);
1328 if ((a == ma) && (b == mb))
return (0);
1329 if ((a == mb) && (b == ma))
return (1);
1342 static const int maxiterations = 16;
1360 if (
btFabs(a[p][q]) > accuracy)
1362 const btScalar w = (a[q][q] - a[p][p]) / (2 * a[p][q]);
1369 mulPQ(a, c, s, p, q);
1371 mulPQ(v, c, s, p, q);
1378 }
while ((++iterations) < maxiterations);
1381 *values =
btVector3(a[0][0], a[1][1], a[2][2]);
1383 return (iterations);
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];
1559 bool connected =
false;
1572 cla->
m_com - clb->m_com, res))
1587 static int count = 0;
1627 static const btMatrix3x3 iwiStatic(0, 0, 0, 0, 0, 0, 0, 0, 0);
1640 c.
m_c3 = fv.
length2() < (dn * fc * dn * fc) ? 0 : 1 - fc;
1696 static const btMatrix3x3 iwiStatic(0, 0, 0, 0, 0, 0, 0, 0, 0);
1712 if (multibodyLinkCol)
1738 local_impulse_matrix =
OuterProduct(J_n, J_t1, J_t2, u_n, u_t1, u_t2, ndof);
1812 static const btMatrix3x3 iwiStatic(0, 0, 0, 0, 0, 0, 0, 0, 0);
1823 if (multibodyLinkCol)
1829 findJacobian(multibodyLinkCol, jacobianData_normal, contact_point, normal);
1830 findJacobian(multibodyLinkCol, jacobianData_t1, contact_point, t1);
1831 findJacobian(multibodyLinkCol, jacobianData_t2, contact_point, t2);
1878 for (
int i = 0; i < 3; ++i)
1880 if (face->m_n[i] == node)
1888 face->m_n[1]->m_x - o,
1889 face->m_n[2]->m_x - o,
1898 if ((n[0]->m_im <= 0) ||
1899 (n[1]->m_im <= 0) ||
1935 if (
proximityTest(face->m_n[0]->m_x, face->m_n[1]->m_x, face->m_n[2]->m_x, node->
m_x, face->m_normal,
mrg, bary))
1941 if ((n[0]->m_im <= 0) ||
1942 (n[1]->m_im <= 0) ||
1992#ifndef REPEL_NEIGHBOR
1993 for (
int node_id = 0; node_id < 3; ++node_id)
1996 for (
int i = 0; i < 3; ++i)
1998 if (f2->
m_n[i] == node)
2004 for (
int node_id = 0; node_id < 3; ++node_id)
2007#ifdef REPEL_NEIGHBOR
2008 for (
int i = 0; i < 3; ++i)
2010 if (f2->
m_n[i] == node)
2089#ifndef REPEL_NEIGHBOR
2090 for (
int node_id = 0; node_id < 3; ++node_id)
2093 for (
int i = 0; i < 3; ++i)
2095 if (f2->
m_n[i] == node)
2101 for (
int node_id = 0; node_id < 3; ++node_id)
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 resize(int newsize, const T &fillData=T())
void push_back(const T &_Val)
bool isStaticOrKinematicObject() const
btTransform & getWorldTransform()
int getInternalType() const
reserved for Bullet internal usage
void activate(bool forceActivation=false) const
btScalar getFriction() const
const btCollisionShape * getCollisionShape() const
virtual btScalar getMargin() const =0
virtual void getAabb(const btTransform &t, btVector3 &aabbMin, btVector3 &aabbMax) const =0
getAabb returns the axis aligned bounding box in the coordinate frame of the given transform t.
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)
btMultiBody * m_multiBody
void fillContactJacobianMultiDof(int link, const btVector3 &contact_point, const btVector3 &normal, btScalar *jac, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m) const
void calcAccelerationDeltasMultiDof(const btScalar *force, btScalar *output, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v) const
stepVelocitiesMultiDof is deprecated, use computeAccelerationsArticulatedBodyAlgorithmMultiDof instea...
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.
btScalar safeNorm() const
Return the norm (length) of the vector.
void setMax(const btVector3 &other)
Set each element to the max of the current values and the values of another btVector3.
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_INLINE void Expand(const btVector3 &e)
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< btScalar > scratch_r
btAlignedObjectArray< btMatrix3x3 > scratch_m
btAlignedObjectArray< btVector3 > scratch_v
const btMatrix3x3 & invWorldInertia() const
btVector3 velocity(const btVector3 &rpos) const
const btTransform & xform() const
btAlignedObjectArray< Node * > m_nodes
const btCollisionObject * m_colObj
virtual btScalar Eval(const btVector3 &x)=0
btMatrix3x3 m_effectiveMass_inv
const btCollisionObject * m_colObj
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