38 #if defined(__x86_64__) || defined(_M_X64)
39 if constexpr (std::is_same_v<T, float>)
41 __m128 l = _mm_set_ps( box.
min.x, box.
min.y, box.
min.z, t0 );
42 __m128 r = _mm_set_ps( box.
max.x, box.
max.y, box.
max.z, t1 );
43 l = _mm_sub_ps( l, rayOrigin.p );
44 r = _mm_sub_ps( r, rayOrigin.p );
45 l = _mm_mul_ps( l, prec.
invDir );
46 r = _mm_mul_ps( r, prec.
invDir );
48 __m128 a = _mm_min_ps( l, r );
49 __m128 b = _mm_max_ps( l, r );
51 __m128 aa = _mm_movehl_ps( a, a );
52 aa = _mm_max_ps( aa, a );
53 __m128 aaa = _mm_shuffle_ps( aa, aa, 1 );
54 aaa = _mm_max_ss( aaa, aa );
55 t0 = _mm_cvtss_f32( aaa );
57 __m128 bb = _mm_movehl_ps( b, b );
58 bb = _mm_min_ps( bb, b );
59 __m128 bbb = _mm_shuffle_ps( bb, bb, 1 );
60 bbb = _mm_min_ss( bbb, bb );
61 t1 = _mm_cvtss_f32( bbb );
67 #pragma message("rayBoxIntersect: no hardware optimized instructions")
70 const Vector3i& sign = prec.
sign;
73 t1 = std::min( (box[sign.x].x - rayOrigin.p.x) * prec.
invDir.x, t1 );
74 t0 = std::max( (box[1 - sign.x].x - rayOrigin.p.x) * prec.
invDir.x, t0 );
77 t1 = std::min( (box[sign.y].y - rayOrigin.p.y) * prec.
invDir.y, t1 );
78 t0 = std::max( (box[1 - sign.y].y - rayOrigin.p.y) * prec.
invDir.y, t0 );
81 t1 = std::min( (box[sign.z].z - rayOrigin.p.z) * prec.
invDir.z, t1 );
82 t0 = std::max( (box[1 - sign.z].z - rayOrigin.p.z) * prec.
invDir.z, t0 );
bool rayBoxIntersect(const Box3< T > &box, const RayOrigin< T > &rayOrigin, T &t0, T &t1, const IntersectionPrecomputes< T > &prec)
Definition MRRayBoxIntersection.h:36