Skip to main content

GEODESIC_MARCH_KERNEL

Constant GEODESIC_MARCH_KERNEL 

Source
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.