Advertisement
Guest User

Untitled

a guest
May 7th, 2012
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.56 KB | None | 0 0
  1.  
  2. std::array<bool, 4> IntersectBoxWithSphere(std::array<const Math::AABB*, 4> boxes, const Physics::Sphere& sphere) const {
  3. float radiusf = sphere.radius * sphere.radius;
  4. __m128 zero = _mm_setzero_ps();
  5. __m128 radius = _mm_load1_ps(&radiusf);
  6. __m128 centerx = _mm_load1_ps(&sphere.origin.x);
  7. __m128 centery = _mm_load1_ps(&sphere.origin.y);
  8. __m128 centerz = _mm_load1_ps(&sphere.origin.z);
  9. __m128 boxminx = _mm_loadu_ps(reinterpret_cast<const float*>(&boxes[0]->BottomLeftClosest));
  10. __m128 boxmaxx = _mm_loadu_ps(reinterpret_cast<const float*>(&boxes[0]->TopRightFurthest));
  11. __m128 boxminy = _mm_loadu_ps(reinterpret_cast<const float*>(&boxes[1]->BottomLeftClosest));
  12. __m128 boxmaxy = _mm_loadu_ps(reinterpret_cast<const float*>(&boxes[1]->TopRightFurthest));
  13. __m128 boxminz = _mm_loadu_ps(reinterpret_cast<const float*>(&boxes[2]->BottomLeftClosest));
  14. __m128 boxmaxz = _mm_loadu_ps(reinterpret_cast<const float*>(&boxes[2]->TopRightFurthest));
  15. __m128 e = _mm_loadu_ps(reinterpret_cast<const float*>(&boxes[3]->BottomLeftClosest));
  16. _MM_TRANSPOSE4_PS(boxminx, boxminy, boxminz, e);
  17. e = _mm_loadu_ps(reinterpret_cast<const float*>(&boxes[3]->TopRightFurthest));
  18. _MM_TRANSPOSE4_PS(boxmaxx, boxmaxy, boxmaxz, e);
  19.  
  20. // _mm_max_ps(_mm_sub_ps(boxmin, center), zero)
  21. boxminx = _mm_max_ps(_mm_sub_ps(boxminx, centerx), zero);
  22. boxminy = _mm_max_ps(_mm_sub_ps(boxminy, centery), zero);
  23. boxminz = _mm_max_ps(_mm_sub_ps(boxminz, centerz), zero);
  24.  
  25. // _mm_max_ps(_mm_sub_ps(center, boxmin), zero)
  26. boxmaxx = _mm_max_ps(_mm_sub_ps(centerx, boxmaxx), zero);
  27. boxmaxy = _mm_max_ps(_mm_sub_ps(centery, boxmaxy), zero);
  28. boxmaxz = _mm_max_ps(_mm_sub_ps(centerz, boxmaxz), zero);
  29.  
  30. e = _mm_add_ps(_mm_add_ps(boxminx, boxmaxx), _mm_add_ps(_mm_add_ps(boxminy, boxmaxy), _mm_add_ps(boxminz, boxmaxz)));
  31. e = _mm_cmple_ps(_mm_mul_ps(e, e), radius);
  32. float output[4];
  33. _mm_store_ps(output, e);
  34. std::array<bool, 4> ret;
  35. for(int i = 0; i < 4; i++) {
  36. ret[i] = output[i];
  37. }
  38. return ret;
  39. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement