29#ifndef PX_VEC_MATH_AOS_SCALAR_INLINE_H
30#define PX_VEC_MATH_AOS_SCALAR_INLINE_H
32#if COMPILE_VECTOR_INTRINSICS
33#error Scalar version should not be included when using vector intrinsics.
43#define BOOL_TO_U32(b) PxU32(- PxI32(b))
44#define TRUE_TO_U32 PxU32(-1)
45#define FALSE_TO_U32 PxU32(0)
47#define BOOL_TO_U16(b) PxU16(- PxI32(b))
49#define PX_VECMATH_ASSERT_ENABLED 0
51#if PX_VECMATH_ASSERT_ENABLED
52#define VECMATHAOS_ASSERT(x) { PX_ASSERT(x); }
54#define VECMATHAOS_ASSERT(x)
61namespace internalScalarSimd
75 return (0 == a.x || 0 == a.y || 0 == a.z);
80 return (0 == a.x || 0 == a.y || 0 == a.z || 0 == a.w);
90 tmp.x = tmp.y = tmp.z = 0.0f;
95PX_FORCE_INLINE bool allElementsEqualFloatV(
const FloatV a,
const FloatV b)
100PX_FORCE_INLINE bool allElementsEqualVec3V(
const Vec3V a,
const Vec3V b)
102 return (a.x == b.x && a.y == b.y && a.z == b.z);
105PX_FORCE_INLINE bool allElementsEqualVec4V(
const Vec4V a,
const Vec4V b)
107 return (a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w);
110PX_FORCE_INLINE bool allElementsEqualBoolV(
const BoolV a,
const BoolV b)
112 return (a.ux == b.ux && a.uy == b.uy && a.uz == b.uz && a.uw == b.uw);
115PX_FORCE_INLINE bool allElementsEqualVecU32V(
const VecU32V a,
const VecU32V b)
117 return (a.u32[0] == b.u32[0] && a.u32[1] == b.u32[1] && a.u32[2] == b.u32[2] && a.u32[3] == b.u32[3]);
120PX_FORCE_INLINE bool allElementsEqualVecI32V(
const VecI32V a,
const VecI32V b)
122 return (a.i32[0] == b.i32[0] && a.i32[1] == b.i32[1] && a.i32[2] == b.i32[2] && a.i32[3] == b.i32[3]);
125#define VECMATH_AOS_EPSILON (1e-3f)
127PX_FORCE_INLINE bool allElementsNearEqualFloatV(
const FloatV a,
const FloatV b)
129 const PxF32 cx = a.x - b.x;
130 return (cx > -VECMATH_AOS_EPSILON && cx < VECMATH_AOS_EPSILON);
133PX_FORCE_INLINE bool allElementsNearEqualVec3V(
const Vec3V a,
const Vec3V b)
135 const PxF32 cx = a.x - b.x;
136 const PxF32 cy = a.y - b.y;
137 const PxF32 cz = a.z - b.z;
138 return (cx > -VECMATH_AOS_EPSILON && cx < VECMATH_AOS_EPSILON && cy > -VECMATH_AOS_EPSILON &&
139 cy < VECMATH_AOS_EPSILON && cz > -VECMATH_AOS_EPSILON && cz < VECMATH_AOS_EPSILON);
142PX_FORCE_INLINE bool allElementsNearEqualVec4V(
const Vec4V a,
const Vec4V b)
144 const PxF32 cx = a.x - b.x;
145 const PxF32 cy = a.y - b.y;
146 const PxF32 cz = a.z - b.z;
147 const PxF32 cw = a.w - b.w;
148 return (cx > -VECMATH_AOS_EPSILON && cx < VECMATH_AOS_EPSILON && cy > -VECMATH_AOS_EPSILON &&
149 cy < VECMATH_AOS_EPSILON && cz > -VECMATH_AOS_EPSILON && cz < VECMATH_AOS_EPSILON &&
150 cw > -VECMATH_AOS_EPSILON && cw < VECMATH_AOS_EPSILON);
187 return Vec3V(f, f, f);
192 return Vec4V(f, f, f, f);
201 return f ? BTTTT() : BFFFF();
203 return BoolV(BOOL_TO_U32(f), BOOL_TO_U32(f), BOOL_TO_U32(f), BOOL_TO_U32(f));
209 return Vec3V(f.x, f.y, f.z);
214 return Vec3V(f.x, f.y, f.z);
219 return Vec3V(f.x, f.y, f.z);
224 return Vec3V(f[0], f[1], f[2]);
229 return Vec3V(f[0], f[1], f[2]);
234 return Vec3V(f.x, f.y, f.z);
239 return Vec3V(v.x, v.y, v.z);
244 return Vec4V(f.x, f.y, f.z, 0.0f);
249 return Vec4V(f.x, f.x, f.x, f.x);
254 return Vec3V(f.x, f.x, f.x);
259 return Vec3V(f.x, f.x, f.x);
264 return Vec4V(f[0], f[1], f[2], f[3]);
269 *
reinterpret_cast<Vec4V*
>(f) = a;
274 *
reinterpret_cast<PxVec4*
>(f) = *
reinterpret_cast<const PxVec4*
>(&a.x);
279 *
reinterpret_cast<BoolV*
>(f) = a;
284 *
reinterpret_cast<VecU32V*
>(u) = uv;
289 *
reinterpret_cast<VecI32V*
>(i) = iv;
294 return Vec4V(f[0], f[1], f[2], f[3]);
299 return Vec4V(f[0], f[1], f[2], 0.0f);
304 return BoolV(BOOL_TO_U32(f[0]), BOOL_TO_U32(f[1]), BOOL_TO_U32(f[2]), BOOL_TO_U32(f[3]));
314 f = PxVec3(a.x, a.y, a.z);
319 f = PxVec3(a.x, a.y, a.z);
348 return FLoad(PX_EPS_REAL);
359 return FLoad(PX_MAX_REAL);
365 return FLoad(-PX_MAX_REAL);
375 return FloatV(a.x + b.x);
380 return FloatV(a.x - b.x);
385 return FloatV(a.x * b.x);
390 VECMATHAOS_ASSERT(b.x != 0.0f);
391 return FloatV(a.x / b.x);
396 VECMATHAOS_ASSERT(b.x != 0.0f);
397 return FloatV(a.x / b.x);
402 VECMATHAOS_ASSERT(a.x != 0.0f);
408 VECMATHAOS_ASSERT(a.x != 0.0f);
414 VECMATHAOS_ASSERT(a.x != 0.0f);
425 VECMATHAOS_ASSERT(a.x != 0.0f);
429PX_FORCE_INLINE FloatV FScaleAdd(
const FloatV a,
const FloatV b,
const FloatV c)
431 return FAdd(FMul(a, b), c);
434PX_FORCE_INLINE FloatV FNegScaleSub(
const FloatV a,
const FloatV b,
const FloatV c)
436 return FSub(c, FMul(a, b));
441 return FloatV(
PxAbs(a.x));
444PX_FORCE_INLINE FloatV FSel(
const BoolV c,
const FloatV a,
const FloatV b)
446 return FloatV(c.ux ? a.x : b.x);
451 return BLoad(a.x > b.x);
456 return BLoad(a.x >= b.x);
461 return BLoad(a.x == b.x);
466 return (a.x > b.x ? FloatV(a.x) : FloatV(b.x));
471 return (a.x > b.x ? FloatV(b.x) : FloatV(a.x));
474PX_FORCE_INLINE FloatV FClamp(
const FloatV a,
const FloatV minV,
const FloatV maxV)
476 return FMax(FMin(a, maxV), minV);
481 return BOOL_TO_U32(a.x > b.x);
486 return BOOL_TO_U32(a.x >= b.x);
490 return BOOL_TO_U32(a.x == b.x);
495 return floorf(a.x + 0.5f);
508PX_FORCE_INLINE PxU32 FOutOfBounds(
const FloatV a,
const FloatV min,
const FloatV max)
510 return BOOL_TO_U32(a.x > max.x || a.x < min.x);
513PX_FORCE_INLINE PxU32 FInBounds(
const FloatV a,
const FloatV min,
const FloatV max)
515 return BOOL_TO_U32(a.x >= min.x && a.x <= max.x);
520 return FOutOfBounds(a, FNeg(bounds), bounds);
525 return FInBounds(a, FNeg(bounds), bounds);
534 return Vec3V(f.x, f.x, f.x);
537PX_FORCE_INLINE Vec3V V3Merge(
const FloatVArg x,
const FloatVArg y,
const FloatVArg z)
539 return Vec3V(x.x, y.x, z.x);
544 return Vec3V(1.0f, 0.0f, 0.0f);
549 return Vec3V(0.0f, 1.0f, 0.0f);
554 return Vec3V(0.0f, 0.0f, 1.0f);
574 return Vec3V(f.x, v.y, v.z);
579 return Vec3V(v.x, f.x, v.z);
584 return Vec3V(v.x, v.y, f.x);
587PX_FORCE_INLINE Vec3V V3ColX(
const Vec3V a,
const Vec3V b,
const Vec3V c)
589 return Vec3V(a.x, b.x, c.x);
592PX_FORCE_INLINE Vec3V V3ColY(
const Vec3V a,
const Vec3V b,
const Vec3V c)
594 return Vec3V(a.y, b.y, c.y);
597PX_FORCE_INLINE Vec3V V3ColZ(
const Vec3V a,
const Vec3V b,
const Vec3V c)
599 return Vec3V(a.z, b.z, c.z);
614 return V3Load(PX_EPS_REAL);
619 return Vec3V(-c.x, -c.y, -c.z);
624 return Vec3V(a.x + b.x, a.y + b.y, a.z + b.z);
629 return Vec3V(a.x - b.x, a.y - b.y, a.z - b.z);
634 return Vec3V(a.x * b.x, a.y * b.x, a.z * b.x);
639 return Vec3V(a.x * b.x, a.y * b.y, a.z * b.z);
644 const PxF32 bInv = 1.0f / b.x;
645 return Vec3V(a.x * bInv, a.y * bInv, a.z * bInv);
650 return Vec3V(a.x / b.x, a.y / b.y, a.z / b.z);
655 const PxF32 bInv = 1.0f / b.x;
656 return Vec3V(a.x * bInv, a.y * bInv, a.z * bInv);
661 return Vec3V(a.x / b.x, a.y / b.y, a.z / b.z);
666 return Vec3V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z);
671 return Vec3V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z);
684PX_FORCE_INLINE Vec3V V3ScaleAdd(
const Vec3V a,
const FloatV b,
const Vec3V c)
686 return V3Add(V3Scale(a, b), c);
689PX_FORCE_INLINE Vec3V V3NegScaleSub(
const Vec3V a,
const FloatV b,
const Vec3V c)
691 return V3Sub(c, V3Scale(a, b));
694PX_FORCE_INLINE Vec3V V3MulAdd(
const Vec3V a,
const Vec3V b,
const Vec3V c)
696 return V3Add(V3Mul(a, b), c);
699PX_FORCE_INLINE Vec3V V3NegMulSub(
const Vec3V a,
const Vec3V b,
const Vec3V c)
701 return V3Sub(c, V3Mul(a, b));
706 return FloatV(a.x * b.x + a.y * b.y + a.z * b.z);
716 return Vec3V(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
721 return FloatV(
PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z));
726 return FloatV(a.x * a.x + a.y * a.y + a.z * a.z);
731 VECMATHAOS_ASSERT(a.x != 0 || a.y != 0 || a.z != 0);
732 const PxF32 lengthInv = 1.0f /
PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z);
733 return Vec3V(a.x * lengthInv, a.y * lengthInv, a.z * lengthInv);
736PX_FORCE_INLINE Vec3V V3NormalizeSafe(
const Vec3V a,
const Vec3V unsafeReturnValue)
738 const PxF32 length =
PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z);
739 if(PX_EPS_REAL >= length)
741 return unsafeReturnValue;
745 const PxF32 lengthInv = 1.0f / length;
746 return Vec3V(a.x * lengthInv, a.y * lengthInv, a.z * lengthInv);
752 VECMATHAOS_ASSERT(a.x != 0 || a.y != 0 || a.z != 0);
753 const PxF32 lengthInv = 1.0f /
PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z);
754 return Vec3V(a.x * lengthInv, a.y * lengthInv, a.z * lengthInv);
757PX_FORCE_INLINE Vec3V V3Sel(
const BoolV c,
const Vec3V a,
const Vec3V b)
759 return Vec3V(c.ux ? a.x : b.x, c.uy ? a.y : b.y, c.uz ? a.z : b.z);
764 return BoolV(BOOL_TO_U32(a.x > b.x), BOOL_TO_U32(a.y > b.y), BOOL_TO_U32(a.z > b.z), FALSE_TO_U32);
769 return BoolV(BOOL_TO_U32(a.x >= b.x), BOOL_TO_U32(a.y >= b.y), BOOL_TO_U32(a.z >= b.z), TRUE_TO_U32);
774 return BoolV(BOOL_TO_U32(a.x == b.x), BOOL_TO_U32(a.y == b.y), BOOL_TO_U32(a.z == b.z), TRUE_TO_U32);
779 return Vec3V(a.x > b.x ? a.x : b.x, a.y > b.y ? a.y : b.y, a.z > b.z ? a.z : b.z);
784 return Vec3V(a.x < b.x ? a.x : b.x, a.y < b.y ? a.y : b.y, a.z < b.z ? a.z : b.z);
789 const PxF32 t0 = (a.x >= a.y) ? a.x : a.y;
790 return t0 >= a.z ? t0 : a.z;
795 const PxF32 t0 = (a.x <= a.y) ? a.x : a.y;
796 return t0 <= a.z ? t0 : a.z;
802 return Vec3V((a.x >= 0.f ? 1.f : -1.f), (a.y >= 0.f ? 1.f : -1.f), (a.z >= 0.f ? 1.f : -1.f));
805PX_FORCE_INLINE Vec3V V3Clamp(
const Vec3V a,
const Vec3V minV,
const Vec3V maxV)
807 return V3Max(V3Min(a, maxV), minV);
812 return V3Max(a, V3Neg(a));
817 return BOOL_TO_U32((a.x > b.x) & (a.y > b.y) & (a.z > b.z));
822 return BOOL_TO_U32((a.x >= b.x) & (a.y >= b.y) & (a.z >= b.z));
827 return BOOL_TO_U32((a.x == b.x) & (a.y == b.y) & (a.z == b.z));
832 return Vec3V(floorf(a.x + 0.5f), floorf(a.y + 0.5f), floorf(a.z + 0.5f));
837 return Vec3V(sinf(a.x), sinf(a.y), sinf(a.z));
842 return Vec3V(cosf(a.x), cosf(a.y), cosf(a.z));
847 return Vec3V(a.y, a.z, a.z);
852 return Vec3V(a.x, a.y, a.x);
857 return Vec3V(a.y, a.z, a.x);
862 return Vec3V(a.z, a.x, a.y);
867 return Vec3V(a.z, a.z, a.y);
872 return Vec3V(a.y, a.x, a.x);
877 return Vec3V(0.0f, v1.z, v0.y);
882 return Vec3V(v0.z, 0.0f, v1.x);
887 return Vec3V(v1.y, v0.x, 0.0f);
892 return FloatV(a.x + a.y + a.z);
895PX_FORCE_INLINE PxU32 V3OutOfBounds(
const Vec3V a,
const Vec3V min,
const Vec3V max)
897 return BOOL_TO_U32(a.x > max.x || a.y > max.y || a.z > max.z || a.x < min.x || a.y < min.y || a.z < min.z);
900PX_FORCE_INLINE PxU32 V3InBounds(
const Vec3V a,
const Vec3V min,
const Vec3V max)
902 return BOOL_TO_U32(a.x <= max.x && a.y <= max.y && a.z <= max.z && a.x >= min.x && a.y >= min.y && a.z >= min.z);
907 return V3OutOfBounds(a, V3Neg(bounds), bounds);
912 return V3InBounds(a, V3Neg(bounds), bounds);
917 const PxF32 t01 = col0.y, t02 = col0.z, t12 = col1.z;
932 return Vec4V(f.x, f.x, f.x, f.x);
937 return Vec4V(floatVArray[0].x, floatVArray[1].x, floatVArray[2].x, floatVArray[3].x);
940PX_FORCE_INLINE Vec4V V4Merge(
const FloatVArg x,
const FloatVArg y,
const FloatVArg z,
const FloatVArg w)
942 return Vec4V(x.x, y.x, z.x, w.x);
945PX_FORCE_INLINE Vec4V V4MergeW(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
947 return Vec4V(x.w, y.w, z.w, w.w);
950PX_FORCE_INLINE Vec4V V4MergeZ(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
952 return Vec4V(x.z, y.z, z.z, w.z);
955PX_FORCE_INLINE Vec4V V4MergeY(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
957 return Vec4V(x.y, y.y, z.y, w.y);
960PX_FORCE_INLINE Vec4V V4MergeX(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
962 return Vec4V(x.x, y.x, z.x, w.x);
967 return Vec4V(a.x, b.x, a.y, b.y);
972 return Vec4V(a.z, b.z, a.w, b.w);
977 return Vec4V(1.0f, 0.0f, 0.0f, 0.0f);
982 return Vec4V(0.0f, 1.0f, 0.0f, 0.0f);
987 return Vec4V(0.0f, 0.0f, 1.0f, 0.0f);
992 return Vec4V(0.0f, 0.0f, 0.0f, 1.0f);
1017 return Vec4V(f.x, v.y, v.z, v.w);
1022 return Vec4V(v.x, f.x, v.z, v.w);
1027 return Vec4V(v.x, v.y, f.x, v.w);
1032 return Vec4V(v.x, v.y, v.z, f.x);
1037 return Vec4V(v.x, v.y, v.z, f.x);
1042 return Vec4V(v.x, v.y, v.z, 0.0f);
1047 return Vec4V(v.y, v.x, v.w, v.z);
1052 return Vec4V(v.x, v.z, v.x, v.z);
1057 return Vec4V(v.y, v.w, v.y, v.w);
1062 return Vec4V(v.y, v.z, v.x, v.w);
1067 return Vec4V(v.z, v.w, v.x, v.y);
1070template <PxU8 _x, PxU8 _y, PxU8 _z, PxU8 _w>
1073 const PxF32 f[4] = { v.x, v.y, v.z, v.w };
1074 return Vec4V(f[_x], f[_y], f[_z], f[_w]);
1079 return V4Load(0.0f);
1084 return V4Load(1.0f);
1089 return V4Load(PX_EPS_REAL);
1094 return Vec4V(-c.x, -c.y, -c.z, -c.w);
1099 return Vec4V(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
1104 return Vec4V(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
1109 return Vec4V(a.x * b.x, a.y * b.x, a.z * b.x, a.w * b.x);
1114 return Vec4V(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
1119 const PxF32 bInv = 1.0f / b.x;
1120 return Vec4V(a.x * bInv, a.y * bInv, a.z * bInv, a.w * bInv);
1125 VECMATHAOS_ASSERT(b.x != 0 && b.y != 0 && b.z != 0 && b.w != 0);
1126 return Vec4V(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w);
1131 const PxF32 bInv = 1.0f / b.x;
1132 return Vec4V(a.x * bInv, a.y * bInv, a.z * bInv, a.w * bInv);
1137 return Vec4V(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w);
1142 return Vec4V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z, 1.0f / a.w);
1147 return Vec4V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z, 1.0f / a.w);
1165PX_FORCE_INLINE Vec4V V4ScaleAdd(
const Vec4V a,
const FloatV b,
const Vec4V c)
1167 return V4Add(V4Scale(a, b), c);
1170PX_FORCE_INLINE Vec4V V4NegScaleSub(
const Vec4V a,
const FloatV b,
const Vec4V c)
1172 return V4Sub(c, V4Scale(a, b));
1175PX_FORCE_INLINE Vec4V V4MulAdd(
const Vec4V a,
const Vec4V b,
const Vec4V c)
1177 return V4Add(V4Mul(a, b), c);
1180PX_FORCE_INLINE Vec4V V4NegMulSub(
const Vec4V a,
const Vec4V b,
const Vec4V c)
1182 return V4Sub(c, V4Mul(a, b));
1187 return FloatV(a.x + a.y + a.z + a.w);
1192 return FloatV(a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w);
1197 return FloatV(a.x * b.x + a.y * b.y + a.z * b.z);
1202 return Vec4V(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x, 0.0f);
1207 return FloatV(
PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z + a.w * a.w));
1217 VECMATHAOS_ASSERT(0 != a.x || 0 != a.y || 0 != a.z || 0 != a.w);
1218 const FloatV length = FloatV(V4Length(a));
1219 return V4ScaleInv(a, length);
1222PX_FORCE_INLINE Vec4V V4NormalizeSafe(
const Vec4V a,
const Vec4V unsafeReturnValue)
1224 const FloatV length = FloatV(V4Length(a));
1225 if(PX_EPS_REAL >= length.x)
1227 return unsafeReturnValue;
1231 return V4ScaleInv(a, length);
1236 VECMATHAOS_ASSERT(0 != a.x || 0 != a.y || 0 != a.z || 0 != a.w);
1237 const FloatV length = FloatV(V4Length(a));
1238 return V4ScaleInv(a, length);
1241PX_FORCE_INLINE Vec4V V4Sel(
const BoolV c,
const Vec4V a,
const Vec4V b)
1243 return Vec4V(c.ux ? a.x : b.x, c.uy ? a.y : b.y, c.uz ? a.z : b.z, c.uw ? a.w : b.w);
1248 return BoolV(BOOL_TO_U32(a.x > b.x), BOOL_TO_U32(a.y > b.y), BOOL_TO_U32(a.z > b.z), BOOL_TO_U32(a.w > b.w));
1253 return BoolV(BOOL_TO_U32(a.x >= b.x), BOOL_TO_U32(a.y >= b.y), BOOL_TO_U32(a.z >= b.z), BOOL_TO_U32(a.w >= b.w));
1258 return BoolV(BOOL_TO_U32(a.x == b.x), BOOL_TO_U32(a.y == b.y), BOOL_TO_U32(a.z == b.z), BOOL_TO_U32(a.w == b.w));
1263 return Vec4V(a.x > b.x ? a.x : b.x, a.y > b.y ? a.y : b.y, a.z > b.z ? a.z : b.z, a.w > b.w ? a.w : b.w);
1268 return Vec4V(a.x < b.x ? a.x : b.x, a.y < b.y ? a.y : b.y, a.z < b.z ? a.z : b.z, a.w < b.w ? a.w : b.w);
1273 const PxF32 t0 = (a.x >= a.y) ? a.x : a.y;
1274 const PxF32 t1 = (a.z >= a.w) ? a.x : a.w;
1275 return t0 >= t1 ? t0 : t1;
1280 const PxF32 t0 = (a.x <= a.y) ? a.x : a.y;
1281 const PxF32 t1 = (a.z <= a.w) ? a.x : a.w;
1282 return t0 <= t1 ? t0 : t1;
1285PX_FORCE_INLINE Vec4V V4Clamp(
const Vec4V a,
const Vec4V minV,
const Vec4V maxV)
1287 return V4Max(V4Min(a, maxV), minV);
1292 return Vec4V(floorf(a.x + 0.5f), floorf(a.y + 0.5f), floorf(a.z + 0.5f), floorf(a.w + 0.5f));
1297 return Vec4V(sinf(a.x), sinf(a.y), sinf(a.z), sinf(a.w));
1302 return Vec4V(cosf(a.x), cosf(a.y), cosf(a.z), cosf(a.w));
1307 return BOOL_TO_U32((a.x > b.x) & (a.y > b.y) & (a.z > b.z) & (a.w > b.w));
1312 return BOOL_TO_U32((a.x >= b.x) & (a.y >= b.y) & (a.z >= b.z) & (a.w >= b.w));
1317 return BOOL_TO_U32((a.x >= b.x) & (a.y >= b.y) & (a.z >= b.z));
1322 return BOOL_TO_U32((a.x == b.x) & (a.y == b.y) & (a.z == b.z) & (a.w == b.w));
1327 return BOOL_TO_U32((a.x > b.x) | (a.y > b.y) | (a.z > b.z));
1330PX_FORCE_INLINE void V4Transpose(Vec4V& col0, Vec4V& col1, Vec4V& col2, Vec4V& col3)
1332 const PxF32 t01 = col0.y, t02 = col0.z, t03 = col0.w;
1333 const PxF32 t12 = col1.z, t13 = col1.w;
1334 const PxF32 t23 = col2.w;
1351 return BoolV(FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32);
1355 return BoolV(FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32);
1359 return BoolV(FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32);
1363 return BoolV(FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32);
1367 return BoolV(FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32);
1371 return BoolV(FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32);
1375 return BoolV(FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32);
1379 return BoolV(FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32);
1383 return BoolV(TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32);
1387 return BoolV(TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32);
1391 return BoolV(TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32);
1395 return BoolV(TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32);
1399 return BoolV(TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32);
1403 return BoolV(TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32);
1407 return BoolV(TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32);
1411 return BoolV(TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32);
1433 return BoolV(a.ux, a.ux, a.ux, a.ux);
1438 return BoolV(a.uy, a.uy, a.uy, a.uy);
1443 return BoolV(a.uz, a.uz, a.uz, a.uz);
1448 return BoolV(a.uw, a.uw, a.uw, a.uw);
1453 return BoolV(f.ux, v.uy, v.uz, v.uw);
1458 return BoolV(v.ux, f.uy, v.uz, v.uw);
1463 return BoolV(v.ux, v.uy, f.uz, v.uw);
1468 return BoolV(v.ux, v.uy, v.uz, f.uw);
1472BoolV BSplatElement(BoolV a)
1474 PxU32* b =
reinterpret_cast<PxU32*
>(&a);
1475 return BoolV(b[index], b[index], b[index], b[index]);
1480 return BoolV(BOOL_TO_U32(a.ux && b.ux), BOOL_TO_U32(a.uy && b.uy), BOOL_TO_U32(a.uz && b.uz), BOOL_TO_U32(a.uw && b.uw));
1485 return BoolV(a.ux & ~b.ux, a.uy & ~b.uy, a.uz & ~b.uz, a.uw & ~b.uw);
1490 return BoolV(~a.ux, ~a.uy, ~a.uz, ~a.uw);
1495 return BoolV(BOOL_TO_U32(a.ux || b.ux), BOOL_TO_U32(a.uy || b.uy), BOOL_TO_U32(a.uz || b.uz), BOOL_TO_U32(a.uw || b.uw));
1500 return (a.ux == b.ux && a.uy == b.uy && a.uz == b.uz && a.uw == b.uw ? 1 : 0);
1505 return BAllEq(a, BTTTT());
1510 return BAllEq(a, BFFFF());
1515 return (a.ux & a.uy & a.uz & a.uw) ? BTTTT() : BFFFF();
1520 return (a.ux | a.uy | a.uz | a.uw) ? BTTTT() : BFFFF();
1525 return (a.ux & a.uy & a.uz) ? BTTTT() : BFFFF();
1530 return (a.ux | a.uy | a.uz) ? BTTTT() : BFFFF();
1535 return (a.ux & 1) | (a.uy & 2) | (a.uz & 4) | (a.uw & 8);
1544 return Vec3V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z, a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z,
1545 a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z);
1550 return Vec3V(a.col0.x * b.x + a.col0.y * b.y + a.col0.z * b.z, a.col1.x * b.x + a.col1.y * b.y + a.col1.z * b.z,
1551 a.col2.x * b.x + a.col2.y * b.y + a.col2.z * b.z);
1554PX_FORCE_INLINE Vec3V M33MulV3AddV3(
const Mat33V& A,
const Vec3V b,
const Vec3V c)
1556 const FloatV x = V3GetX(b);
1557 const FloatV y = V3GetY(b);
1558 const FloatV z = V3GetZ(b);
1559 Vec3V result = V3ScaleAdd(A.col0, x, c);
1560 result = V3ScaleAdd(A.col1, y, result);
1561 return V3ScaleAdd(A.col2, z, result);
1566 return Mat33V(M33MulV3(a, b.col0), M33MulV3(a, b.col1), M33MulV3(a, b.col2));
1571 return Mat33V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2));
1576 return Mat33V(V3Scale(a.col0, b), V3Scale(a.col1, b), V3Scale(a.col2, b));
1581 return Mat33V(V3Sub(a.col0, b.col0), V3Sub(a.col1, b.col1), V3Sub(a.col2, b.col2));
1586 return Mat33V(V3Neg(a.col0), V3Neg(a.col1), V3Neg(a.col2));
1591 return Mat33V(V3Abs(a.col0), V3Abs(a.col1), V3Abs(a.col2));
1596 const Vec3V x = V3Mul(V3UnitX(), d);
1597 const Vec3V y = V3Mul(V3UnitY(), d);
1598 const Vec3V z = V3Mul(V3UnitZ(), d);
1599 return Mat33V(x, y, z);
1604 const PxF32 det = a.col0.x * (a.col1.y * a.col2.z - a.col1.z * a.col2.y) -
1605 a.col1.x * (a.col0.y * a.col2.z - a.col2.y * a.col0.z) +
1606 a.col2.x * (a.col0.y * a.col1.z - a.col1.y * a.col0.z);
1608 const PxF32 invDet = 1.0f / det;
1611 ret.col0.x = invDet * (a.col1.y * a.col2.z - a.col2.y * a.col1.z);
1612 ret.col0.y = invDet * (a.col2.y * a.col0.z - a.col0.y * a.col2.z);
1613 ret.col0.z = invDet * (a.col0.y * a.col1.z - a.col1.y * a.col0.z);
1615 ret.col1.x = invDet * (a.col2.x * a.col1.z - a.col1.x * a.col2.z);
1616 ret.col1.y = invDet * (a.col0.x * a.col2.z - a.col2.x * a.col0.z);
1617 ret.col1.z = invDet * (a.col1.x * a.col0.z - a.col0.x * a.col1.z);
1619 ret.col2.x = invDet * (a.col1.x * a.col2.y - a.col2.x * a.col1.y);
1620 ret.col2.y = invDet * (a.col2.x * a.col0.y - a.col0.x * a.col2.y);
1621 ret.col2.z = invDet * (a.col0.x * a.col1.y - a.col1.x * a.col0.y);
1628 return Mat33V(V3LoadU(m.column0), V3LoadU(m.column1), V3LoadU(m.column2));
1631PX_FORCE_INLINE void PxMat33_From_Mat33V(
const Mat33V& m, PxMat33& out)
1633 PX_ASSERT((
size_t(&out) & 15) == 0);
1634 V3StoreU(m.col0, out.column0);
1635 V3StoreU(m.col1, out.column1);
1636 V3StoreU(m.col2, out.column2);
1641 return Mat33V(Vec3V(a.col0.x, a.col1.x, a.col2.x), Vec3V(a.col0.y, a.col1.y, a.col2.y),
1642 Vec3V(a.col0.z, a.col1.z, a.col2.z));
1647 return Mat33V(V3UnitX(), V3UnitY(), V3UnitZ());
1656 return Vec3V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z + a.col3.x,
1657 a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z + a.col3.y,
1658 a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z + a.col3.z);
1663 return Vec3V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z, a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z,
1664 a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z);
1669 return Vec3V(a.col0.x * b.x + a.col0.y * b.y + a.col0.z * b.z, a.col1.x * b.x + a.col1.y * b.y + a.col1.z * b.z,
1670 a.col2.x * b.x + a.col2.y * b.y + a.col2.z * b.z);
1675 return Mat34V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2), M34MulV3(a, b.col3));
1680 return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
1685 return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
1690 return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
1695 return Mat34V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2), V3Add(a.col3, b.col3));
1700 return Mat33V(Vec3V(a.col0.x, a.col1.x, a.col2.x), Vec3V(a.col0.y, a.col1.y, a.col2.y),
1701 Vec3V(a.col0.z, a.col1.z, a.col2.z));
1710 return Vec4V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z + a.col3.x * b.w,
1711 a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z + a.col3.y * b.w,
1712 a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z + a.col3.z * b.w,
1713 a.col0.w * b.x + a.col1.w * b.y + a.col2.w * b.z + a.col3.w * b.w);
1718 return Vec4V(a.col0.x * b.x + a.col0.y * b.y + a.col0.z * b.z + a.col0.w * b.w,
1719 a.col1.x * b.x + a.col1.y * b.y + a.col1.z * b.z + a.col1.w * b.w,
1720 a.col2.x * b.x + a.col2.y * b.y + a.col2.z * b.z + a.col2.w * b.w,
1721 a.col3.x * b.x + a.col3.y * b.y + a.col3.z * b.z + a.col3.w * b.w);
1726 return Mat44V(M44MulV4(a, b.col0), M44MulV4(a, b.col1), M44MulV4(a, b.col2), M44MulV4(a, b.col3));
1731 return Mat44V(V4Add(a.col0, b.col0), V4Add(a.col1, b.col1), V4Add(a.col2, b.col2), V4Add(a.col3, b.col3));
1740 const PxF32 src[16] = { a.col0.x, a.col0.y, a.col0.z, a.col0.w, a.col1.x, a.col1.y, a.col1.z, a.col1.w,
1741 a.col2.x, a.col2.y, a.col2.z, a.col2.w, a.col3.x, a.col3.y, a.col3.z, a.col3.w };
1743 tmp[0] = src[10] * src[15];
1744 tmp[1] = src[11] * src[14];
1745 tmp[2] = src[9] * src[15];
1746 tmp[3] = src[11] * src[13];
1747 tmp[4] = src[9] * src[14];
1748 tmp[5] = src[10] * src[13];
1749 tmp[6] = src[8] * src[15];
1750 tmp[7] = src[11] * src[12];
1751 tmp[8] = src[8] * src[14];
1752 tmp[9] = src[10] * src[12];
1753 tmp[10] = src[8] * src[13];
1754 tmp[11] = src[9] * src[12];
1756 dst[0] = tmp[0] * src[5] + tmp[3] * src[6] + tmp[4] * src[7];
1757 dst[0] -= tmp[1] * src[5] + tmp[2] * src[6] + tmp[5] * src[7];
1758 dst[1] = tmp[1] * src[4] + tmp[6] * src[6] + tmp[9] * src[7];
1759 dst[1] -= tmp[0] * src[4] + tmp[7] * src[6] + tmp[8] * src[7];
1760 dst[2] = tmp[2] * src[4] + tmp[7] * src[5] + tmp[10] * src[7];
1761 dst[2] -= tmp[3] * src[4] + tmp[6] * src[5] + tmp[11] * src[7];
1762 dst[3] = tmp[5] * src[4] + tmp[8] * src[5] + tmp[11] * src[6];
1763 dst[3] -= tmp[4] * src[4] + tmp[9] * src[5] + tmp[10] * src[6];
1764 dst[4] = tmp[1] * src[1] + tmp[2] * src[2] + tmp[5] * src[3];
1765 dst[4] -= tmp[0] * src[1] + tmp[3] * src[2] + tmp[4] * src[3];
1766 dst[5] = tmp[0] * src[0] + tmp[7] * src[2] + tmp[8] * src[3];
1767 dst[5] -= tmp[1] * src[0] + tmp[6] * src[2] + tmp[9] * src[3];
1768 dst[6] = tmp[3] * src[0] + tmp[6] * src[1] + tmp[11] * src[3];
1769 dst[6] -= tmp[2] * src[0] + tmp[7] * src[1] + tmp[10] * src[3];
1770 dst[7] = tmp[4] * src[0] + tmp[9] * src[1] + tmp[10] * src[2];
1771 dst[7] -= tmp[5] * src[0] + tmp[8] * src[1] + tmp[11] * src[2];
1773 tmp[0] = src[2] * src[7];
1774 tmp[1] = src[3] * src[6];
1775 tmp[2] = src[1] * src[7];
1776 tmp[3] = src[3] * src[5];
1777 tmp[4] = src[1] * src[6];
1778 tmp[5] = src[2] * src[5];
1779 tmp[6] = src[0] * src[7];
1780 tmp[7] = src[3] * src[4];
1781 tmp[8] = src[0] * src[6];
1782 tmp[9] = src[2] * src[4];
1783 tmp[10] = src[0] * src[5];
1784 tmp[11] = src[1] * src[4];
1786 dst[8] = tmp[0] * src[13] + tmp[3] * src[14] + tmp[4] * src[15];
1787 dst[8] -= tmp[1] * src[13] + tmp[2] * src[14] + tmp[5] * src[15];
1788 dst[9] = tmp[1] * src[12] + tmp[6] * src[14] + tmp[9] * src[15];
1789 dst[9] -= tmp[0] * src[12] + tmp[7] * src[14] + tmp[8] * src[15];
1790 dst[10] = tmp[2] * src[12] + tmp[7] * src[13] + tmp[10] * src[15];
1791 dst[10] -= tmp[3] * src[12] + tmp[6] * src[13] + tmp[11] * src[15];
1792 dst[11] = tmp[5] * src[12] + tmp[8] * src[13] + tmp[11] * src[14];
1793 dst[11] -= tmp[4] * src[12] + tmp[9] * src[13] + tmp[10] * src[14];
1794 dst[12] = tmp[2] * src[10] + tmp[5] * src[11] + tmp[1] * src[9];
1795 dst[12] -= tmp[4] * src[11] + tmp[0] * src[9] + tmp[3] * src[10];
1796 dst[13] = tmp[8] * src[11] + tmp[0] * src[8] + tmp[7] * src[10];
1797 dst[13] -= tmp[6] * src[10] + tmp[9] * src[11] + tmp[1] * src[8];
1798 dst[14] = tmp[6] * src[9] + tmp[11] * src[11] + tmp[3] * src[8];
1799 dst[14] -= tmp[10] * src[11] + tmp[2] * src[8] + tmp[7] * src[9];
1800 dst[15] = tmp[10] * src[10] + tmp[4] * src[8] + tmp[9] * src[9];
1801 dst[15] -= tmp[8] * src[9] + tmp[11] * src[10] + tmp[5] * src[8];
1803 det = src[0] * dst[0] + src[1] * dst[1] + src[2] * dst[2] + src[3] * dst[3];
1806 for(PxU32 j = 0; j < 16; j++)
1811 return Mat44V(Vec4V(dst[0], dst[4], dst[8], dst[12]), Vec4V(dst[1], dst[5], dst[9], dst[13]),
1812 Vec4V(dst[2], dst[6], dst[10], dst[14]), Vec4V(dst[3], dst[7], dst[11], dst[15]));
1817 return Mat44V(Vec4V(a.col0.x, a.col1.x, a.col2.x, a.col3.x), Vec4V(a.col0.y, a.col1.y, a.col2.y, a.col3.y),
1818 Vec4V(a.col0.z, a.col1.z, a.col2.z, a.col3.z), Vec4V(a.col0.w, a.col1.w, a.col2.w, a.col3.w));
1821PX_FORCE_INLINE Vec4V V4LoadXYZW(
const PxF32& x,
const PxF32& y,
const PxF32& z,
const PxF32& w)
1823 return Vec4V(x, y, z, w);
1841PX_FORCE_INLINE VecU32V V4U32Sel(
const BoolV c,
const VecU32V a,
const VecU32V b)
1843 return VecU32V(c.ux ? a.u32[0] : b.
u32[0], c.uy ? a.
u32[1] : b.
u32[1], c.uz ? a.
u32[2] : b.
u32[2],
1844 c.uw ? a.
u32[3] : b.
u32[3]);
1849 return VecU32V((a).u32[0] | (b).u32[0], (a).u32[1] | (b).u32[1], (a).u32[2] | (b).u32[2], (a).u32[3] | (b).u32[3]);
1854 return VecU32V((a).u32[0] ^ (b).u32[0], (a).u32[1] ^ (b).u32[1], (a).u32[2] ^ (b).u32[2], (a).u32[3] ^ (b).u32[3]);
1859 return VecU32V((a).u32[0] & (b).u32[0], (a).u32[1] & (b).u32[1], (a).u32[2] & (b).u32[2], (a).u32[3] & (b).u32[3]);
1864 return VecU32V((a).u32[0] & ~(b).u32[0], (a).u32[1] & ~(b).u32[1], (a).u32[2] & ~(b).u32[2],
1865 (a).u32[3] & ~(b).u32[3]);
1921 VecU32V r = V4U32Andc(*
reinterpret_cast<const VecU32V*
>(&a), b);
1922 return (*
reinterpret_cast<const Vec4V*
>(&r));
1927 return VecU32V(a.x > b.x ? 0xFFFFffff : 0, a.y > b.y ? 0xFFFFffff : 0, a.z > b.z ? 0xFFFFffff : 0,
1928 a.w > b.w ? 0xFFFFffff : 0);
1945 BOOL_TO_U16(a.u16[0] > b.u16[0]), BOOL_TO_U16(a.u16[1] > b.u16[1]), BOOL_TO_U16(a.u16[2] > b.u16[2]), BOOL_TO_U16(a.u16[3] > b.u16[3]),
1946 BOOL_TO_U16(a.u16[4] > b.u16[4]), BOOL_TO_U16(a.u16[5] > b.u16[5]), BOOL_TO_U16(a.u16[6] > b.u16[6]), BOOL_TO_U16(a.u16[7] > b.u16[7])
1954 BOOL_TO_U16(a.i16[0] > b.i16[0]), BOOL_TO_U16(a.i16[1] > b.i16[1]), BOOL_TO_U16(a.i16[2] > b.i16[2]), BOOL_TO_U16(a.i16[3] > b.i16[3]),
1955 BOOL_TO_U16(a.i16[4] > b.i16[4]), BOOL_TO_U16(a.i16[5] > b.i16[5]), BOOL_TO_U16(a.i16[6] > b.i16[6]), BOOL_TO_U16(a.i16[7] > b.i16[7])
1961 return Vec4V(PxF32((a).u32[0]), PxF32((a).u32[1]), PxF32((a).u32[2]), PxF32((a).u32[3]));
1966 return Vec4V(PxF32((a).i32[0]), PxF32((a).i32[1]), PxF32((a).i32[2]), PxF32((a).i32[3]));
1971 float* data =
reinterpret_cast<float*
>(&a);
1972 return VecI32V(PxI32(data[0]), PxI32(data[1]), PxI32(data[2]), PxI32(data[3]));
1977 Vec4V b = *
reinterpret_cast<Vec4V*
>(&a);
1983 Vec4V b = *
reinterpret_cast<Vec4V*
>(&a);
1989 VecU32V b = *
reinterpret_cast<VecU32V*
>(&a);
1995 VecI32V b = *
reinterpret_cast<VecI32V*
>(&a);
2002 return VecU32V((a).u32[index], (a).u32[index], (a).u32[index], (a).u32[index]);
2008 const PxU32 u = (&a.ux)[index];
2009 return VecU32V(u, u, u, u);
2015 float* data =
reinterpret_cast<float*
>(&a);
2016 return Vec4V(data[index], data[index], data[index], data[index]);
2021 return VecU32V(x, y, z, w);
2026 return V4Max(a, V4Neg(a));
2031 return BoolV(BOOL_TO_U32(a.u32[0] == b.u32[0]), BOOL_TO_U32(a.u32[1] == b.u32[1]), BOOL_TO_U32(a.u32[2] == b.u32[2]), BOOL_TO_U32(a.u32[3] == b.u32[3]));
2036 return VecU32V(i, i, i, i);
2041 return VecU32V(i[0], i[1], i[2], i[3]);
2046 return VecU32V(i[0], i[1], i[2], i[3]);
2049PX_FORCE_INLINE VecI32V I4LoadXYZW(
const PxI32& x,
const PxI32& y,
const PxI32& z,
const PxI32& w)
2051 return VecI32V(x, y, z, w);
2056 return VecI32V(i, i, i, i);
2061 return VecI32V(i[0], i[1], i[2], i[3]);
2066 return VecI32V(i[0], i[1], i[2], i[3]);
2069PX_FORCE_INLINE VecI32V VecI32V_Add(
const VecI32VArg a,
const VecI32VArg b)
2071 return VecI32V(a.i32[0] + b.i32[0], a.i32[1] + b.i32[1], a.i32[2] + b.i32[2], a.i32[3] + b.i32[3]);
2074PX_FORCE_INLINE VecI32V VecI32V_Sub(
const VecI32VArg a,
const VecI32VArg b)
2076 return VecI32V(a.i32[0] - b.i32[0], a.i32[1] - b.i32[1], a.i32[2] - b.i32[2], a.i32[3] - b.i32[3]);
2079PX_FORCE_INLINE BoolV VecI32V_IsGrtr(
const VecI32VArg a,
const VecI32VArg b)
2081 return BoolV(BOOL_TO_U32(a.i32[0] > b.i32[0]), BOOL_TO_U32(a.i32[1] > b.i32[1]), BOOL_TO_U32(a.i32[2] > b.i32[2]), BOOL_TO_U32(a.i32[3] > b.i32[3]));
2084PX_FORCE_INLINE BoolV VecI32V_IsEq(
const VecI32VArg a,
const VecI32VArg b)
2086 return BoolV(BOOL_TO_U32(a.i32[0] == b.i32[0]), BOOL_TO_U32(a.i32[1] == b.i32[1]), BOOL_TO_U32(a.i32[2] == b.i32[2]), BOOL_TO_U32(a.i32[3] == b.i32[3]));
2089PX_FORCE_INLINE VecI32V V4I32Sel(
const BoolV c,
const VecI32V a,
const VecI32V b)
2091 return VecI32V(c.ux ? a.i32[0] : b.
i32[0], c.uy ? a.
i32[1] : b.
i32[1], c.uz ? a.
i32[2] : b.
i32[2],
2092 c.uw ? a.
i32[3] : b.
i32[3]);
2097 return VecI32V(0, 0, 0, 0);
2102 return VecI32V(1, 1, 1, 1);
2107 return VecI32V(2, 2, 2, 2);
2112 return VecI32V(-1, -1, -1, -1);
2117 return VecU32V(0, 0, 0, 0);
2122 return VecU32V(1, 1, 1, 1);
2127 return VecU32V(2, 2, 2, 2);
2135PX_FORCE_INLINE VecI32V VecI32V_LeftShift(
const VecI32VArg a,
const VecShiftVArg count)
2137 return VecI32V(a.i32[0] << count.i32[0], a.i32[1] << count.i32[1], a.i32[2] << count.i32[2], a.i32[3]
2141PX_FORCE_INLINE VecI32V VecI32V_RightShift(
const VecI32VArg a,
const VecShiftVArg count)
2143 return VecI32V(a.i32[0] >> count.i32[0], a.i32[1] >> count.i32[1], a.i32[2] >> count.i32[2],
2144 a.i32[3] >> count.i32[3]);
2147PX_FORCE_INLINE VecI32V VecI32V_LeftShift(
const VecI32VArg a,
const PxU32 count)
2149 return VecI32V(a.i32[0] << count, a.i32[1] << count, a.i32[2] << count, a.i32[3] << count);
2152PX_FORCE_INLINE VecI32V VecI32V_RightShift(
const VecI32VArg a,
const PxU32 count)
2154 return VecI32V(a.i32[0] >> count, a.i32[1] >> count, a.i32[2] >> count, a.i32[3] >> count);
2157PX_FORCE_INLINE VecI32V VecI32V_And(
const VecI32VArg a,
const VecI32VArg b)
2159 return VecI32V(a.i32[0] & b.i32[0], a.i32[1] & b.i32[1], a.i32[2] & b.i32[2], a.i32[3] & b.i32[3]);
2162PX_FORCE_INLINE VecI32V VecI32V_Or(
const VecI32VArg a,
const VecI32VArg b)
2164 return VecI32V(a.i32[0] | b.i32[0], a.i32[1] | b.i32[1], a.i32[2] | b.i32[2], a.i32[3] | b.i32[3]);
2169 return VecI32V(a.i32[0], a.i32[0], a.i32[0], a.i32[0]);
2174 return VecI32V(a.i32[1], a.i32[1], a.i32[1], a.i32[1]);
2179 return VecI32V(a.i32[2], a.i32[2], a.i32[2], a.i32[2]);
2184 return VecI32V(a.i32[3], a.i32[3], a.i32[3], a.i32[3]);
2187PX_FORCE_INLINE VecI32V VecI32V_Sel(
const BoolV c,
const VecI32VArg a,
const VecI32VArg b)
2189 return VecI32V(c.ux ? a.i32[0] : b.
i32[0], c.uy ? a.
i32[1] : b.
i32[1], c.uz ? a.
i32[2] : b.
i32[2],
2190 c.uw ? a.
i32[3] : b.
i32[3]);
2193PX_FORCE_INLINE VecI32V VecI32V_Merge(
const VecI32VArg a,
const VecI32VArg b,
const VecI32VArg c,
const VecI32VArg d)
2195 return VecI32V(a.i32[0], b.i32[0], c.i32[0], d.i32[0]);
2205 return VecI32V(PxI32(b.ux), PxI32(b.uy), PxI32(b.uz), PxI32(b.uw));
2210 return VecU32V(b.ux, b.uy, b.uz, b.uw);
2213PX_FORCE_INLINE void QuatGetMat33V(
const QuatVArg q, Vec3V& column0, Vec3V& column1, Vec3V& column2)
2215 const FloatV one = FOne();
2216 const FloatV x = V4GetX(q);
2217 const FloatV y = V4GetY(q);
2218 const FloatV z = V4GetZ(q);
2219 const FloatV w = V4GetW(q);
2221 const FloatV x2 = FAdd(x, x);
2222 const FloatV y2 = FAdd(y, y);
2223 const FloatV z2 = FAdd(z, z);
2225 const FloatV xx = FMul(x2, x);
2226 const FloatV yy = FMul(y2, y);
2227 const FloatV zz = FMul(z2, z);
2229 const FloatV xy = FMul(x2, y);
2230 const FloatV xz = FMul(x2, z);
2231 const FloatV xw = FMul(x2, w);
2233 const FloatV yz = FMul(y2, z);
2234 const FloatV yw = FMul(y2, w);
2235 const FloatV zw = FMul(z2, w);
2237 const FloatV v = FSub(one, xx);
2239 column0 = V3Merge(FSub(FSub(one, yy), zz), FAdd(xy, zw), FSub(xz, yw));
2240 column1 = V3Merge(FSub(xy, zw), FSub(v, zz), FAdd(yz, xw));
2241 column2 = V3Merge(FAdd(xz, yw), FSub(yz, xw), FSub(v, yy));
#define PX_RESTRICT
Definition PxPreprocessor.h:355
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
int32 i32
Definition fwd.hpp:62
uint32 u32
Definition fwd.hpp:122
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
PX_CUDA_CALLABLE PX_FORCE_INLINE float PxAbs(float a)
abs returns the absolute value of its argument.
Definition PxMath.h:109
PX_CUDA_CALLABLE PX_FORCE_INLINE float PxRecipSqrt(float a)
reciprocal square root.
Definition PxMath.h:158
PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxIsFinite(float f)
returns true if the passed number is a finite floating point number as opposed to INF,...
Definition PxMath.h:326
PX_CUDA_CALLABLE PX_FORCE_INLINE float PxSqrt(float a)
Square root.
Definition PxMath.h:146