Advertisement
Guest User

Untitled

a guest
May 7th, 2012
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. std::array<bool, 4> IntersectBoxWithSphere(std::array<const Math::AABB*, 4> boxes, const Physics::Sphere& sphere) const {
  2. float radius = sphere.radius * sphere.radius;
  3. __m128 zero = _mm_setzero_ps();
  4. __m128 radius = _mm_load1_ps(&radius);
  5. __m128 centerx = _mm_load1_ps(&sphere.origin.x);
  6. __m128 centery = _mm_load1_ps(&sphere.origin.y);
  7. __m128 centerz = _mm_load1_ps(&sphere.origin.z);
  8. __m128 boxminx = _mm_loadu_ps(&box[0]->BottomLeftClosest);
  9. __m128 boxminy = _mm_loadu_ps(&box[1]->BottomLeftClosest);
  10. __m128 boxminz = _mm_loadu_ps(&box[2]->BottomLeftClosest);
  11. __m128 boxmaxx = _mm_loadu_ps(&box[3]->BottomLeftClosest);
  12. _MM_TRANSPOSE4_PS(boxminx, boxminy, boxminz, boxmaxx);
  13.  
  14. boxmaxx = _mm_loadu_ps(&box[0]->TopRightFurthest);
  15. __m128 boxmaxy = _mm_loadu_ps(&box[1]->TopRightFurthest);
  16. __m128 boxmaxz = _mm_loadu_ps(&box[2]->TopRightFurthest);
  17. __m128 temp1x = _mm_loadu_ps(&box[3]->TopRightFurthest);
  18. _MM_TRANSPOSE4_PS(boxmaxx, boxmaxy, boxmaxz, temp1x);
  19.  
  20. // _mm_max_ps(_mm_sub_ps(boxmin, center), zero)
  21. temp1x = _mm_sub_ps(boxminx, centerx);
  22. __m128 temp1y = _mm_sub_ps(boxminy, centery);
  23. __m128 temp1z = _mm_sub_ps(boxminz, centerz);
  24.  
  25. temp1x = _mm_max_ps(temp1x, zero);
  26. temp1y = _mm_max_py(temp1x, zero);
  27. temp1z = _mm_max_pz(temp1x, zero);
  28.  
  29. // _mm_max_ps(_mm_sub_ps(center, boxmin), zero)
  30. __m128 temp2x = _mm_sub_ps(centerx, boxmaxx);
  31. __m128 temp2y = _mm_sub_ps(centery, boxmaxy);
  32. __m128 temp2z = _mm_sub_ps(centerz, boxmaxz);
  33. temp2x = _mm_max_ps(temp2x, zero);
  34. temp2y = _mm_max_ps(temp2y, zero);
  35. temp2z = _mm_max_ps(temp2z, zero);
  36.  
  37. __m128 ex = _mm_add_ps(temp1x, temp2x);
  38. __m128 ey = _mm_add_ps(temp1y, temp2y);
  39. __m128 ez = _mm_add_ps(temp1z, temp2z);
  40. __m128 final_e = _mm_add_ps(ex, _mm_add_ps(ez, ey));
  41. __m128 result = _mm_cmple_ps(final_e, radius);
  42. float output[4];
  43. _mm_store_ps(output, result);
  44. std::array<bool, 4> ret;
  45. for(int i = 0; i < 4; i++) {
  46. ret[i] = output[i];
  47. }
  48. return ret;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement