X-Git-Url: https://git.rohieb.name/MicroTrace.git/blobdiff_plain/7a2c1f3713be127f6e4361fd8f426e78e8965bab..49b259147e3ece2ed0aa4ad72b686970031cfc46:/Triangle.cxx diff --git a/Triangle.cxx b/Triangle.cxx index 456c6d8..498757e 100644 --- a/Triangle.cxx +++ b/Triangle.cxx @@ -7,8 +7,10 @@ Triangle::Triangle(const Vec3f& a, : Primitive(shader), m_a(a), m_b(b), - m_c(c) + m_c(c), + m_n( (b-a).cross(c-a) ) { + m_n.normalize(); } Triangle::~Triangle() @@ -20,34 +22,35 @@ Triangle::Intersect(Ray& ray) { const Vec3f edge1 = m_b-m_a; const Vec3f edge2 = m_c-m_a; - + const Vec3f pvec = ray.direction().cross(edge2); - + const float det = edge1.dot(pvec); if (fabs(det) < Epsilon) return false; - + const float inv_det = 1.0f / det; - + const Vec3f tvec = ray.origin()-m_a; float lambda = tvec.dot( pvec ); lambda *= inv_det; - - if (lambda < 0.0f || lambda > 1.0f) + + if (lambda < 0.0f || lambda > 1.0f) return false; const Vec3f qvec = tvec.cross(edge1); float mue = ray.direction().dot(qvec); mue *= inv_det; - - if (mue < 0.0f || mue+lambda > 1.0f) + + if (mue < 0.0f || mue+lambda > 1.0f) return false; float f = edge2.dot(qvec); f *= inv_det; - if (ray.t() <= f || f < 1e-4 ) + if (ray.t() <= f || f < Epsilon ) return false; - + ray.setT(f); + ray.setHit(this); return true; } @@ -55,8 +58,5 @@ Triangle::Intersect(Ray& ray) Vec3f Triangle::GetNormal(Ray& ray) { - // normal is cross product of spanning vectors - Vec3f n = (m_c - m_a) % (m_c - m_b); - n.normalize(); - return n; + return m_n; }