group2 0.1.0
CSE 125 Group 2
Loading...
Searching...
No Matches
SimdAabb.hpp
Go to the documentation of this file.
1
12
13#pragma once
14
15#include <cstdint>
16#include <glm/vec3.hpp>
17
18#if defined(__SSE2__) || defined(_M_X64) || defined(_M_IX86_FP)
19#define GROUP2_HAVE_SSE2 1
20#include <emmintrin.h>
21#else
22#define GROUP2_HAVE_SSE2 0
23#endif
24
26{
27
34inline uint32_t aabbBatchOverlap(const float (&minX)[4],
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],
40 glm::vec3 queryMin,
41 glm::vec3 queryMax) noexcept
42{
43#if GROUP2_HAVE_SSE2
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);
50
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);
57
58 // Overlap on axis a iff cMin[a] <= qMax[a] AND cMax[a] >= qMin[a].
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));
62
63 const __m128 all = _mm_and_ps(_mm_and_ps(xOk, yOk), zOk);
64 return static_cast<uint32_t>(_mm_movemask_ps(all));
65#else
66 uint32_t mask = 0;
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;
70 if (ok)
71 mask |= (1u << i);
72 }
73 return mask;
74#endif
75}
76
77} // namespace physics::simd
Definition SimdAabb.hpp:26
uint32_t aabbBatchOverlap(const float(&minX)[4], const float(&minY)[4], const float(&minZ)[4], const float(&maxX)[4], const float(&maxY)[4], const float(&maxZ)[4], glm::vec3 queryMin, glm::vec3 queryMax) noexcept
Test 4 candidate AABBs against one query AABB.
Definition SimdAabb.hpp:34