reflow_sdf 0.2.1

SDF IR, primitives, operations, and WGSL code generation for Reflow procedural rendering.
Documentation
//! SDF codegen integration tests.

use reflow_sdf::codegen;
use reflow_sdf::ir::{SceneSettings, SdfNode};

#[test]
fn test_codegen_produces_valid_wgsl_structure() {
    let scene = SdfNode::smooth_union(
        SdfNode::sphere(1.0).translate([0.8, 0.0, 0.0]),
        SdfNode::cube(0.7).rotate([0.0, 45.0, 0.0]),
        0.3,
    )
    .into_scene_with(SceneSettings {
        width: 256,
        height: 256,
        ao: true,
        ..Default::default()
    });

    let compiled = codegen::compile(&scene);

    assert!(compiled.wgsl.contains("fn sdf_scene(p: vec3f) -> f32"));
    assert!(compiled.wgsl.contains("fn ray_march"));
    assert!(compiled.wgsl.contains("fn calc_ao"));
    assert!(compiled.wgsl.contains("@compute @workgroup_size(8, 8, 1)"));
    assert!(compiled.wgsl.contains("fn smin"));
    assert!(compiled.uses_smooth_ops);
    assert!(!compiled.uses_noise);

    let sdf_body = compiled
        .wgsl
        .split("fn sdf_scene(p: vec3f) -> f32 {")
        .nth(1)
        .unwrap()
        .split('}')
        .next()
        .unwrap();
    assert!(!sdf_body.contains("let p ="), "Variable shadowing detected");
}

#[test]
fn test_complex_scene_with_noise_and_shadows() {
    let scene = SdfNode::union(
        SdfNode::plane([0.0, 1.0, 0.0], 1.0),
        SdfNode::smooth_union(
            SdfNode::torus(1.5, 0.3)
                .twist(0.8)
                .translate([0.0, 0.5, 0.0]),
            SdfNode::sphere(0.4)
                .displace(5.0, 0.05, 3)
                .mirror([1.0, 0.0, 1.0]),
            0.2,
        ),
    )
    .into_scene_with(SceneSettings {
        soft_shadows: true,
        ..Default::default()
    });

    let compiled = codegen::compile(&scene);
    assert!(compiled.uses_noise);
    assert!(compiled.uses_smooth_ops);
    assert!(compiled.wgsl.contains("fn soft_shadow"));
    assert!(compiled.node_count >= 5);
}