scena 1.7.0

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

#[test]
fn asset_picking_ignores_stroke_material_geometry() {
    let assets = crate::Assets::new();
    let geometry = assets.create_geometry(crate::GeometryDesc::box_xyz(1.0, 1.0, 1.0));
    let material = assets.create_material(crate::MaterialDesc::wireframe(crate::Color::WHITE, 2.0));
    let mut scene = crate::Scene::new();
    let camera = scene.add_default_camera().expect("camera inserts");
    scene.mesh(geometry, material).add().expect("mesh inserts");
    let viewport = crate::Viewport::new(64, 64, 1.0).expect("viewport is valid");

    let hit = pick_scene_with_assets(
        &scene,
        &assets,
        camera,
        CursorPosition::physical(32.0, 32.0),
        viewport,
    )
    .expect("pick runs");

    assert_eq!(
        hit, None,
        "stroke materials are visible helpers in 1.7 but are not pickable geometry"
    );
}

#[test]
fn asset_picking_skips_stroke_overlay_and_returns_underlying_mesh() {
    let assets = crate::Assets::new();
    let mesh_geometry = assets.create_geometry(crate::GeometryDesc::box_xyz(1.0, 1.0, 1.0));
    let mesh_material = assets.create_material(crate::MaterialDesc::unlit(crate::Color::WHITE));
    let stroke_geometry = assets.create_geometry(crate::GeometryDesc::box_xyz(1.0, 1.0, 1.0));
    let stroke_material =
        assets.create_material(crate::MaterialDesc::wireframe(crate::Color::WHITE, 2.0));
    let mut scene = crate::Scene::new();
    let camera = scene.add_default_camera().expect("camera inserts");
    let mesh = scene
        .mesh(mesh_geometry, mesh_material)
        .add()
        .expect("mesh inserts");
    scene
        .mesh(stroke_geometry, stroke_material)
        .add()
        .expect("stroke inserts");
    let viewport = crate::Viewport::new(64, 64, 1.0).expect("viewport is valid");

    let hit = pick_scene_with_assets(
        &scene,
        &assets,
        camera,
        CursorPosition::physical(32.0, 32.0),
        viewport,
    )
    .expect("pick runs")
    .expect("underlying mesh is pickable through stroke overlay");

    assert_eq!(hit.target(), HitTarget::Node(mesh));
}

#[test]
fn primitive_bounds_rejects_ray_before_triangle_intersection() {
    let ray = Ray {
        origin: Vec3::ZERO,
        direction: Vec3::new(0.0, 0.0, -1.0),
    };
    let min = Vec3::new(10.0, 10.0, -4.0);
    let max = Vec3::new(11.0, 11.0, -3.0);

    assert!(!ray_hits_bounds(ray, min, max));
}

#[test]
fn primitive_bounds_accepts_ray_through_triangle_bounds() {
    let ray = Ray {
        origin: Vec3::ZERO,
        direction: Vec3::new(0.0, 0.0, -1.0),
    };
    let min = Vec3::new(-1.0, -1.0, -4.0);
    let max = Vec3::new(1.0, 1.0, -3.0);

    assert!(ray_hits_bounds(ray, min, max));
}