17#ifndef _BT_SOFT_BODY_INTERNALS_H
18#define _BT_SOFT_BODY_INTERNALS_H
36 const btVector3& contact_point,
39 const int ndof = multibodyLinkCol->
m_multiBody->getNumDofs() + 6;
56 if (ax <= ay && ax <= az)
58 else if (ay <= ax && ay <= az)
68 btVector3 x43 = x4 - x3;
69 if (std::abs(x43.dot(normal)) > mrg)
71 btVector3 x13 = x1 - x3;
72 btVector3 x23 = x2 - x3;
78 btScalar det = a11 * a22 - a12 * a12;
81 btScalar w1 = (b1 * a22 - b2 * a12) / det;
82 btScalar w2 = (b2 * a11 - b1 * a12) / det;
84 btScalar delta = mrg / std::sqrt(0.5 * std::abs(x13.cross(x23).safeNorm()));
86 for (
int i = 0; i < 3; ++i)
88 if (bary[i] < -delta || bary[i] > 1 + delta)
108static inline int getSign(
const btVector3& n,
const btVector3& x)
120 btVector3
hex[6] = {face->m_n[0]->m_x - node->m_x,
121 face->m_n[1]->m_x - node->m_x,
122 face->m_n[2]->m_x - node->m_x,
123 face->m_n[0]->m_x + dt * face->m_n[0]->m_v - node->m_x,
124 face->m_n[1]->m_x + dt * face->m_n[1]->m_v - node->m_x,
125 face->m_n[2]->m_x + dt * face->m_n[2]->m_v - node->m_x};
126 btVector3 segment = dt * node->m_v;
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;
225 const btVector3& n0 = face->m_n0;
226 const btVector3& n1 = face->m_n1;
227 btVector3 n_hat = n0 + n1 - face->m_vn;
228 btVector3 p0ma0 = node->m_x - face->m_n[0]->m_x;
229 btVector3 p1ma1 = node->m_q - face->m_n[0]->m_q;
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)
265 const btVector3& a0 = a->m_x;
266 const btVector3& b0 =
b->m_x;
267 const btVector3& c0 = c->
m_x;
268 const btVector3& va = a->m_v;
269 const btVector3& vb =
b->m_v;
270 const btVector3& vc = c->
m_v;
271 const btVector3 a1 = a0 + dt * va;
272 const btVector3 b1 = b0 + dt * vb;
273 const btVector3 c1 = c0 + dt * vc;
274 btVector3 n0 = (b0 - a0).
cross(c0 - a0);
275 btVector3 n1 = (b1 - a1).
cross(c1 - a1);
276 btVector3 n_hat = n0 + n1 - dt * dt * (vb - va).
cross(vc - va);
277 const btVector3& p0 = p->
m_x;
278 const btVector3& vp = p->
m_v;
279 btVector3 p1 = p0 + dt * vp;
280 btVector3 m0 = (b0 - p0).
cross(c0 - p0);
281 btVector3 m1 = (b1 - p1).
cross(c1 - p1);
282 btVector3 m_hat = m0 + m1 - dt * dt * (vb - vp).
cross(vc - vp);
284 btScalar l1 = 0.25 * (m0.dot(n_hat) + m_hat.dot(n0));
286 btScalar l3 = 0.25 * (m_hat.dot(n1) + m1.dot(n_hat));
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);
547 btVector3 x21 = face->m_n[1]->m_x - face->m_n[0]->m_x;
548 btVector3 x31 = face->m_n[2]->m_x - face->m_n[0]->m_x;
549 btVector3 x41 = node->m_x - face->m_n[0]->m_x;
550 btVector3 v21 = face->m_n[1]->m_v - face->m_n[0]->m_v;
551 btVector3 v31 = face->m_n[2]->m_v - face->m_n[0]->m_v;
552 btVector3 v41 = node->m_v - face->m_n[0]->m_v;
553 btVector3 a = x21.cross(x31);
554 btVector3
b = x21.cross(v31) + v21.cross(x31);
555 btVector3 c = v21.cross(v31);
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];
614 btVector3 x1 = face->m_n[0]->m_x + root * face->m_n[0]->m_v;
615 btVector3 x2 = face->m_n[1]->m_x + root * face->m_n[1]->m_v;
616 btVector3 x3 = face->m_n[2]->m_x + root * face->m_n[2]->m_v;
617 btVector3 x4 = node->m_x + root * node->m_v;
618 btVector3 normal = (x2 - x1).
cross(x3 - x1);
619 normal.safeNormalize();
645 store.resize((n * (n + 1)) / 2,
init);
651 return ((r * (r + 1)) / 2 + c);
689 const btVector3 crns[] = {t *
btVector3(mins.x(), mins.y(), mins.z()),
690 t *
btVector3(maxs.x(), mins.y(), mins.z()),
691 t *
btVector3(maxs.x(), maxs.y(), mins.z()),
692 t *
btVector3(mins.x(), maxs.y(), mins.z()),
693 t *
btVector3(mins.x(), mins.y(), maxs.z()),
694 t *
btVector3(maxs.x(), mins.y(), maxs.z()),
695 t *
btVector3(maxs.x(), maxs.y(), maxs.z()),
696 t *
btVector3(mins.x(), maxs.y(), maxs.z())};
697 aabbMin = aabbMax = crns[0];
698 for (
int i = 1; i < 8; ++i)
700 aabbMin.setMin(crns[i]);
701 aabbMax.setMax(crns[i]);
711 static const btVector3 dummy(1, 1, 1);
771 virtual const char*
getName()
const {
return "SOFTCLUSTER"; }
775 btConvexInternalShape::setMargin(margin);
779 return btConvexInternalShape::getMargin();
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)
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);
870 const btVector3 d = x -
y;
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;
992 m[2] =
btCross(m[0], m[1]).normalized();
993 m[1] =
btCross(m[2], m[0]).normalized();
994 m[0] =
btCross(m[1], m[2]).normalized();
1045 return (a *
btDot(
v, a));
1060 const btVector3 d =
b - a;
1065 const btVector3 p = a + d * t;
1081 const btVector3& q =
btCross(
b - a, c - a);
1085 const btVector3 n = q /
btSqrt(m2);
1090 const btVector3 p = n * k;
1113 btVector3 e1 = v1 - v0;
1114 btVector3 e2 =
v2 - v0;
1115 btVector3 h = dir.cross(e2);
1118 if (a > -0.00001 && a < 0.00001)
1122 btVector3 s = origin - v0;
1125 if (u < 0.0 || u > 1.0)
1128 btVector3 q = s.cross(e1);
1142static inline bool lineIntersectsTriangle(
const btVector3& rayStart,
const btVector3& rayEnd,
const btVector3& p1,
const btVector3& p2,
const btVector3& p3, btVector3& sect, btVector3& normal)
1144 btVector3 dir = rayEnd - rayStart;
1156 sect = rayStart + dir * t;
1166 btVector3 n = (p3 - p1).
cross(p2 - p1);
1177template <
typename T>
1181 const btVector3& coord)
1183 return (a * coord.x() +
b * coord.y() + c * coord.z());
1193 btCross(c - p, a - p).length()};
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);
1266 const btVector3* pts[] = {&f.
m_n[0]->
m_x,
1282 const btVector3& x1,
1283 const btVector3& x2)
1285 const btVector3 a = x1 - x0;
1286 const btVector3
b = x2 - x0;
1287 const btVector3 cr =
btCross(a,
b);
1294 const btVector3& x1,
1295 const btVector3& x2,
1296 const btVector3& x3)
1298 const btVector3 a = x1 - x0;
1299 const btVector3
b = x2 - x0;
1300 const btVector3 c = x3 - x0;
1328 if ((a == ma) && (
b == mb))
return (0);
1329 if ((a == mb) && (
b == ma))
return (1);
1342 static const int maxiterations = 16;
1346 vectors->setIdentity();
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);
1370 mulTPQ(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];
1451 const btVector3 va = ba.
velocity(ra);
1452 const btVector3 vb = bb.
velocity(rb);
1453 const btVector3 vrel = va - vb;
1458 const btVector3 iv =
norm * rvac;
1459 const btVector3 fv = vrel - iv;
1508 btVector3(1, 0, 0), res))
1559 bool connected =
false;
1571 &csb, btTransform::getIdentity(),
1587 static int count = 0;
1596 m_margin = (psa->getCollisionShape()->getMargin() + psb->getCollisionShape()->getMargin());
1627 static const btMatrix3x3 iwiStatic(0, 0, 0, 0, 0, 0, 0, 0, 0);
1629 const btVector3 ra = n.
m_x - wtr.getOrigin();
1631 const btVector3 vb = n.
m_x - n.
m_q;
1632 const btVector3 vr = vb - va;
1640 c.
m_c3 = fv.length2() < (dn * fc * dn * fc) ? 0 : 1 - fc;
1691 if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
1694 static const btMatrix3x3 iwiStatic(0, 0, 0, 0, 0, 0, 0, 0, 0);
1696 const btVector3 ra = n.
m_x - wtr.getOrigin();
1702 else if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
1705 if (multibodyLinkCol)
1709 btVector3 t2 =
btCross(normal, t1);
1724 t1.getX(), t1.getY(), t1.getZ(),
1725 t2.getX(), t2.getY(), t2.getZ());
1726 const int ndof = multibodyLinkCol->
m_multiBody->getNumDofs() + 6;
1728 c.
m_c0 =
rot.transpose() * local_impulse_matrix *
rot;
1765 btVector3 contact_point;
1793 if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
1796 static const btMatrix3x3 iwiStatic(0, 0, 0, 0, 0, 0, 0, 0, 0);
1798 const btVector3 ra = contact_point - wtr.getOrigin();
1804 else if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
1807 if (multibodyLinkCol)
1811 btVector3 t2 =
btCross(normal, t1);
1813 findJacobian(multibodyLinkCol, jacobianData_normal, contact_point, normal);
1814 findJacobian(multibodyLinkCol, jacobianData_t1, contact_point, t1);
1815 findJacobian(multibodyLinkCol, jacobianData_t2, contact_point, t2);
1826 t1.getX(), t1.getY(), t1.getZ(),
1827 t2.getX(), t2.getY(), t2.getZ());
1828 const int ndof = multibodyLinkCol->
m_multiBody->getNumDofs() + 6;
1830 c.
m_c0 =
rot.transpose() * local_impulse_matrix *
rot;
1862 for (
int i = 0; i < 3; ++i)
1864 if (face->m_n[i] == node)
1868 btVector3 o = node->m_x;
1872 face->m_n[1]->m_x - o,
1873 face->m_n[2]->m_x - o,
1879 const btVector3
w =
BaryCoord(n[0]->m_x, n[1]->m_x, n[2]->m_x, p + o);
1882 if ((n[0]->m_im <= 0) ||
1883 (n[1]->m_im <= 0) ||
1919 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))
1922 const btVector3
w = bary;
1925 if ((n[0]->m_im <= 0) ||
1926 (n[1]->m_im <= 0) ||
1971#ifndef REPEL_NEIGHBOR
1972 for (
int node_id = 0; node_id < 3; ++node_id)
1975 for (
int i = 0; i < 3; ++i)
1977 if (f2->
m_n[i] == node)
1983 for (
int node_id = 0; node_id < 3; ++node_id)
1986#ifdef REPEL_NEIGHBOR
1987 for (
int i = 0; i < 3; ++i)
1989 if (f2->
m_n[i] == node)
2003 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))
2057#ifndef REPEL_NEIGHBOR
2058 for (
int node_id = 0; node_id < 3; ++node_id)
2061 for (
int i = 0; i < 3; ++i)
2063 if (f2->
m_n[i] == node)
2069 for (
int node_id = 0; node_id < 3; ++node_id)
2072#ifdef REPEL_NEIGHBOR
2073 for (
int i = 0; i < 3; ++i)
2075 if (f2->
m_n[i] == node)
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
#define btAlignedAlloc(size, alignment)
@ SOFTBODY_SHAPE_PROXYTYPE
btConvexShape()
not supported on IBM SDK, until we fix the alignment of btVector3
btMatrix3x3 inverse() const
Return the inverse of the matrix.
btMatrix3x3
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
SIMD_FORCE_INLINE const T & btMin(const T &a, const T &b)
SIMD_FORCE_INLINE const T & btMax(const T &a, const T &b)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
#define ATTRIBUTE_ALIGNED16(a)
SIMD_FORCE_INLINE btScalar btFabs(btScalar x)
SIMD_FORCE_INLINE btScalar btSqrt(btScalar y)
#define SIMD_FORCE_INLINE
SIMD_FORCE_INLINE void btSwap(T &a, T &b)
static btVector3 ProjectOnAxis(const btVector3 &v, const btVector3 &a)
static SIMD_FORCE_INLINE void getBernsteinCoeff(const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt, btScalar &k0, btScalar &k1, btScalar &k2, btScalar &k3)
static SIMD_FORCE_INLINE 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 SIMD_FORCE_INLINE 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 bool CompGreater(const T &a, const T &b)
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 btMatrix3x3 Cross(const btVector3 &v)
static SIMD_FORCE_INLINE bool diffSign(const btScalar &a, const btScalar &b)
static btMatrix3x3 MassMatrix(btScalar im, const btMatrix3x3 &iwi, const btVector3 &r)
static btDbvtVolume VolumeOf(const btSoftBody::Face &f, btScalar margin)
static SIMD_FORCE_INLINE bool rootFindingLemma(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3)
static T Lerp(const T &a, const T &b, btScalar t)
static btMatrix3x3 AngularImpulseMatrix(const btMatrix3x3 &iia, const btMatrix3x3 &iib)
static SIMD_FORCE_INLINE bool bernsteinCCD(const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt, const btScalar &mrg, btVector3 &bary)
static 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)
static btScalar AreaOf(const btVector3 &x0, const btVector3 &x1, const btVector3 &x2)
static SIMD_FORCE_INLINE bool proximityTest(const btVector3 &x1, const btVector3 &x2, const btVector3 &x3, const btVector3 &x4, const btVector3 &normal, const btScalar &mrg, btVector3 &bary)
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 SIMD_FORCE_INLINE btVector3 generateUnitOrthogonalVector(const btVector3 &u)
static SIMD_FORCE_INLINE bool sameSign(const btScalar &a, const btScalar &b)
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 btMatrix3x3 ScaleAlongAxis(const btVector3 &a, btScalar s)
static SIMD_FORCE_INLINE 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 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)
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 btVector3 ProjectOnPlane(const btVector3 &v, const btVector3 &a)
static btVector3 dop[KDOP_COUNT]
static btScalar ClusterMetric(const btVector3 &x, const btVector3 &y)
static SIMD_FORCE_INLINE bool nearZero(const btScalar &a)
static SIMD_FORCE_INLINE 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 btMatrix3x3 ImpulseMatrix(btScalar dt, btScalar ima, btScalar imb, const btMatrix3x3 &iwi, const btVector3 &r)
static SIMD_FORCE_INLINE 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 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 SIMD_FORCE_INLINE void findJacobian(const btMultiBodyLinkCollider *multibodyLinkCol, btMultiBodyJacobianData &jacobianData, const btVector3 &contact_point, const btVector3 &dir)
btSoftBody implementation by Nathanael Presson
static SIMD_FORCE_INLINE bool conservativeCulling(const btScalar &k0, const btScalar &k1, const btScalar &k2, const btScalar &k3, const btScalar &mrg)
static void ProjectOrigin(const btVector3 &a, const btVector3 &b, btVector3 &prj, btScalar &sqd)
static SIMD_FORCE_INLINE bool continuousCollisionDetection(const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt, const btScalar &mrg, btVector3 &bary)
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 SIMD_FORCE_INLINE 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)
btScalar evaluateBezier(const btScalar &p0, const btScalar &p1, const btScalar &p2, const btScalar &p3, const btScalar &t, const btScalar &s)
static SIMD_FORCE_INLINE 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 SIMD_FORCE_INLINE bool hasSeparatingPlane(const btSoftBody::Face *face, const btSoftBody::Node *node, const btScalar &dt)
static 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)
static btMatrix3x3 Diagonal(btScalar x)
static T Cube(const T &x)
SIMD_FORCE_INLINE btScalar length2() const
Return the length of the vector squared.
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
SIMD_FORCE_INLINE btScalar btDot(const btVector3 &v1, const btVector3 &v2)
Return the dot product between two vectors.
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 btVector3 btCross(const btVector3 &v1, const btVector3 &v2)
Return the cross product of two vectors.
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
SIMD_FORCE_INLINE void resize(int newsize, const T &fillData=T())
SIMD_FORCE_INLINE void push_back(const T &_Val)
static btMultiBodyLinkCollider * upcast(btCollisionObject *colObj)
btMultiBody * m_multiBody
unsigned int decompose(const btMatrix3x3 &a, btMatrix3x3 &u, btMatrix3x3 &h) const
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
btAlignedObjectArray< bool > m_clusterConnectivity
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
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
local_group_size(16, 16) .push_constant(Type b
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
ccl_device_inline float cross(const float2 a, const float2 b)
int SolveP3(btScalar *x, btScalar a, btScalar b, btScalar c)
int SolveP2(btScalar *x, btScalar a, btScalar b)
SIMD_FORCE_INLINE const btCollisionShape * getCollisionShape() const
SIMD_FORCE_INLINE const btTransform & getWorldTransform() const
SIMD_FORCE_INLINE const btCollisionObject * getCollisionObject() 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 int system(btMatrix3x3 &a, btMatrix3x3 *vectors, btVector3 *values=0)
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
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
static const char hex[17]