algorithm from "Fast, Minimum Storage Ray-Triangle Intersection"
| 26 | |
| 27 | // algorithm from "Fast, Minimum Storage Ray-Triangle Intersection" |
| 28 | bool Ray::calcTriangleIntersection( const vec3 &vert0, const vec3 &vert1, const vec3 &vert2, float *result ) const |
| 29 | { |
| 30 | vec3 edge1, edge2, tvec, pvec, qvec; |
| 31 | float det; |
| 32 | float u, v; |
| 33 | const float epsilon = 0.000001f; |
| 34 | |
| 35 | edge1 = vert1 - vert0; |
| 36 | edge2 = vert2 - vert0; |
| 37 | |
| 38 | pvec = cross( getDirection(), edge2 ); |
| 39 | det = dot( edge1, pvec ); |
| 40 | |
| 41 | #if 0 // we don't want to backface cull |
| 42 | if ( det < epsilon) |
| 43 | return false; |
| 44 | tvec = getOrigin() - vert0; |
| 45 | |
| 46 | u = dot( tvec, pvec ); |
| 47 | if ( ( u < 0.0f ) || ( u > det ) ) |
| 48 | return false; |
| 49 | |
| 50 | qvec = cross( tvec, edge1 ); |
| 51 | v = dot( getDirection(), qvec ); |
| 52 | if ( v < 0.0f || u + v > det ) |
| 53 | return false; |
| 54 | |
| 55 | *result = dot( edge2, qvec ) / det; |
| 56 | return true; |
| 57 | #else |
| 58 | if( det > -epsilon && det < epsilon) |
| 59 | return false; |
| 60 | |
| 61 | float inv_det = 1.0f / det; |
| 62 | tvec = getOrigin() - vert0; |
| 63 | u = dot( tvec, pvec ) * inv_det; |
| 64 | if( u < 0.0f || u > 1.0f ) |
| 65 | return false; |
| 66 | |
| 67 | qvec = cross( tvec, edge1 ); |
| 68 | |
| 69 | v = dot( getDirection(), qvec ) * inv_det; |
| 70 | if( v < 0.0f || u + v > 1.0f ) |
| 71 | return 0; |
| 72 | |
| 73 | *result = dot( edge2, qvec ) * inv_det; |
| 74 | return true; |
| 75 | #endif |
| 76 | } |
| 77 | |
| 78 | bool Ray::calcPlaneIntersection( const vec3 &planeOrigin, const vec3 &planeNormal, float *result ) const |
| 79 | { |