Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Moeller-Trumbore Algorithm
- // [https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm]
- bool hitTriangle(Triangle triangle, Ray r, float tMin, float tMax, out HitRecord rec) {
- vec3 edge1 = triangle.v1.xyz - triangle.v0.xyz;
- vec3 edge2 = triangle.v2.xyz - triangle.v0.xyz;
- float area = length(cross(edge1, edge2)) * 0.5;
- float EPSILON = max(1e-8, area * 1e-5);
- vec3 ray_cross_e2 = cross(r.direction, edge2);
- float det = dot(edge1, ray_cross_e2);
- if(abs(det) < EPSILON) return false;
- float inv_det = 1.0 / det;
- vec3 s = r.origin - triangle.v0.xyz;
- float u = inv_det * dot(s, ray_cross_e2);
- if(u < -EPSILON || u > 1.0 + EPSILON) return false;
- vec3 s_cross_e1 = cross(s, edge1);
- float v = inv_det * dot(r.direction, s_cross_e1);
- if(v < -EPSILON || u + v > 1.0 + EPSILON) return false;
- float t = inv_det * dot(edge2, s_cross_e1);
- if(t < tMin || t > tMax) return false;
- rec.t = t;
- rec.p = r.origin + r.direction * t;
- rec.mat = materials[triangle.materialID];
- vec3 interpolatedNormal = normalize(
- (1.0 - u - v) * triangle.n0.xyz +
- u * triangle.n1.xyz +
- v * triangle.n2.xyz
- );
- // Properly determine front/back face
- vec3 geometricNormal = normalize(cross(edge1, edge2));
- rec.frontFace = dot(r.direction, geometricNormal) < 0.0;
- rec.normal = rec.frontFace ? interpolatedNormal : -interpolatedNormal;
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment