// This file is part of the 64k demo project. // Möller-Trumbore ray-triangle intersection algorithm. // Reference: "Fast, Minimum Storage Ray-Triangle Intersection" struct TriangleHit { uv: vec2, z: f32, N: vec3, hit: bool, }; fn ray_triangle_intersection( orig: vec3, dir: vec3, p0: vec3, p1: vec3, p2: vec3 ) -> TriangleHit { let d10 = p1 - p0; let d20 = p2 - p0; let N = cross(d10, d20); let det = -dot(dir, N); let invdet = 1.0 / det; let d0 = orig - p0; let nd = cross(d0, dir); let uv = vec2(dot(d20, nd), -dot(d10, nd)) * invdet; let z = dot(d0, N) * invdet; let hit = det > 0.0 && z >= 0.0 && uv.x >= 0.0 && uv.y >= 0.0 && (uv.x + uv.y) < 1.0; return TriangleHit(uv, z, N, hit); }