diff --git a/interfaces/Crafter.Math-Ray.cppm b/interfaces/Crafter.Math-Ray.cppm index e9e974d..e6115e9 100755 --- a/interfaces/Crafter.Math-Ray.cppm +++ b/interfaces/Crafter.Math-Ray.cppm @@ -24,36 +24,32 @@ import std; namespace Crafter { export template constexpr T IntersectionTestRayTriangle(Vector vert0, Vector vert1, Vector vert2, Vector rayOrigin, Vector rayDir) { - constexpr float EPSILON = 0.0000001; + constexpr T EPSILON = 0.0000001; Vector edge1 = vert1 - vert0; Vector edge2 = vert2 - vert0; Vector h = Vector::Cross(rayDir, edge2); - float determinant = Vector::Dot(edge1, h); + T determinant = Vector::Dot(edge1, h); - if(determinant < 0) { - return std::numeric_limits::max(); + if (determinant <= EPSILON) { + return std::numeric_limits::max(); } - if (determinant > -EPSILON && determinant < EPSILON) { - return std::numeric_limits::max(); - } - - float inverse_determinant = 1.0 / determinant; + T inverse_determinant = T(1) / determinant; Vector origins_diff_vector = rayOrigin - vert0; - float u = Vector::Dot(origins_diff_vector, h) * inverse_determinant; + T u = Vector::Dot(origins_diff_vector, h) * inverse_determinant; if (u < 0.0 || u > 1.0) { - return false; + return std::numeric_limits::max(); } Vector q = Vector::Cross(origins_diff_vector, edge1); - float v = inverse_determinant * Vector::Dot(rayDir, q); + T v = inverse_determinant * Vector::Dot(rayDir, q); if (v < 0.0 || u + v > 1.0) { - return std::numeric_limits::max(); + return std::numeric_limits::max(); } return inverse_determinant * Vector::Dot(edge2, q);