bool Ray::IntersectBox( Box3 a_box, matrix a_mat_transform ) { // translate by position a_mat_transform = a_mat_transform * matrix::Translation( a_box.GetCenter() ); v3 halfsize = a_box.Size()*0.5f; float tmin = -FLT_MAX; float tmax = FLT_MAX; v4 nmin; v4 nmax; const v4 p = a_mat_transform.w - v4(m_pos,1.0f); for ( size_t i=0; i!=3; ++i ) { v4 box_basis_vector = a_mat_transform[i]; const float e = dot( box_basis_vector, p ); float f = dot( box_basis_vector, v4(m_dir,0.0f) ); if ( fabs(f) > EPSILON ) { f = 1.0f/f; float t1 = ( e + halfsize[i] ) * f; float t2 = ( e - halfsize[i] ) * f; float flip = 1.f; if ( t1 > t2 ) { // swap float tmp = t1; t1 = t2; t2 = tmp; flip = -flip; } if ( t1 > tmin ) { tmin = t1; nmin = a_mat_transform[i] * flip; } if ( t2 < tmax ) { tmax = t2; nmax =-a_mat_transform[i] * flip; } if ( tmin > tmax ) return false; if ( tmax < 0.f ) return false; } else if ( ( ( -e - halfsize[i] ) > 0.f ) || ( ( -e + halfsize[i] ) < 0.f ) ) { // ray parallel to the stab return false; } } if ( tmin > 0.f ) return NewHit( tmin, nmin.xyz() ); return NewHit( tmax, nmax.xyz() ); }