summaryrefslogtreecommitdiff
path: root/assets
diff options
context:
space:
mode:
Diffstat (limited to 'assets')
-rw-r--r--assets/final/demo_assets.txt1
-rw-r--r--assets/final/shaders/ray_triangle.wgsl30
2 files changed, 31 insertions, 0 deletions
diff --git a/assets/final/demo_assets.txt b/assets/final/demo_assets.txt
index 256f246..5d40f7f 100644
--- a/assets/final/demo_assets.txt
+++ b/assets/final/demo_assets.txt
@@ -27,6 +27,7 @@ SHADER_COMMON_UNIFORMS, NONE, shaders/common_uniforms.wgsl, "Common Uniforms Sni
SHADER_SDF_PRIMITIVES, NONE, shaders/sdf_primitives.wgsl, "SDF Primitives Snippet"
SHADER_LIGHTING, NONE, shaders/lighting.wgsl, "Lighting Snippet"
SHADER_RAY_BOX, NONE, shaders/ray_box.wgsl, "Ray-Box Intersection Snippet"
+SHADER_RAY_TRIANGLE, NONE, shaders/ray_triangle.wgsl, "Ray-Triangle Intersection Snippet (Möller-Trumbore)"
SHADER_MAIN, NONE, shaders/main_shader.wgsl, "Main Heptagon Shader"
SHADER_PARTICLE_COMPUTE, NONE, shaders/particle_compute.wgsl, "Particle Compute Shader"
SHADER_PARTICLE_RENDER, NONE, shaders/particle_render.wgsl, "Particle Render Shader"
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<f32>,
+ z: f32,
+ N: vec3<f32>,
+ hit: bool,
+};
+
+fn ray_triangle_intersection(
+ orig: vec3<f32>,
+ dir: vec3<f32>,
+ p0: vec3<f32>,
+ p1: vec3<f32>,
+ p2: vec3<f32>
+) -> 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<f32>(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);
+}