49#if defined(DEBUG) || defined(_DEBUG)
52#include <spu_printf.h>
53#define printf spu_printf
60#define GJK_MAX_ITERATIONS 128
61#define GJK_ACCURARY ((btScalar)0.0001)
62#define GJK_MIN_DISTANCE ((btScalar)0.0001)
63#define GJK_DUPLICATED_EPS ((btScalar)0.0001)
64#define GJK_SIMPLEX2_EPS ((btScalar)0.0)
65#define GJK_SIMPLEX3_EPS ((btScalar)0.0)
66#define GJK_SIMPLEX4_EPS ((btScalar)0.0)
69#define EPA_MAX_VERTICES 64
70#define EPA_MAX_FACES (EPA_MAX_VERTICES * 2)
71#define EPA_MAX_ITERATIONS 255
72#define EPA_ACCURACY ((btScalar)0.0001)
73#define EPA_FALLBACK (10 * EPA_ACCURACY)
74#define EPA_PLANE_EPS ((btScalar)0.00001)
75#define EPA_INSIDE_EPS ((btScalar)0.01)
78typedef unsigned int U;
79typedef unsigned char U1;
82template <
typename btConvexTemplate>
103 inline btVector3
Support0(
const btVector3& d)
const
107 inline btVector3
Support1(
const btVector3& d)
const
112 inline btVector3
Support(
const btVector3& d)
const
116 btVector3
Support(
const btVector3& d,
U index)
const
133template <
typename btConvexTemplate>
162 GJK(
const btConvexTemplate& a,
const btConvexTemplate&
b)
219 const btVector3&
w = cs.
c[cs.
rank - 1]->
w;
221 for (
U i = 0; i < 4; ++i)
236 lastw[clastw = (clastw + 1) & 3] =
w;
240 alpha =
btMax(omega, alpha);
275 for (
U i = 0, ni = cs.
rank; i < ni; ++i)
280 ns.
p[ns.
rank++] = weights[i];
281 m_ray += cs.
c[i]->
w * weights[i];
318 for (
U i = 0; i < 3; ++i)
334 for (
U i = 0; i < 3; ++i)
338 const btVector3 p =
btCross(d, axis);
380 sv.
d = d / d.length();
389 simplex.
p[simplex.
rank] = 0;
393 static btScalar det(
const btVector3& a,
const btVector3&
b,
const btVector3& c)
395 return (a.y() *
b.z() * c.x() + a.z() *
b.x() * c.y() -
396 a.x() *
b.z() * c.y() - a.y() *
b.x() * c.z() +
397 a.x() *
b.y() * c.z() - a.z() *
b.y() * c.x());
403 const btVector3 d =
b - a;
413 return (
b.length2());
420 return (a.length2());
424 w[0] = 1 - (
w[1] = t);
426 return ((a + d * t).length2());
436 static const U imd3[] = {1, 2, 0};
437 const btVector3* vt[] = {&a, &
b, &c};
438 const btVector3 dl[] = {a -
b,
b - c, c - a};
439 const btVector3 n =
btCross(dl[0], dl[1]);
446 for (
U i = 0; i < 3; ++i)
452 if ((mindist < 0) || (subd < mindist))
455 m =
static_cast<U>(((subm & 1) ? 1 << i : 0) + ((subm & 2) ? 1 << j : 0));
466 const btVector3 p = n * (d /
l);
467 mindist = p.length2();
471 w[2] = 1 - (
w[0] +
w[1]);
483 static const U imd3[] = {1, 2, 0};
484 const btVector3* vt[] = {&a, &
b, &c, &d};
485 const btVector3 dl[] = {a - d,
b - d, c - d};
493 for (
U i = 0; i < 3; ++i)
500 if ((mindist < 0) || (subd < mindist))
503 m =
static_cast<U>((subm & 1 ? 1 << i : 0) +
504 (subm & 2 ? 1 << j : 0) +
517 w[0] =
det(c,
b, d) / vl;
518 w[1] =
det(a, c, d) / vl;
519 w[2] =
det(
b, a, d) / vl;
520 w[3] = 1 - (
w[0] +
w[1] +
w[2]);
543template <
typename btConvexTemplate>
598 face->l[1] = list.root;
599 if (list.root) list.root->l[0] = face;
605 if (face->l[1]) face->l[1]->l[0] = face->l[0];
606 if (face->l[0]) face->l[0]->l[1] = face->l[1];
607 if (face == list.root) list.root = face->l[1];
637 if (gjk.
det(simplex.
c[0]->
w - simplex.
c[3]->
w,
638 simplex.
c[1]->
w - simplex.
c[3]->
w,
639 simplex.
c[2]->
w - simplex.
c[3]->
w) < 0)
645 sFace* tetra[] = {
newface(simplex.
c[0], simplex.
c[1], simplex.
c[2],
true),
646 newface(simplex.
c[1], simplex.
c[0], simplex.
c[3],
true),
647 newface(simplex.
c[2], simplex.
c[1], simplex.
c[3],
true),
648 newface(simplex.
c[0], simplex.
c[2], simplex.
c[3],
true)};
655 bind(tetra[0], 0, tetra[1], 0);
656 bind(tetra[0], 1, tetra[2], 0);
657 bind(tetra[0], 2, tetra[3], 0);
658 bind(tetra[1], 1, tetra[3], 2);
659 bind(tetra[1], 2, tetra[2], 1);
660 bind(tetra[2], 2, tetra[3], 1);
669 best->
pass = (
U1)(++pass);
674 for (
U j = 0; (j < 3) && valid; ++j)
677 best->
f[j], best->
e[j],
680 if (valid && (horizon.
nf >= 3))
706 const btVector3 projection = outer.
n * outer.
d;
714 outer.
c[2]->w - projection)
717 outer.
c[0]->w - projection)
720 outer.
c[1]->w - projection)
745 const btVector3 ba =
b->w - a->w;
746 const btVector3 n_ab =
btCross(ba, face->n);
753 const btScalar ba_l2 = ba.length2();
760 dist = a->w.length();
762 else if (b_dot_ba < 0)
765 dist =
b->w.length();
771 dist =
btSqrt(
btMax((a->w.length2() *
b->w.length2() - a_dot_b * a_dot_b) / ba_l2, (
btScalar)0));
790 face->n =
btCross(
b->w - a->w, c->
w - a->w);
802 face->d =
btDot(a->w, face->n) /
l;
827 for (
sFace* f = minf->
l[1]; f; f = f->l[1])
840 static const U i1m3[] = {1, 2, 0};
841 static const U i2m3[] = {2, 0, 1};
844 const U e1 = i1m3[
e];
852 bind(horizon.
cf, 1, nf, 2);
862 const U e2 = i2m3[
e];
864 if (
expand(pass,
w, f->
f[e1], f->
e[e1], horizon) &&
865 expand(pass,
w, f->
f[e2], f->
e[e2], horizon))
877template <
typename btConvexTemplate>
878static void Initialize(
const btConvexTemplate& a,
const btConvexTemplate&
b,
888 shape.m_toshape1 =
b.getWorldTransform().getBasis().transposeTimes(a.getWorldTransform().getBasis());
889 shape.m_toshape0 = a.getWorldTransform().inverseTimes(
b.getWorldTransform());
897template <
typename btConvexTemplate>
899 const btVector3& guess,
913 w0 += shape.Support(gjk.
m_simplex->
c[i]->
d, 0) * p;
914 w1 += shape.Support(-gjk.
m_simplex->
c[i]->
d, 1) * p;
916 results.
witnesses[0] = a.getWorldTransform() * w0;
917 results.
witnesses[1] = a.getWorldTransform() * w1;
930template <
typename btConvexTemplate>
932 const btConvexTemplate&
b,
933 const btVector3& guess,
949 for (
U i = 0; i < epa.
m_result.rank; ++i)
954 results.
witnesses[0] = a.getWorldTransform() * w0;
975int btComputeGjkEpaPenetration2(
const btCollisionDescription& colDesc, btDistanceInfo* distInfo)
978 btVector3 guess = colDesc.m_firstDir;
980 bool res = btGjkEpaSolver3::Penetration(colDesc.m_objA,colDesc.m_objB,
981 colDesc.m_transformA,colDesc.m_transformB,
982 colDesc.m_localSupportFuncA,colDesc.m_localSupportFuncB,
991 distInfo->m_distance = results.
distance;
992 distInfo->m_normalBtoA = results.
normal;
994 btScalar lenSqr = tmpNormalInB.length2();
997 tmpNormalInB = results.
normal;
998 lenSqr = results.
normal.length2();
1003 tmpNormalInB /=
btSqrt(lenSqr);
1009 distInfo->m_pointOnA= results.
witnesses[0];
1010 distInfo->m_pointOnB= results.
witnesses[1];
1011 distInfo->m_normalBtoA= tmpNormalInB;
1023template <
typename btConvexTemplate,
typename btDistanceInfoTemplate>
1035 distInfo->m_distance = results.
distance;
1036 distInfo->m_pointOnA = results.
witnesses[0];
1037 distInfo->m_pointOnB = results.
witnesses[1];
1038 distInfo->m_normalBtoA = results.
normal;
1047#undef GJK_MAX_ITERATIONS
1049#undef GJK_MIN_DISTANCE
1050#undef GJK_DUPLICATED_EPS
1051#undef GJK_SIMPLEX2_EPS
1052#undef GJK_SIMPLEX3_EPS
1053#undef GJK_SIMPLEX4_EPS
1055#undef EPA_MAX_VERTICES
1057#undef EPA_MAX_ITERATIONS
1061#undef EPA_INSIDE_EPS
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
int btComputeGjkDistance(const btConvexTemplate &a, const btConvexTemplate &b, const btGjkCollisionDescription &colDesc, btDistanceInfoTemplate *distInfo)
static void Initialize(const btConvexTemplate &a, const btConvexTemplate &b, btGjkEpaSolver3::sResults &results, MinkowskiDiff< btConvexTemplate > &shape)
#define GJK_DUPLICATED_EPS
bool btGjkEpaSolver3_Penetration(const btConvexTemplate &a, const btConvexTemplate &b, const btVector3 &guess, btGjkEpaSolver3::sResults &results)
#define GJK_MAX_ITERATIONS
bool btGjkEpaSolver3_Distance(const btConvexTemplate &a, const btConvexTemplate &b, const btVector3 &guess, btGjkEpaSolver3::sResults &results)
#define EPA_MAX_ITERATIONS
btMatrix3x3
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
SIMD_FORCE_INLINE const T & btMax(const T &a, const T &b)
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...
SIMD_FORCE_INLINE btScalar btFabs(btScalar x)
SIMD_FORCE_INLINE btScalar btSqrt(btScalar y)
SIMD_FORCE_INLINE void btSwap(T &a, T &b)
static T sum(const btAlignedObjectArray< T > &items)
SIMD_FORCE_INLINE btScalar length2() const
Return the length of the vector squared.
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 btScalar distance2(const btVector3 &v) const
Return the distance squared between the ends of this and another vector This is symantically treating...
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.
local_group_size(16, 16) .push_constant(Type b
BLI_INLINE float fb(float length, float L)
GJK< btConvexTemplate >::sSV * c[3]
bool getedgedist(sFace *face, typename GJK< btConvexTemplate >::sSV *a, typename GJK< btConvexTemplate >::sSV *b, btScalar &dist)
bool expand(U pass, typename GJK< btConvexTemplate >::sSV *w, sFace *f, U e, sHorizon &horizon)
static void append(sList &list, sFace *face)
sFace * newface(typename GJK< btConvexTemplate >::sSV *a, typename GJK< btConvexTemplate >::sSV *b, typename GJK< btConvexTemplate >::sSV *c, bool forced)
GJK< btConvexTemplate >::sSimplex m_result
GJK< btConvexTemplate >::sSV m_sv_store[EPA_MAX_VERTICES]
static void remove(sList &list, sFace *face)
eEpaStatus Evaluate(GJK< btConvexTemplate > &gjk, const btVector3 &guess)
static void bind(sFace *fa, U ea, sFace *fb, U eb)
sFace m_fc_store[EPA_MAX_FACES]
eGjkStatus Evaluate(const MinkowskiDiff< btConvexTemplate > &shapearg, const btVector3 &guess)
void getsupport(const btVector3 &d, sSV &sv) const
MinkowskiDiff< btConvexTemplate > m_shape
static btScalar projectorigin(const btVector3 &a, const btVector3 &b, const btVector3 &c, const btVector3 &d, btScalar *w, U &m)
static btScalar projectorigin(const btVector3 &a, const btVector3 &b, btScalar *w, U &m)
static btScalar det(const btVector3 &a, const btVector3 &b, const btVector3 &c)
GJK(const btConvexTemplate &a, const btConvexTemplate &b)
static btScalar projectorigin(const btVector3 &a, const btVector3 &b, const btVector3 &c, btScalar *w, U &m)
void removevertice(sSimplex &simplex)
void appendvertice(sSimplex &simplex, const btVector3 &v)
btVector3 Support1(const btVector3 &d) const
btVector3 Support0(const btVector3 &d) const
void EnableMargin(bool enable)
btVector3 Support(const btVector3 &d) const
btVector3 Support(const btVector3 &d, U index) const
MinkowskiDiff(const btConvexTemplate &a, const btConvexTemplate &b)
const btConvexTemplate * m_convexBPtr
const btConvexTemplate * m_convexAPtr
enum btGjkEpaSolver3::sResults::eStatus status