From afb04da1fc4780eed271064649377cf3e08d391f Mon Sep 17 00:00:00 2001 From: skal Date: Sun, 8 Feb 2026 17:01:33 +0100 Subject: feat(shaders): Add Möller-Trumbore ray-triangle intersection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements ray-triangle intersection algorithm for future mesh raytracing support. Changes: - Add ray_triangle.wgsl with TriangleHit struct and intersection function - Register shader snippet in asset system (SHADER_RAY_TRIANGLE) - Add shader composer registration for #include "ray_triangle" support Returns: - hit.uv: Barycentric coordinates (for texture mapping) - hit.z: Parametric distance along ray - hit.N: Triangle face normal - hit.hit: Boolean indicating intersection Task: Progress on SDF for mesh (related to Task #18) Algorithm: Fast, Minimum Storage Ray-Triangle Intersection (Möller-Trumbore) Size: ~30 lines WGSL, negligible binary impact --- assets/final/shaders/ray_triangle.wgsl | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 assets/final/shaders/ray_triangle.wgsl (limited to 'assets/final/shaders') diff --git a/assets/final/shaders/ray_triangle.wgsl b/assets/final/shaders/ray_triangle.wgsl new file mode 100644 index 0000000..13341c8 --- /dev/null +++ b/assets/final/shaders/ray_triangle.wgsl @@ -0,0 +1,30 @@ +// 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); +} -- cgit v1.2.3