pub const GEODESIC_MARCH_KERNEL: &str = "fn loam_projective_depth(image: vec3<f32>, near: f32) -> f32 {\n return near / max(-image.z, 1e-20);\n}\n\nfn loam_safe_normalize(v: vec3<f32>, fallback: vec3<f32>) -> vec3<f32> {\n let l2 = dot(v, v);\n if l2 < 1e-12 { return fallback; }\n return v * inverseSqrt(l2);\n}\n\nfn loam_march_geodesic(ro: vec3<f32>, rd: vec3<f32>, ball_scale: f32) -> vec4<f32> {\n let scale = max(ball_scale, 1e-5);\n var p = ro * scale;\n\n // Probe the local Riemannian metric scaling to build a Riemannian-unit tangent. Space-agnostic via the ABI.\n let rd_unit = loam_safe_normalize(rd, vec3<f32>(0.0, 0.0, -1.0));\n let probe_eps = 1e-4;\n let probed = loam_exp(p, rd_unit * probe_eps);\n let riem_norm = loam_distance(p, probed) / probe_eps;\n var v = rd_unit / max(riem_norm, 1e-7);\n\n var t_scene = 0.0;\n var t_arc = 0.0;\n let hit_eps = 0.001 * scale;\n let min_step = 0.0001 * scale;\n\n for (var i = 0; i < 256; i = i + 1) {\n // Escape near the Space boundary. 0.92 buffers the ABI\'s saturating distance so it doesn\'t asymptote into a stall before escape fires.\n if loam_origin_distance(p) > LOAM_MAX_ARC * 0.92 {\n return vec4<f32>(0.0, 0.0, 0.0, -1.0);\n }\n let d = loam_scene_sdf(p);\n if d < hit_eps {\n return vec4<f32>(p, t_scene);\n }\n if t_scene > 40.0 || t_arc > LOAM_MAX_ARC {\n return vec4<f32>(0.0, 0.0, 0.0, -1.0);\n }\n let step = max(d * 0.85, min_step);\n let stepped = loam_geodesic_step(p, v, step);\n p = stepped.p;\n v = select(v, stepped.v, dot(stepped.v, stepped.v) > 1e-12);\n t_scene = t_scene + step / scale;\n t_arc = t_arc + step;\n }\n return vec4<f32>(0.0, 0.0, 0.0, -1.0);\n}\n\nfn loam_estimate_normal(p: vec3<f32>, ball_scale: f32) -> vec3<f32> {\n let eps = 0.0012 * max(ball_scale, 1e-5);\n let ex = vec3<f32>(eps, 0.0, 0.0);\n let ey = vec3<f32>(0.0, eps, 0.0);\n let ez = vec3<f32>(0.0, 0.0, eps);\n let g = vec3<f32>(\n loam_scene_sdf(p + ex) - loam_scene_sdf(p - ex),\n loam_scene_sdf(p + ey) - loam_scene_sdf(p - ey),\n loam_scene_sdf(p + ez) - loam_scene_sdf(p - ez),\n );\n return loam_safe_normalize(g, vec3<f32>(0.0, 1.0, 0.0));\n}\n";Expand description
Assemble after the space and scene modules.