molgfx-core 0.3.2

The semantic scene graph: columnar tables, GPU record layouts, the borrowed coordinate seam.
Documentation
use crate::{
    EntityKind, EntityRef, InteractionAnchor, InteractionEdge, InteractionGeometry,
    InteractionKind, Scene, fixture,
};
use molgfx_math::Vec3;

fn interaction(scene: &Scene) -> InteractionEdge {
    let Some((owner, _)) = scene.structures().next() else {
        panic!("fixture owner exists")
    };
    let start = InteractionAnchor::world(Vec3::ZERO).unwrap_or_else(|error| panic!("{error}"));
    let end = InteractionAnchor::world(Vec3::new(9.0, 2.0, 0.0))
        .unwrap_or_else(|error| panic!("{error}"));
    let geometry = InteractionGeometry::new(9.22, None).unwrap_or_else(|error| panic!("{error}"));
    InteractionEdge::new(
        owner,
        start,
        end,
        InteractionKind::SaltBridge,
        geometry,
        "test",
    )
    .unwrap_or_else(|error| panic!("{error}"))
}

#[test]
fn interaction_table_uses_stable_generational_handles_and_revisions() {
    let mut scene =
        Scene::from_structure(&fixture::structure()).unwrap_or_else(|error| panic!("{error}"));
    let initial = scene.interaction_revision();
    let edge = interaction(&scene);
    let handle = scene
        .add_interaction(edge)
        .unwrap_or_else(|error| panic!("{error}"));
    assert!(scene.interaction_revision() > initial);
    assert_eq!(scene.interaction_count(), 1);
    let Some((resolved, edge)) = scene.interaction_for_entity(EntityRef {
        structure: edge_owner(&scene),
        kind: EntityKind::Edge,
        index: Scene::interaction_row(handle),
    }) else {
        panic!("picked edge resolves")
    };
    assert_eq!(resolved, handle);
    assert_eq!(edge.provenance(), "test");
    let after_add = scene.interaction_revision();
    scene
        .interaction_mut(handle)
        .unwrap_or_else(|| panic!("interaction resolves"))
        .set_visible(false);
    assert!(scene.interaction_revision() > after_add);
    assert!(scene.remove_interaction(handle).is_some());
    assert!(scene.interaction(handle).is_none());
}

fn edge_owner(scene: &Scene) -> crate::StructureHandle {
    scene
        .structures()
        .next()
        .map_or_else(|| panic!("fixture owner exists"), |(handle, _)| handle)
}

#[test]
fn interaction_endpoints_extend_the_scene_world_bound() {
    let mut scene =
        Scene::from_structure(&fixture::structure()).unwrap_or_else(|error| panic!("{error}"));
    let edge = interaction(&scene);
    scene
        .add_interaction(edge)
        .unwrap_or_else(|error| panic!("{error}"));
    assert!(scene.world_aabb().max.x >= 9.0);
}