23#ifdef BT_USE_DOUBLE_PRECISION
24#define btVector3Data btVector3DoubleData
25#define btVector3DataName "btVector3DoubleData"
27#define btVector3Data btVector3FloatData
28#define btVector3DataName "btVector3FloatData"
36#pragma warning(disable : 4556)
39#define BT_SHUFFLE(x, y, z, w) (((w) << 6 | (z) << 4 | (y) << 2 | (x)) & 0xff)
41#define bt_pshufd_ps(_a, _mask) _mm_shuffle_ps((_a), (_a), (_mask))
42#define bt_splat3_ps(_a, _i) bt_pshufd_ps((_a), BT_SHUFFLE(_i, _i, _i, 3))
43#define bt_splat_ps(_a, _i) bt_pshufd_ps((_a), BT_SHUFFLE(_i, _i, _i, _i))
45#define btv3AbsiMask (_mm_set_epi32(0x00000000, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF))
46#define btvAbsMask (_mm_set_epi32(0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF))
47#define btvFFF0Mask (_mm_set_epi32(0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF))
48#define btv3AbsfMask btCastiTo128f(btv3AbsiMask)
49#define btvFFF0fMask btCastiTo128f(btvFFF0Mask)
50#define btvxyzMaskf btvFFF0fMask
51#define btvAbsfMask btCastiTo128f(btvAbsMask)
54#define btvMzeroMask (_mm_set_ps(-0.0f, -0.0f, -0.0f, -0.0f))
55#define v1110 (_mm_set_ps(0.0f, 1.0f, 1.0f, 1.0f))
56#define vHalf (_mm_set_ps(0.5f, 0.5f, 0.5f, 0.5f))
57#define v1_5 (_mm_set_ps(1.5f, 1.5f, 1.5f, 1.5f))
68const float32x4_t
ATTRIBUTE_ALIGNED16(btvMzeroMask) = (float32x4_t){-0.0f, -0.0f, -0.0f, -0.0f};
70 static_cast<int32_t>(0xFFFFFFFF),
static_cast<int32_t>(0xFFFFFFFF), 0x0};
71const int32x4_t
ATTRIBUTE_ALIGNED16(btvAbsMask) = (int32x4_t){0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF};
72const int32x4_t
ATTRIBUTE_ALIGNED16(btv3AbsMask) = (int32x4_t){0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x0};
86#if defined(__SPU__) && defined(__CELLOS_LV2__)
92 return *((
const vec_float4*)&
m_floats[0]);
97#if defined(BT_USE_SSE) || defined(BT_USE_NEON)
134#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON)
144 mVec128 =
rhs.mVec128;
161#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
162 mVec128 = _mm_add_ps(mVec128,
v.mVec128);
163#elif defined(BT_USE_NEON)
164 mVec128 = vaddq_f32(mVec128,
v.mVec128);
177#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
178 mVec128 = _mm_sub_ps(mVec128,
v.mVec128);
179#elif defined(BT_USE_NEON)
180 mVec128 = vsubq_f32(mVec128,
v.mVec128);
193#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
194 __m128 vs = _mm_load_ss(&s);
195 vs = bt_pshufd_ps(vs, 0x80);
196 mVec128 = _mm_mul_ps(mVec128, vs);
197#elif defined(BT_USE_NEON)
198 mVec128 = vmulq_n_f32(mVec128, s);
215 __m128 vs = _mm_load_ss(&s);
216 vs = _mm_div_ss(v1110, vs);
217 vs = bt_pshufd_ps(vs, 0x00);
219 mVec128 = _mm_mul_ps(mVec128, vs);
231#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
232 __m128 vd = _mm_mul_ps(mVec128,
v.mVec128);
233 __m128
z = _mm_movehl_ps(vd, vd);
234 __m128 y = _mm_shuffle_ps(vd, vd, 0x55);
235 vd = _mm_add_ss(vd, y);
236 vd = _mm_add_ss(vd,
z);
237 return _mm_cvtss_f32(vd);
238#elif defined(BT_USE_NEON)
239 float32x4_t vd = vmulq_f32(mVec128,
v.mVec128);
240 float32x2_t x = vpadd_f32(vget_low_f32(vd), vget_low_f32(vd));
241 x = vadd_f32(x, vget_high_f32(vd));
242 return vget_lane_f32(x, 0);
307#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
309 __m128 vd = _mm_mul_ps(mVec128, mVec128);
310 __m128
z = _mm_movehl_ps(vd, vd);
311 __m128 y = _mm_shuffle_ps(vd, vd, 0x55);
312 vd = _mm_add_ss(vd, y);
313 vd = _mm_add_ss(vd,
z);
316 vd = _mm_sqrt_ss(vd);
317 vd = _mm_div_ss(v1110, vd);
318 vd = bt_splat_ps(vd, 0x80);
319 mVec128 = _mm_mul_ps(mVec128, vd);
323 y = _mm_rsqrt_ss(vd);
327 vd = _mm_mul_ss(vd, vHalf);
329 vd = _mm_mul_ss(vd, y);
330 vd = _mm_mul_ss(vd, y);
331 z = _mm_sub_ss(
z, vd);
333 y = _mm_mul_ss(y,
z);
335 y = bt_splat_ps(y, 0x80);
336 mVec128 = _mm_mul_ps(mVec128, y);
366#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
367 return btVector3(_mm_and_ps(mVec128, btv3AbsfMask));
368#elif defined(BT_USE_NEON)
382#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
385 T = bt_pshufd_ps(mVec128, BT_SHUFFLE(1, 2, 0, 3));
386 V = bt_pshufd_ps(
v.mVec128, BT_SHUFFLE(1, 2, 0, 3));
388 V = _mm_mul_ps(
V, mVec128);
389 T = _mm_mul_ps(T,
v.mVec128);
390 V = _mm_sub_ps(
V, T);
392 V = bt_pshufd_ps(
V, BT_SHUFFLE(1, 2, 0, 3));
394#elif defined(BT_USE_NEON)
397 float32x2_t Tlow = vget_low_f32(mVec128);
398 float32x2_t Vlow = vget_low_f32(
v.mVec128);
399 T = vcombine_f32(vext_f32(Tlow, vget_high_f32(mVec128), 1), Tlow);
400 V = vcombine_f32(vext_f32(Vlow, vget_high_f32(
v.mVec128), 1), Vlow);
402 V = vmulq_f32(
V, mVec128);
403 T = vmulq_f32(T,
v.mVec128);
405 Vlow = vget_low_f32(
V);
407 V = vcombine_f32(vext_f32(Vlow, vget_high_f32(
V), 1), Vlow);
408 V = (float32x4_t)vandq_s32((int32x4_t)
V, btvFFF0Mask);
421#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
423 __m128 T = _mm_shuffle_ps(v1.mVec128, v1.mVec128, BT_SHUFFLE(1, 2, 0, 3));
424 __m128
V = _mm_shuffle_ps(
v2.mVec128,
v2.mVec128, BT_SHUFFLE(1, 2, 0, 3));
426 V = _mm_mul_ps(
V, v1.mVec128);
427 T = _mm_mul_ps(T,
v2.mVec128);
428 V = _mm_sub_ps(
V, T);
430 V = _mm_shuffle_ps(
V,
V, BT_SHUFFLE(1, 2, 0, 3));
433 V = _mm_mul_ps(
V, mVec128);
434 __m128
z = _mm_movehl_ps(
V,
V);
435 __m128 y = _mm_shuffle_ps(
V,
V, 0x55);
436 V = _mm_add_ss(
V, y);
437 V = _mm_add_ss(
V,
z);
438 return _mm_cvtss_f32(
V);
440#elif defined(BT_USE_NEON)
444 float32x2_t Tlow = vget_low_f32(v1.mVec128);
445 float32x2_t Vlow = vget_low_f32(
v2.mVec128);
446 T = vcombine_f32(vext_f32(Tlow, vget_high_f32(v1.mVec128), 1), Tlow);
447 V = vcombine_f32(vext_f32(Vlow, vget_high_f32(
v2.mVec128), 1), Vlow);
449 V = vmulq_f32(
V, v1.mVec128);
450 T = vmulq_f32(T,
v2.mVec128);
452 Vlow = vget_low_f32(
V);
454 V = vcombine_f32(vext_f32(Vlow, vget_high_f32(
V), 1), Vlow);
457 V = vmulq_f32(mVec128,
V);
458 float32x2_t x = vpadd_f32(vget_low_f32(
V), vget_low_f32(
V));
459 x = vadd_f32(x, vget_high_f32(
V));
460 return vget_lane_f32(x, 0);
462 return m_floats[0] * (v1.m_floats[1] *
v2.m_floats[2] - v1.m_floats[2] *
v2.m_floats[1]) +
463 m_floats[1] * (v1.m_floats[2] *
v2.m_floats[0] - v1.m_floats[0] *
v2.m_floats[2]) +
464 m_floats[2] * (v1.m_floats[0] *
v2.m_floats[1] - v1.m_floats[1] *
v2.m_floats[0]);
494#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
495 __m128 vrt = _mm_load_ss(&rt);
497 __m128 vs = _mm_load_ss(&s);
498 vs = bt_pshufd_ps(vs, 0x80);
499 __m128 r0 = _mm_mul_ps(v0.mVec128, vs);
500 vrt = bt_pshufd_ps(vrt, 0x80);
501 __m128 r1 = _mm_mul_ps(v1.mVec128, vrt);
502 __m128 tmp3 = _mm_add_ps(r0, r1);
504#elif defined(BT_USE_NEON)
505 float32x4_t vl = vsubq_f32(v1.mVec128, v0.mVec128);
506 vl = vmulq_n_f32(vl, rt);
507 mVec128 = vaddq_f32(vl, v0.mVec128);
510 m_floats[0] = s * v0.m_floats[0] + rt * v1.m_floats[0];
511 m_floats[1] = s * v0.m_floats[1] + rt * v1.m_floats[1];
512 m_floats[2] = s * v0.m_floats[2] + rt * v1.m_floats[2];
523#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
524 __m128 vt = _mm_load_ss(&t);
525 vt = bt_pshufd_ps(vt, 0x80);
526 __m128 vl = _mm_sub_ps(
v.mVec128, mVec128);
527 vl = _mm_mul_ps(vl, vt);
528 vl = _mm_add_ps(vl, mVec128);
531#elif defined(BT_USE_NEON)
532 float32x4_t vl = vsubq_f32(
v.mVec128, mVec128);
533 vl = vmulq_n_f32(vl, t);
534 vl = vaddq_f32(vl, mVec128);
548#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
549 mVec128 = _mm_mul_ps(mVec128,
v.mVec128);
550#elif defined(BT_USE_NEON)
551 mVec128 = vmulq_f32(mVec128,
v.mVec128);
591#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
592 return (0xf == _mm_movemask_ps((__m128)_mm_cmpeq_ps(mVec128, other.mVec128)));
594 return ((
m_floats[3] == other.m_floats[3]) &&
595 (
m_floats[2] == other.m_floats[2]) &&
596 (
m_floats[1] == other.m_floats[1]) &&
597 (
m_floats[0] == other.m_floats[0]));
603 return !(*
this == other);
611#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
612 mVec128 = _mm_max_ps(mVec128, other.mVec128);
613#elif defined(BT_USE_NEON)
614 mVec128 = vmaxq_f32(mVec128, other.mVec128);
628#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
629 mVec128 = _mm_min_ps(mVec128, other.mVec128);
630#elif defined(BT_USE_NEON)
631 mVec128 = vminq_f32(mVec128, other.mVec128);
650#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
652 __m128
V = _mm_and_ps(mVec128, btvFFF0fMask);
653 __m128 V0 = _mm_xor_ps(btvMzeroMask,
V);
654 __m128 V2 = _mm_movelh_ps(V0,
V);
656 __m128 V1 = _mm_shuffle_ps(
V, V0, 0xCE);
658 V0 = _mm_shuffle_ps(V0,
V, 0xDB);
659 V2 = _mm_shuffle_ps(V2,
V, 0xF9);
665 v0->setValue(0., -
z(),
y());
666 v1->setValue(
z(), 0., -
x());
667 v2->setValue(-
y(),
x(), 0.);
673#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
674 mVec128 = (__m128)_mm_xor_ps(mVec128, mVec128);
675#elif defined(BT_USE_NEON)
676 int32x4_t vi = vdupq_n_s32(0);
677 mVec128 = vreinterpretq_f32_s32(vi);
722#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
724 __m128 a0 = _mm_mul_ps(v0.mVec128, this->mVec128);
725 __m128 a1 = _mm_mul_ps(v1.mVec128, this->mVec128);
726 __m128 a2 = _mm_mul_ps(
v2.mVec128, this->mVec128);
727 __m128 b0 = _mm_unpacklo_ps(a0, a1);
728 __m128 b1 = _mm_unpackhi_ps(a0, a1);
729 __m128 b2 = _mm_unpacklo_ps(a2, _mm_setzero_ps());
730 __m128 r = _mm_movelh_ps(b0, b2);
731 r = _mm_add_ps(r, _mm_movehl_ps(b2, b0));
732 a2 = _mm_and_ps(a2, btvxyzMaskf);
733 r = _mm_add_ps(r, btCastdTo128f(_mm_move_sd(btCastfTo128d(a2), btCastfTo128d(b1))));
736#elif defined(BT_USE_NEON)
737 static const uint32x4_t xyzMask = (
const uint32x4_t){
static_cast<uint32_t>(-1),
static_cast<uint32_t>(-1),
static_cast<uint32_t>(-1), 0};
738 float32x4_t a0 = vmulq_f32(v0.mVec128, this->mVec128);
739 float32x4_t a1 = vmulq_f32(v1.mVec128, this->mVec128);
740 float32x4_t a2 = vmulq_f32(
v2.mVec128, this->mVec128);
741 float32x2x2_t zLo = vtrn_f32(vget_high_f32(a0), vget_high_f32(a1));
742 a2 = (float32x4_t)vandq_u32((uint32x4_t)a2, xyzMask);
743 float32x2_t b0 = vadd_f32(vpadd_f32(vget_low_f32(a0), vget_low_f32(a1)), zLo.val[0]);
744 float32x2_t b1 = vpadd_f32(vpadd_f32(vget_low_f32(a2), vget_high_f32(a2)), vdup_n_f32(0.0f));
756#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
757 return btVector3(_mm_add_ps(v1.mVec128,
v2.mVec128));
758#elif defined(BT_USE_NEON)
759 return btVector3(vaddq_f32(v1.mVec128,
v2.mVec128));
762 v1.m_floats[0] +
v2.m_floats[0],
763 v1.m_floats[1] +
v2.m_floats[1],
764 v1.m_floats[2] +
v2.m_floats[2]);
772#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
773 return btVector3(_mm_mul_ps(v1.mVec128,
v2.mVec128));
774#elif defined(BT_USE_NEON)
775 return btVector3(vmulq_f32(v1.mVec128,
v2.mVec128));
778 v1.m_floats[0] *
v2.m_floats[0],
779 v1.m_floats[1] *
v2.m_floats[1],
780 v1.m_floats[2] *
v2.m_floats[2]);
788#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE))
791 __m128 r = _mm_sub_ps(v1.mVec128,
v2.mVec128);
792 return btVector3(_mm_and_ps(r, btvFFF0fMask));
793#elif defined(BT_USE_NEON)
794 float32x4_t r = vsubq_f32(v1.mVec128,
v2.mVec128);
795 return btVector3((float32x4_t)vandq_s32((int32x4_t)r, btvFFF0Mask));
798 v1.m_floats[0] -
v2.m_floats[0],
799 v1.m_floats[1] -
v2.m_floats[1],
800 v1.m_floats[2] -
v2.m_floats[2]);
808#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE))
809 __m128 r = _mm_xor_ps(
v.mVec128, btvMzeroMask);
810 return btVector3(_mm_and_ps(r, btvFFF0fMask));
811#elif defined(BT_USE_NEON)
812 return btVector3((btSimdFloat4)veorq_s32((int32x4_t)
v.mVec128, (int32x4_t)btvMzeroMask));
814 return btVector3(-
v.m_floats[0], -
v.m_floats[1], -
v.m_floats[2]);
822#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
823 __m128 vs = _mm_load_ss(&s);
824 vs = bt_pshufd_ps(vs, 0x80);
826#elif defined(BT_USE_NEON)
827 float32x4_t r = vmulq_n_f32(
v.mVec128, s);
828 return btVector3((float32x4_t)vandq_s32((int32x4_t)r, btvFFF0Mask));
830 return btVector3(
v.m_floats[0] * s,
v.m_floats[1] * s,
v.m_floats[2] * s);
848 __m128 vs = _mm_load_ss(&s);
849 vs = _mm_div_ss(v1110, vs);
850 vs = bt_pshufd_ps(vs, 0x00);
862#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE))
863 __m128 vec = _mm_div_ps(v1.mVec128,
v2.mVec128);
864 vec = _mm_and_ps(vec, btvFFF0fMask);
866#elif defined(BT_USE_NEON)
867 float32x4_t
x,
y,
v, m;
873 m = vrecpsq_f32(y,
v);
875 m = vrecpsq_f32(y,
v);
882 v1.m_floats[0] /
v2.m_floats[0],
883 v1.m_floats[1] /
v2.m_floats[1],
884 v1.m_floats[2] /
v2.m_floats[2]);
890btDot(
const btVector3& v1,
const btVector3&
v2)
899 return v1.distance2(
v2);
906 return v1.distance(
v2);
924btTriple(
const btVector3& v1,
const btVector3&
v2,
const btVector3& v3)
926 return v1.triple(
v2, v3);
936 return v1.lerp(
v2, t);
941 return (
v - *
this).length2();
946 return (
v - *
this).length();
951 btVector3 nrm = *
this;
953 return nrm.normalize();
960#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
962 __m128 O = _mm_mul_ps(wAxis.mVec128, mVec128);
964 __m128 C = wAxis.cross(mVec128).mVec128;
965 O = _mm_and_ps(O, btvFFF0fMask);
968 __m128 vsin = _mm_load_ss(&ssin);
969 __m128 vcos = _mm_load_ss(&scos);
971 __m128
Y = bt_pshufd_ps(O, 0xC9);
972 __m128 Z = bt_pshufd_ps(O, 0xD2);
973 O = _mm_add_ps(O,
Y);
974 vsin = bt_pshufd_ps(vsin, 0x80);
975 O = _mm_add_ps(O, Z);
976 vcos = bt_pshufd_ps(vcos, 0x80);
979 O = O * wAxis.mVec128;
980 __m128
X = mVec128 - O;
988 btVector3 o = wAxis * wAxis.dot(*
this);
989 btVector3 _x = *
this - o;
992 _y = wAxis.cross(*
this);
994 return (o + _x *
btCos(_angle) + _y *
btSin(_angle));
1000#if (defined BT_USE_SSE && defined BT_USE_SIMD_VECTOR3 && defined BT_USE_SSE_IN_API) || defined(BT_USE_NEON)
1001#if defined _WIN32 || defined(BT_USE_SSE)
1002 const long scalar_cutoff = 10;
1003 long _maxdot_large(
const float*
array,
const float* vec,
unsigned long array_count,
float* dotOut);
1004#elif defined BT_USE_NEON
1005 const long scalar_cutoff = 4;
1006 extern long (*_maxdot_large)(
const float*
array,
const float* vec,
unsigned long array_count,
float* dotOut);
1008 if (array_count < scalar_cutoff)
1014 for (i = 0; i < array_count; i++)
1028#if (defined BT_USE_SSE && defined BT_USE_SIMD_VECTOR3 && defined BT_USE_SSE_IN_API) || defined(BT_USE_NEON)
1029 return _maxdot_large((
float*)
array, (
float*)&
m_floats[0], array_count, &dotOut);
1035#if (defined BT_USE_SSE && defined BT_USE_SIMD_VECTOR3 && defined BT_USE_SSE_IN_API) || defined(BT_USE_NEON)
1036#if defined BT_USE_SSE
1037 const long scalar_cutoff = 10;
1038 long _mindot_large(
const float*
array,
const float* vec,
unsigned long array_count,
float* dotOut);
1039#elif defined BT_USE_NEON
1040 const long scalar_cutoff = 4;
1041 extern long (*_mindot_large)(
const float*
array,
const float* vec,
unsigned long array_count,
float* dotOut);
1043#error unhandled arch!
1046 if (array_count < scalar_cutoff)
1053 for (i = 0; i < array_count; i++)
1068#if (defined BT_USE_SSE && defined BT_USE_SIMD_VECTOR3 && defined BT_USE_SSE_IN_API) || defined(BT_USE_NEON)
1069 return _mindot_large((
float*)
array, (
float*)&
m_floats[0], array_count, &dotOut);
1079 : btVector3(_x, _y, _z)
1084#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON)
1092 mVec128 =
rhs.mVec128;
1098 mVec128 =
v.mVec128;
1105#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
1106 return btVector4(_mm_and_ps(mVec128, btvAbsfMask));
1107#elif defined(BT_USE_NEON)
1210#ifdef BT_USE_DOUBLE_PRECISION
1211 unsigned char* dest = (
unsigned char*)&destVal;
1212 const unsigned char* src = (
const unsigned char*)&sourceVal;
1222 unsigned char* dest = (
unsigned char*)&destVal;
1223 const unsigned char* src = (
const unsigned char*)&sourceVal;
1233 for (
int i = 0; i < 4; i++)
1242 btVector3 swappedVec;
1243 for (
int i = 0; i < 4; i++)
1256 btScalar a = n[1] * n[1] + n[2] * n[2];
1263 q[1] = -n[0] * p[2];
1269 btScalar a = n[0] * n[0] + n[1] * n[1];
1275 q[0] = -n[2] * p[1];
1294 for (
int i = 0; i < 4; i++)
1300 for (
int i = 0; i < 4; i++)
1307 for (
int i = 0; i < 4; i++)
1313 for (
int i = 0; i < 4; i++)
1320 for (
int i = 0; i < 4; i++)
1326 for (
int i = 0; i < 4; i++)
1332 for (
int i = 0; i < 4; i++)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
btGeneric6DofConstraint & operator=(btGeneric6DofConstraint &other)
SIMD_FORCE_INLINE void btSetMin(T &a, const T &b)
SIMD_FORCE_INLINE void btSetMax(T &a, const T &b)
SIMD_FORCE_INLINE btScalar btAcos(btScalar x)
#define BT_DECLARE_ALIGNED_ALLOCATOR()
SIMD_FORCE_INLINE btScalar btCos(btScalar x)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
SIMD_FORCE_INLINE btScalar btSin(btScalar x)
#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 bool operator==(const btVector3 &other) const
SIMD_FORCE_INLINE void btPlaneSpace1(const T &n, T &p, T &q)
SIMD_FORCE_INLINE btScalar safeNorm() const
Return the norm (length) of the vector.
SIMD_FORCE_INLINE btScalar length2() const
Return the length of the vector squared.
SIMD_FORCE_INLINE void btUnSwapVector3Endian(btVector3 &vector)
btUnSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization
SIMD_FORCE_INLINE const btScalar & getY() const
Return the y value.
SIMD_FORCE_INLINE bool operator!=(const btVector3 &other) const
SIMD_FORCE_INLINE void deSerializeFloat(const struct btVector3FloatData &dataIn)
SIMD_FORCE_INLINE int maxAxis() const
Return the axis with the largest value Note return values are 0,1,2 for x, y, or z.
SIMD_FORCE_INLINE void setY(btScalar _y)
Set the y value.
SIMD_FORCE_INLINE btScalar dot(const btVector3 &v) const
Return the dot product.
SIMD_FORCE_INLINE void setX(btScalar _x)
Set the x value.
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
SIMD_FORCE_INLINE void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
SIMD_FORCE_INLINE btScalar btDot(const btVector3 &v1, const btVector3 &v2)
Return the dot product between two vectors.
SIMD_FORCE_INLINE void deSerialize(const struct btVector3DoubleData &dataIn)
SIMD_FORCE_INLINE const btScalar & getZ() const
Return the z value.
SIMD_FORCE_INLINE btVector3 operator-(const btVector3 &v1, const btVector3 &v2)
Return the difference between two vectors.
SIMD_FORCE_INLINE btVector3 operator+(const btVector3 &v1, const btVector3 &v2)
Return the sum of two vectors (Point symantics)
SIMD_FORCE_INLINE btScalar triple(const btVector3 &v1, const btVector3 &v2) const
SIMD_FORCE_INLINE btScalar distance(const btVector3 &v) const
Return the distance between the ends of this and another vector This is symantically treating the vec...
SIMD_FORCE_INLINE void setMax(const btVector3 &other)
Set each element to the max of the current values and the values of another btVector3.
void getSkewSymmetricMatrix(btVector3 *v0, btVector3 *v1, btVector3 *v2) const
SIMD_FORCE_INLINE long minDot(const btVector3 *array, long array_count, btScalar &dotOut) const
returns index of minimum dot product between this and vectors in array[]
SIMD_FORCE_INLINE void btSwapScalarEndian(const btScalar &sourceVal, btScalar &destVal)
btSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization
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 void setZ(btScalar _z)
Set the z value.
SIMD_FORCE_INLINE btScalar btDistance(const btVector3 &v1, const btVector3 &v2)
Return the distance between two vectors.
SIMD_FORCE_INLINE void serializeFloat(struct btVector3FloatData &dataOut) const
SIMD_FORCE_INLINE btScalar btAngle(const btVector3 &v1, const btVector3 &v2)
Return the angle between two vectors.
SIMD_FORCE_INLINE const btScalar & y() const
Return the y value.
SIMD_FORCE_INLINE void setInterpolate3(const btVector3 &v0, const btVector3 &v1, btScalar rt)
SIMD_FORCE_INLINE int furthestAxis() const
SIMD_FORCE_INLINE void btSwapVector3Endian(const btVector3 &sourceVec, btVector3 &destVec)
btSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization
SIMD_FORCE_INLINE btScalar btTriple(const btVector3 &v1, const btVector3 &v2, const btVector3 &v3)
SIMD_FORCE_INLINE bool fuzzyZero() const
SIMD_FORCE_INLINE btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
SIMD_FORCE_INLINE int closestAxis() const
SIMD_FORCE_INLINE btVector3 rotate(const btVector3 &wAxis, const btScalar angle) const
Return a rotated version of this vector.
SIMD_FORCE_INLINE btVector3 operator/(const btVector3 &v, const btScalar &s)
Return the vector inversely scaled by s.
SIMD_FORCE_INLINE int minAxis() const
Return the axis with the smallest value Note return values are 0,1,2 for x, y, or z.
SIMD_FORCE_INLINE void serialize(struct btVector3Data &dataOut) const
SIMD_FORCE_INLINE btVector3 normalized() const
Return a normalized version of this vector.
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
SIMD_FORCE_INLINE btVector3 & operator*=(const btScalar &s)
Scale the vector.
SIMD_FORCE_INLINE btVector3 operator*(const btVector3 &v1, const btVector3 &v2)
Return the elementwise product of two vectors.
SIMD_FORCE_INLINE btVector3 & safeNormalize()
SIMD_FORCE_INLINE void setMin(const btVector3 &other)
Set each element to the min of the current values and the values of another btVector3.
SIMD_FORCE_INLINE btVector3 dot3(const btVector3 &v0, const btVector3 &v1, const btVector3 &v2) const
SIMD_FORCE_INLINE long maxDot(const btVector3 *array, long array_count, btScalar &dotOut) const
returns index of maximum dot product between this and vectors in array[]
SIMD_FORCE_INLINE void setW(btScalar _w)
Set the w value.
SIMD_FORCE_INLINE btVector3 & operator/=(const btScalar &s)
Inversely scale the vector.
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
SIMD_FORCE_INLINE btScalar btDistance2(const btVector3 &v1, const btVector3 &v2)
Return the distance squared between two vectors.
SIMD_FORCE_INLINE bool isZero() const
SIMD_FORCE_INLINE void serializeDouble(struct btVector3DoubleData &dataOut) const
SIMD_FORCE_INLINE btVector3 & operator-=(const btVector3 &v)
Subtract a vector from this one.
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 void deSerializeDouble(const struct btVector3DoubleData &dataIn)
SIMD_FORCE_INLINE const btScalar & getX() const
Return the x value.
SIMD_FORCE_INLINE btVector3 & operator+=(const btVector3 &v)
Add a vector to this one.
SIMD_FORCE_INLINE btVector3 absolute() const
Return a vector with the absolute values of each element.
SIMD_FORCE_INLINE const btScalar & x() const
Return the x value.
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
SIMD_FORCE_INLINE btVector4(const btScalar &_x, const btScalar &_y, const btScalar &_z, const btScalar &_w)
SIMD_FORCE_INLINE int minAxis4() const
SIMD_FORCE_INLINE int closestAxis4() const
SIMD_FORCE_INLINE void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z, const btScalar &_w)
Set x,y,z and zero w.
SIMD_FORCE_INLINE btVector4()
SIMD_FORCE_INLINE btVector4 absolute4() const
SIMD_FORCE_INLINE int maxAxis4() const
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
local_group_size(16, 16) .push_constant(Type rhs
CCL_NAMESPACE_BEGIN struct Window V