Advertisement
Guest User

Untitled

a guest
Apr 12th, 2012
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.05 KB | None | 0 0
  1. char CBBox::Intersect4(const CRay4 &rRay, CFloat4 *fMin, CFloat4* fMax) const
  2. {
  3.     const __m128 mNearX = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMin.x), rRay.vOrigin.mData[0].m), rRay.vInvDirection.mData[0].m);
  4.     const __m128 mFarX = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMax.x), rRay.vOrigin.mData[0].m), rRay.vInvDirection.mData[0].m);
  5.     const __m128 mMinX1 = _mm_min_ps(mNearX, _mm_set1_ps(INFINITY));
  6.     const __m128 mMinX2 = _mm_min_ps(mFarX, _mm_set1_ps(INFINITY));
  7.     const __m128 mMaxX1 = _mm_max_ps(mNearX, _mm_set1_ps(-INFINITY));
  8.     const __m128 mMaxX2 = _mm_max_ps(mFarX, _mm_set1_ps(-INFINITY));
  9.    
  10.     __m128 mMin = _mm_min_ps(mMaxX1, mMaxX2);
  11.     __m128 mMax = _mm_max_ps(mMinX1, mMinX2);
  12.    
  13.     const __m128 mNearY = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMin.y), rRay.vOrigin.mData[1].m), rRay.vInvDirection.mData[1].m);
  14.     const __m128 mFarY = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMax.y), rRay.vOrigin.mData[1].m), rRay.vInvDirection.mData[1].m);
  15.     const __m128 mMinY1 = _mm_min_ps(mNearY, _mm_set1_ps(INFINITY));
  16.     const __m128 mMinY2 = _mm_min_ps(mFarY, _mm_set1_ps(INFINITY));
  17.     const __m128 mMaxY1 = _mm_max_ps(mNearY, _mm_set1_ps(-INFINITY));
  18.     const __m128 mMaxY2 = _mm_max_ps(mFarY, _mm_set1_ps(-INFINITY));
  19.    
  20.     mMin = _mm_max_ps(_mm_min_ps(mMaxY1, mMaxY2), mMin);
  21.     mMax = _mm_min_ps(_mm_max_ps(mMinY1, mMinY2), mMax);
  22.    
  23.     const __m128 mNearZ = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMin.z), rRay.vOrigin.mData[2].m), rRay.vInvDirection.mData[2].m);
  24.     const __m128 mFarZ = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMax.z), rRay.vOrigin.mData[2].m), rRay.vInvDirection.mData[2].m);
  25.     const __m128 mMinZ1 = _mm_min_ps(mNearZ, _mm_set1_ps(INFINITY));
  26.     const __m128 mMinZ2 = _mm_min_ps(mFarZ, _mm_set1_ps(INFINITY));
  27.     const __m128 mMaxZ1 = _mm_max_ps(mNearZ, _mm_set1_ps(-INFINITY));
  28.     const __m128 mMaxZ2 = _mm_max_ps(mFarZ, _mm_set1_ps(-INFINITY));
  29.    
  30.     mMin = _mm_max_ps(_mm_min_ps(mMaxZ1, mMaxZ2), mMin);
  31.     mMax = _mm_min_ps(_mm_max_ps(mMinZ1, mMinZ2), mMax);
  32.    
  33.     fMin->m = mMin;
  34.     fMax->m = mMax;
  35.    
  36.     return ~_mm_movemask_ps(_mm_or_ps(_mm_cmplt_ps(mMax, _mm_set1_ps(0.0f)), _mm_cmpgt_ps(mMin, mMax)));
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement