29#ifndef GU_BV4_BOX_BOX_OVERLAP_TEST_H
30#define GU_BV4_BOX_BOX_OVERLAP_TEST_H
32#ifndef GU_BV4_USE_SLABS
35 const Vec4V extentsV = V4LoadU(&extents.x);
37 const Vec4V TV = V4Sub(V4LoadA_Safe(¶ms->mTBoxToModel_PaddedAligned.x), V4LoadU(¢er.x));
39 const Vec4V absTV = V4Abs(TV);
40 const BoolV resTV = V4IsGrtr(absTV, V4Add(extentsV, V4LoadA_Safe(¶ms->mBB_PaddedAligned.x)));
41 const PxU32 test = BGetBitMask(resTV);
48 const Vec4V T_YZX_V = V4Perm<1, 2, 0, 3>(TV);
49 const Vec4V T_ZXY_V = V4Perm<2, 0, 1, 3>(TV);
51 tV = V4Mul(TV, V4LoadA_Safe(¶ms->mPreca0_PaddedAligned.x));
52 tV = V4Add(tV, V4Mul(T_YZX_V, V4LoadA_Safe(¶ms->mPreca1_PaddedAligned.x)));
53 tV = V4Add(tV, V4Mul(T_ZXY_V, V4LoadA_Safe(¶ms->mPreca2_PaddedAligned.x)));
58 const Vec4V extents_YZX_V = V4Perm<1, 2, 0, 3>(extentsV);
59 const Vec4V extents_ZXY_V = V4Perm<2, 0, 1, 3>(extentsV);
61 t2V = V4Mul(extentsV, V4LoadA_Safe(¶ms->mPreca0b_PaddedAligned.x));
62 t2V = V4Add(t2V, V4Mul(extents_YZX_V, V4LoadA_Safe(¶ms->mPreca1b_PaddedAligned.x)));
63 t2V = V4Add(t2V, V4Mul(extents_ZXY_V, V4LoadA_Safe(¶ms->mPreca2b_PaddedAligned.x)));
64 t2V = V4Add(t2V, V4LoadA_Safe(¶ms->mBoxExtents_PaddedAligned.x));
68 const Vec4V abstV = V4Abs(tV);
69 const BoolV resB = V4IsGrtr(abstV, t2V);
70 const PxU32 test = BGetBitMask(resB);
77#ifdef GU_BV4_QUANTIZED_TREE
82#if PX_INTEL_FAMILY && !defined(PX_SIMD_DISABLED)
86 SSE_CONST4(maskV, 0x7fffffff);
87 SSE_CONST4(maskQV, 0x0000ffff);
91 Vec4V centerV = V4LoadA((
float*)node->mAABB.mData);
92 __m128 extentsV = _mm_castsi128_ps(_mm_and_si128(_mm_castps_si128(centerV), SSE_CONST(maskQV)));
93 extentsV = V4Mul(_mm_cvtepi32_ps(_mm_castps_si128(extentsV)), V4LoadA_Safe(¶ms->mExtentsOrMaxCoeff_PaddedAligned.x));
94 centerV = _mm_castsi128_ps(_mm_srai_epi32(_mm_castps_si128(centerV), 16));
95 centerV = V4Mul(_mm_cvtepi32_ps(_mm_castps_si128(centerV)), V4LoadA_Safe(¶ms->mCenterOrMinCoeff_PaddedAligned.x));
97 const VecI32V centerVI = I4LoadA((PxI32*)node->mAABB.mData);
98 const VecI32V extentsVI = VecI32V_And(centerVI, I4Load(0x0000ffff));
99 const Vec4V extentsV = V4Mul(Vec4V_From_VecI32V(extentsVI), V4LoadA_Safe(¶ms->mExtentsOrMaxCoeff_PaddedAligned.x));
100 const VecI32V centerVShift = VecI32V_RightShift(centerVI, 16);
101 const Vec4V centerV = V4Mul(Vec4V_From_VecI32V(centerVShift), V4LoadA_Safe(¶ms->mCenterOrMinCoeff_PaddedAligned.x));
104 const Vec4V TV = V4Sub(V4LoadA_Safe(¶ms->mTBoxToModel_PaddedAligned.x), centerV);
107 const __m128 absTV = _mm_and_ps(TV, SSE_CONSTF(maskV));
109 const Vec4V absTV = V4Abs(TV);
111 const BoolV resTV = V4IsGrtr(absTV, V4Add(extentsV, V4LoadA_Safe(¶ms->mBB_PaddedAligned.x)));
112 const PxU32 test = BGetBitMask(resTV);
119 const Vec4V T_YZX_V = V4Perm<1, 2, 0, 3>(TV);
120 const Vec4V T_ZXY_V = V4Perm<2, 0, 1, 3>(TV);
122 tV = V4Mul(TV, V4LoadA_Safe(¶ms->mPreca0_PaddedAligned.x));
123 tV = V4Add(tV, V4Mul(T_YZX_V, V4LoadA_Safe(¶ms->mPreca1_PaddedAligned.x)));
124 tV = V4Add(tV, V4Mul(T_ZXY_V, V4LoadA_Safe(¶ms->mPreca2_PaddedAligned.x)));
129 const Vec4V extents_YZX_V = V4Perm<1, 2, 0, 3>(extentsV);
130 const Vec4V extents_ZXY_V = V4Perm<2, 0, 1, 3>(extentsV);
132 t2V = V4Mul(extentsV, V4LoadA_Safe(¶ms->mPreca0b_PaddedAligned.x));
133 t2V = V4Add(t2V, V4Mul(extents_YZX_V, V4LoadA_Safe(¶ms->mPreca1b_PaddedAligned.x)));
134 t2V = V4Add(t2V, V4Mul(extents_ZXY_V, V4LoadA_Safe(¶ms->mPreca2b_PaddedAligned.x)));
135 t2V = V4Add(t2V, V4LoadA_Safe(¶ms->mBoxExtents_PaddedAligned.x));
140 const __m128 abstV = _mm_and_ps(tV, SSE_CONSTF(maskV));
142 const Vec4V abstV = V4Abs(tV);
144 const BoolV resB = V4IsGrtr(abstV, t2V);
145 const PxU32 test = BGetBitMask(resB);
154#ifdef GU_BV4_USE_SLABS
157 const Vec4V TV = V4Sub(V4LoadA_Safe(¶ms->mTBoxToModel_PaddedAligned.x), boxCenter);
159 const Vec4V absTV = V4Abs(TV);
160 const BoolV res = V4IsGrtr(absTV, V4Add(extentsV, V4LoadA_Safe(¶ms->mBB_PaddedAligned.x)));
161 const PxU32 test = BGetBitMask(res);
168 const Vec4V T_YZX_V = V4Perm<1, 2, 0, 3>(TV);
169 const Vec4V T_ZXY_V = V4Perm<2, 0, 1, 3>(TV);
171 tV = V4Mul(TV, V4LoadA_Safe(¶ms->mPreca0_PaddedAligned.x));
172 tV = V4Add(tV, V4Mul(T_YZX_V, V4LoadA_Safe(¶ms->mPreca1_PaddedAligned.x)));
173 tV = V4Add(tV, V4Mul(T_ZXY_V, V4LoadA_Safe(¶ms->mPreca2_PaddedAligned.x)));
178 const Vec4V extents_YZX_V = V4Perm<1, 2, 0, 3>(extentsV);
179 const Vec4V extents_ZXY_V = V4Perm<2, 0, 1, 3>(extentsV);
181 t2V = V4Mul(extentsV, V4LoadA_Safe(¶ms->mPreca0b_PaddedAligned.x));
182 t2V = V4Add(t2V, V4Mul(extents_YZX_V, V4LoadA_Safe(¶ms->mPreca1b_PaddedAligned.x)));
183 t2V = V4Add(t2V, V4Mul(extents_ZXY_V, V4LoadA_Safe(¶ms->mPreca2b_PaddedAligned.x)));
184 t2V = V4Add(t2V, V4LoadA_Safe(¶ms->mBoxExtents_PaddedAligned.x));
188 const Vec4V abstV = V4Abs(tV);
189 const BoolV resB = V4IsGrtr(abstV, t2V);
190 const PxU32 test = BGetBitMask(resB);
#define PX_RESTRICT
Definition PxPreprocessor.h:355
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
Definition GuBV4_BoxOverlap_Internal.h:79