diff options
| -rw-r--r-- | assets/final/demo_assets.txt | 1 | ||||
| -rw-r--r-- | assets/final/shaders/ray_triangle.wgsl | 30 | ||||
| -rw-r--r-- | src/gpu/effects/shaders.cc | 1 |
3 files changed, 32 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); +} diff --git a/src/gpu/effects/shaders.cc b/src/gpu/effects/shaders.cc index dcbb0fd..51e6e41 100644 --- a/src/gpu/effects/shaders.cc +++ b/src/gpu/effects/shaders.cc @@ -48,6 +48,7 @@ void InitShaderComposer() { register_if_exists("lighting", AssetId::ASSET_SHADER_LIGHTING); register_if_exists("ray_box", AssetId::ASSET_SHADER_RAY_BOX); + register_if_exists("ray_triangle", AssetId::ASSET_SHADER_RAY_TRIANGLE); } // Helper to get asset string or empty string |
