35 const float (&minY)[4],
36 const float (&minZ)[4],
37 const float (&maxX)[4],
38 const float (&maxY)[4],
39 const float (&maxZ)[4],
41 glm::vec3 queryMax)
noexcept
44 const __m128 qMinX = _mm_set1_ps(queryMin.x);
45 const __m128 qMinY = _mm_set1_ps(queryMin.y);
46 const __m128 qMinZ = _mm_set1_ps(queryMin.z);
47 const __m128 qMaxX = _mm_set1_ps(queryMax.x);
48 const __m128 qMaxY = _mm_set1_ps(queryMax.y);
49 const __m128 qMaxZ = _mm_set1_ps(queryMax.z);
51 const __m128 cMinX = _mm_loadu_ps(minX);
52 const __m128 cMinY = _mm_loadu_ps(minY);
53 const __m128 cMinZ = _mm_loadu_ps(minZ);
54 const __m128 cMaxX = _mm_loadu_ps(maxX);
55 const __m128 cMaxY = _mm_loadu_ps(maxY);
56 const __m128 cMaxZ = _mm_loadu_ps(maxZ);
59 const __m128 xOk = _mm_and_ps(_mm_cmple_ps(cMinX, qMaxX), _mm_cmpge_ps(cMaxX, qMinX));
60 const __m128 yOk = _mm_and_ps(_mm_cmple_ps(cMinY, qMaxY), _mm_cmpge_ps(cMaxY, qMinY));
61 const __m128 zOk = _mm_and_ps(_mm_cmple_ps(cMinZ, qMaxZ), _mm_cmpge_ps(cMaxZ, qMinZ));
63 const __m128 all = _mm_and_ps(_mm_and_ps(xOk, yOk), zOk);
64 return static_cast<uint32_t
>(_mm_movemask_ps(all));
67 for (
int i = 0; i < 4; ++i) {
68 const bool ok = minX[i] <= queryMax.x && maxX[i] >= queryMin.x && minY[i] <= queryMax.y &&
69 maxY[i] >= queryMin.y && minZ[i] <= queryMax.z && maxZ[i] >= queryMin.z;