48 : mOrigin(V3LoadU(origin_))
49 , mDir(V3LoadU(unitDir_))
50 , mDirYZX(V3PermYZX(mDir))
51 , mInflation(V3LoadU(inflation_))
52 , mAbsDir(V3Abs(mDir))
53 , mAbsDirYZX(V3PermYZX(mAbsDir))
55 const PxVec3 ext = maxDist >= PX_MAX_F32 ?
PxVec3( unitDir_.x == 0 ? origin_.x : PxSign(unitDir_.x)*PX_MAX_F32,
56 unitDir_.y == 0 ? origin_.y : PxSign(unitDir_.y)*PX_MAX_F32,
57 unitDir_.z == 0 ? origin_.z : PxSign(unitDir_.z)*PX_MAX_F32)
58 : origin_ + unitDir_ * maxDist;
59 mRayMin = V3Min(mOrigin, V3LoadU(ext));
60 mRayMax = V3Max(mOrigin, V3LoadU(ext));
65 const Vec3V ext = V3ScaleAdd(mDir, FLoad(distance), mOrigin);
66 mRayMin = V3Min(mOrigin, ext);
67 mRayMax = V3Max(mOrigin, ext);
70 template<
bool TInflate>
73 const Vec3V iExt = TInflate ? V3Add(extents, mInflation) : extents;
76 const Vec3V nodeMax = V3Add(center, iExt);
77 const Vec3V nodeMin = V3Sub(center, iExt);
80 const Vec3V offset = V3Sub(mOrigin, center);
81 const Vec3V offsetYZX = V3PermYZX(offset);
82 const Vec3V iExtYZX = V3PermYZX(iExt);
84 const Vec3V f = V3NegMulSub(mDirYZX, offset, V3Mul(mDir, offsetYZX));
85 const Vec3V g = V3MulAdd(iExt, mAbsDirYZX, V3Mul(iExtYZX, mAbsDir));
88 maskA = V3IsGrtrOrEq(nodeMax, mRayMin),
89 maskB = V3IsGrtrOrEq(mRayMax, nodeMin),
90 maskC = V3IsGrtrOrEq(g, V3Abs(f));
91 const BoolV andABCMasks = BAnd(BAnd(maskA, maskB), maskC);
93 return BAllEqTTTT(andABCMasks);
96 const Vec3V mOrigin, mDir, mDirYZX, mInflation, mAbsDir, mAbsDirYZX;
97 Vec3V mRayMin, mRayMax;
134 : mCenter(V3LoadU(t.p))
135 , mRadius2(FLoad(s.radius * s.radius))
139 : mCenter(V3LoadU(center))
140 , mRadius2(FLoad(radius * radius))
145 const Vec3V offset = V3Sub(mCenter, boxCenter);
146 const Vec3V closest = V3Clamp(offset, V3Neg(boxExtents), boxExtents);
147 const Vec3V d = V3Sub(offset, closest);
148 return PxIntBool(BAllEqTTTT(FIsGrtrOrEq(mRadius2, V3Dot(d, d))));
178 const Vec3V eps = V3Load(1e-6f);
181 mExtents = V3LoadU(halfExtentsInflated);
184 mRT = Mat33V_From_PxMat33(rot.getTranspose());
185 mART =
Mat33V(V3Add(V3Abs(mRT.col0), eps), V3Add(V3Abs(mRT.col1), eps), V3Add(V3Abs(mRT.col2), eps));
186 mBB_xyz = M33TrnspsMulV3(mART, mExtents);
190 const Vec3V eYZX = V3PermYZX(mExtents), eZXY = V3PermZXY(mExtents);
192 mBB_123 = V3MulAdd(eYZX, V3PermZXY(mART.col0), V3Mul(eZXY, V3PermYZX(mART.col0)));
193 mBB_456 = V3MulAdd(eYZX, V3PermZXY(mART.col1), V3Mul(eZXY, V3PermYZX(mART.col1)));
194 mBB_789 = V3MulAdd(eYZX, V3PermZXY(mART.col2), V3Mul(eZXY, V3PermYZX(mART.col2)));
199 PxIntBool operator()(
const Vec3V center,
const Vec3V extents)
const
201 const Vec3V t = V3Sub(mT, center);
204 if(V3OutOfBounds(t, V3Add(extents, mBB_xyz)))
207 const Vec3V rX = mRT.col0, rY = mRT.col1, rZ = mRT.col2;
208 const Vec3V arX = mART.col0, arY = mART.col1, arZ = mART.col2;
210 const FloatV eX = V3GetX(extents), eY = V3GetY(extents), eZ = V3GetZ(extents);
211 const FloatV tX = V3GetX(t), tY = V3GetY(t), tZ = V3GetZ(t);
215 const Vec3V v = V3ScaleAdd(rZ, tZ, V3ScaleAdd(rY, tY, V3Scale(rX, tX)));
216 const Vec3V v2 = V3ScaleAdd(arZ, eZ, V3ScaleAdd(arY, eY, V3ScaleAdd(arX, eX, mExtents)));
217 if(V3OutOfBounds(v, v2))
227 const Vec3V va = V3NegScaleSub(rZ, tY, V3Scale(rY, tZ));
228 const Vec3V va2 = V3ScaleAdd(arY, eZ, V3ScaleAdd(arZ, eY, mBB_123));
229 const BoolV ba = BOr(V3IsGrtr(va, va2), V3IsGrtr(V3Neg(va2), va));
231 const Vec3V vb = V3NegScaleSub(rX, tZ, V3Scale(rZ, tX));
232 const Vec3V vb2 = V3ScaleAdd(arX, eZ, V3ScaleAdd(arZ, eX, mBB_456));
233 const BoolV bb = BOr(V3IsGrtr(vb, vb2), V3IsGrtr(V3Neg(vb2), vb));
235 const Vec3V vc = V3NegScaleSub(rY, tX, V3Scale(rX, tY));
236 const Vec3V vc2 = V3ScaleAdd(arX, eY, V3ScaleAdd(arY, eX, mBB_789));
237 const BoolV bc = BOr(V3IsGrtr(vc, vc2), V3IsGrtr(V3Neg(vc2), vc));
239 return PxIntBool(BAllEqFFFF(BOr(ba, BOr(bb,bc))));