Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- char CBBox::Intersect4(const CRay4 &rRay, CFloat4 *fMin, CFloat4* fMax) const
- {
- const __m128 mNearX = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMin.x), rRay.vOrigin.mData[0].m), rRay.vInvDirection.mData[0].m);
- const __m128 mFarX = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMax.x), rRay.vOrigin.mData[0].m), rRay.vInvDirection.mData[0].m);
- const __m128 mMinX1 = _mm_min_ps(mNearX, _mm_set1_ps(INFINITY));
- const __m128 mMinX2 = _mm_min_ps(mFarX, _mm_set1_ps(INFINITY));
- const __m128 mMaxX1 = _mm_max_ps(mNearX, _mm_set1_ps(-INFINITY));
- const __m128 mMaxX2 = _mm_max_ps(mFarX, _mm_set1_ps(-INFINITY));
- __m128 mMin = _mm_min_ps(mMaxX1, mMaxX2);
- __m128 mMax = _mm_max_ps(mMinX1, mMinX2);
- const __m128 mNearY = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMin.y), rRay.vOrigin.mData[1].m), rRay.vInvDirection.mData[1].m);
- const __m128 mFarY = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMax.y), rRay.vOrigin.mData[1].m), rRay.vInvDirection.mData[1].m);
- const __m128 mMinY1 = _mm_min_ps(mNearY, _mm_set1_ps(INFINITY));
- const __m128 mMinY2 = _mm_min_ps(mFarY, _mm_set1_ps(INFINITY));
- const __m128 mMaxY1 = _mm_max_ps(mNearY, _mm_set1_ps(-INFINITY));
- const __m128 mMaxY2 = _mm_max_ps(mFarY, _mm_set1_ps(-INFINITY));
- mMin = _mm_max_ps(_mm_min_ps(mMaxY1, mMaxY2), mMin);
- mMax = _mm_min_ps(_mm_max_ps(mMinY1, mMinY2), mMax);
- const __m128 mNearZ = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMin.z), rRay.vOrigin.mData[2].m), rRay.vInvDirection.mData[2].m);
- const __m128 mFarZ = _mm_mul_ps(_mm_sub_ps(_mm_set1_ps(vMax.z), rRay.vOrigin.mData[2].m), rRay.vInvDirection.mData[2].m);
- const __m128 mMinZ1 = _mm_min_ps(mNearZ, _mm_set1_ps(INFINITY));
- const __m128 mMinZ2 = _mm_min_ps(mFarZ, _mm_set1_ps(INFINITY));
- const __m128 mMaxZ1 = _mm_max_ps(mNearZ, _mm_set1_ps(-INFINITY));
- const __m128 mMaxZ2 = _mm_max_ps(mFarZ, _mm_set1_ps(-INFINITY));
- mMin = _mm_max_ps(_mm_min_ps(mMaxZ1, mMaxZ2), mMin);
- mMax = _mm_min_ps(_mm_max_ps(mMinZ1, mMinZ2), mMax);
- fMin->m = mMin;
- fMax->m = mMax;
- return ~_mm_movemask_ps(_mm_or_ps(_mm_cmplt_ps(mMax, _mm_set1_ps(0.0f)), _mm_cmpgt_ps(mMin, mMax)));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement