scena 1.7.1

A Rust-native scene-graph renderer with typed scene state, glTF assets, and explicit prepare/render lifecycles.
Documentation
use serde_json::Value;

use scena::{AssetPath, Color, SceneHostAssetImportReportV1, SceneHostCore, Transform, Vec3};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut host = SceneHostCore::headless(128, 128)?;
    let root = host.root_handle();
    let group = host.add_empty(
        Some(root),
        Transform::at(Vec3::new(-0.25, 0.0, 0.0)),
        Some("group:left"),
    )?;

    let import_json = pollster::block_on(host.instantiate_url_under_with_report_json(
        group,
        AssetPath::from("tests/assets/gltf/mesh_material_vertex_color_scene.gltf"),
    ))?;
    let import_report: SceneHostAssetImportReportV1 = serde_json::from_str(&import_json)?;
    let mesh = host.node_handle(import_report.import, "ColoredTriangle")?;

    host.set_node_tint(mesh, Some(Color::from_linear_rgba(0.1, 0.8, 0.2, 0.45)))?;
    host.set_node_annotation("mesh-label", mesh, [0.0, 0.0, 0.0])?;
    host.frame_node(mesh)?;
    host.prepare()?;
    host.render()?;

    print_json("capability_report", host.capabilities_json()?)?;
    print_json("scene_host_asset_import", import_json)?;
    print_json("scene_inspection", host.inspect_json()?)?;
    print_json("annotation_projection", host.annotation_projections_json()?)?;
    print_json("capture", host.capture_json()?)?;

    let asset = pollster::block_on(
        host.assets()
            .load_scene("tests/assets/gltf/mesh_material_vertex_color_scene.gltf"),
    )?;
    println!(
        "asset_provenance\n{}",
        serde_json::to_string_pretty(asset.provenance())?
    );

    Ok(())
}

fn print_json(label: &str, json_text: impl AsRef<str>) -> Result<(), serde_json::Error> {
    let value: Value = serde_json::from_str(json_text.as_ref())?;
    println!("{label}\n{}", serde_json::to_string_pretty(&value)?);
    Ok(())
}