-
-// Raycasting
-// ==================================================================================================================
-
-int csr_slabs( v3f box[2], v3f o, v3f id )
-{
- v3f t0; v3f t1;
- v3f tmin; v3f tmax;
-
- v3_sub( box[0], o, t0 );
- v3_sub( box[1], o, t1 );
- v3_mul( t0, id, t0 );
- v3_mul( t1, id, t1 );
-
- v3_minv( t0, t1, tmin );
- v3_maxv( t0, t1, tmax );
-
- return v3_maxf( tmin ) <= v3_minf( tmax );
-}
-
-float csr_ray_tri( v3f o, v3f d, v3f v0, v3f v1, v3f v2, float *u, float *v )
-{
- float const k_cullEpsilon = 0.0001f;
-
- v3f v0v1;
- v3f v0v2;
- v3f p;
- float det, inv;
-
- v3f tv;
- v3f qv;
-
- v3_sub( v1, v0, v0v1 );
- v3_sub( v2, v0, v0v2 );
- v3_cross( d, v0v2, p );
-
- det = v3_dot( v0v1, p );
-
- if( det < k_cullEpsilon ) return -INFINITY;
-
- inv = 1.f / det;
-
- v3_sub( o, v0, tv );
- *u = v3_dot( tv, p ) * inv;
-
- if( *u < 0.f || *u > 1.f ) return -INFINITY;
-
- v3_cross( tv, v0v1, qv );
- *v = v3_dot( d, qv ) * inv;
-
- if( *v < 0.f || *u + *v > 1.f ) return -INFINITY;
-
- return v3_dot( v0v2, qv ) * inv;
-}