00001
00002 #ifndef _RT_TRIANGLE_H
00003 #define _RT_TRIANGLE_H
00004
00005 #include "Triangle.h"
00006 #include "Geometry.h"
00007
00008 namespace gk {
00009
00010
00011 struct RTTriangle
00012 {
00013 Point a;
00014 Vector ab, ac;
00015
00016
00017 RTTriangle( ) {}
00018
00019
00020 RTTriangle( const Point& _a, const Point& _b, const Point& _c )
00021 :
00022 a(_a), ab(_a, _b), ac(_a, _c)
00023 {}
00024
00025
00026 RTTriangle( const Triangle& triangle)
00027 :
00028 a(triangle.a), ab(triangle.a, triangle.b), ac(triangle.a, triangle.c)
00029 {}
00030
00031
00032 ~RTTriangle( ) {}
00033
00034 float getArea( ) const
00035 {
00036 return .5f * Cross(ab, ac).Length();
00037 }
00038
00039 BBox getBBox( ) const
00040 {
00041 BBox bbox;
00042
00043 bbox.Union(a);
00044 bbox.Union(a + ab);
00045 bbox.Union(a + ac);
00046
00047 return bbox;
00048 }
00049
00050
00051 void getTriangleNormal( Normal &n ) const
00052 {
00053 n= Normal( Normalize(Cross(ab, ac)) ) ;
00054 }
00055
00056 Normal getTriangleNormal( ) const
00057 {
00058 return Normal( Normalize( Cross(ab, ac) ));
00059 }
00060
00061
00062
00063
00064
00065
00066
00067
00068 bool Intersect( const Ray &ray, const float htmax,
00069 float &rt, float &ru, float&rv ) const
00070 {
00071
00072 const Vector pvec= Cross(ray.d, ac);
00073
00074
00075 const float det= Dot(ab, pvec);
00076 if (det > -EPSILON && det < EPSILON)
00077 return false;
00078
00079 const float inv_det= 1.0f / det;
00080
00081
00082 const Vector tvec(a, ray.o);
00083
00084
00085 const float u= Dot(tvec, pvec) * inv_det;
00086 if(u < 0.0f || u > 1.0f)
00087 return false;
00088
00089
00090 const Vector qvec= Cross(tvec, ab);
00091
00092
00093 const float v= Dot(ray.d, qvec) * inv_det;
00094 if(v < 0.0f || u + v > 1.0f)
00095 return false;
00096
00097
00098 rt= Dot(ac, qvec) * inv_det;
00099 ru= u;
00100 rv= v;
00101
00102
00103 return (rt < htmax && rt > ray.tmin);
00104 }
00105 };
00106
00107 }
00108
00109 #endif