summaryrefslogtreecommitdiff
path: root/src/shaders/ray_triangle.wgsl
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-28 09:08:57 +0100
committerskal <pascal.massimino@gmail.com>2026-02-28 09:08:57 +0100
commit9ee410594a52cbc699b13de2bde4860d70c959a3 (patch)
treed56adf5931d488abcf3ac8e24a828d2d5b02e8cc /src/shaders/ray_triangle.wgsl
parent6599a428cd69be6c66c5179e1f0fce42f561f935 (diff)
refactor: move common/shaders/ to src/shaders/
Relocates shared WGSL shaders under src/ where all source code lives, eliminating the top-level common/ directory. - Update asset references in workspaces/main/assets.txt and workspaces/test/assets.txt - Update docs: PROJECT_CONTEXT.md, ARCHITECTURE.md, WORKSPACE_SYSTEM.md, SHADER_REUSE_INVESTIGATION.md Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'src/shaders/ray_triangle.wgsl')
-rw-r--r--src/shaders/ray_triangle.wgsl30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/shaders/ray_triangle.wgsl b/src/shaders/ray_triangle.wgsl
new file mode 100644
index 0000000..ece823a
--- /dev/null
+++ b/src/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: vec2f,
+ z: f32,
+ N: vec3f,
+ hit: bool,
+};
+
+fn ray_triangle_intersection(
+ orig: vec3f,
+ dir: vec3f,
+ p0: vec3f,
+ p1: vec3f,
+ p2: vec3f
+) -> 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 = vec2f(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);
+}