scena 1.1.0

A Rust-native scene-graph renderer with typed scene state, glTF assets, and explicit prepare/render lifecycles.
Documentation
use scena::{Assets, Color, GeometryDesc, MaterialDesc, Renderer, Scene, Transform, Vec3};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let assets = Assets::new();
    let geometry = assets.create_geometry(GeometryDesc::box_xyz(0.3, 0.3, 0.3));
    let visible_material =
        assets.create_material(MaterialDesc::unlit(Color::from_srgb_u8(80, 170, 255)));
    let helper_material =
        assets.create_material(MaterialDesc::unlit(Color::from_srgb_u8(255, 230, 80)));

    let mut scene = Scene::new();
    let machine = scene
        .mesh(geometry, visible_material)
        .transform(Transform::at(Vec3::new(-0.25, 0.0, 0.0)))
        .add()?;
    let helper = scene
        .mesh(geometry, helper_material)
        .transform(Transform::at(Vec3::new(0.25, 0.0, 0.0)).scale_by(0.5))
        .add()?;
    let hidden = scene
        .mesh(geometry, visible_material)
        .transform(Transform::at(Vec3::new(0.0, 0.4, 0.0)))
        .add()?;

    scene.add_tag(machine, "operational")?;
    scene.set_layer_mask(machine, 0b0001)?;
    scene.set_layer_mask(helper, 0b0001)?;
    scene.set_layer_mask(hidden, 0b0010)?;
    scene.set_visible(hidden, false)?;
    scene.set_render_group(helper, 10)?;
    scene.set_helper_on_top(helper, true)?;

    let camera = scene.add_default_camera()?;
    scene.set_camera_layer_mask(camera, 0b0001)?;

    let mut renderer = Renderer::headless(320, 180)?;
    renderer.prepare_with_assets(&mut scene, &assets)?;
    renderer.render_active(&scene)?;
    println!(
        "layers_visibility tagged={} helper_on_top={:?}",
        scene.tagged("operational").count(),
        scene.helper_on_top(helper)
    );
    Ok(())
}