spine2d 0.4.0

Pure Rust runtime for Spine 4.3 (unofficial)
Documentation
use crate::SkeletonData;
use crate::runtime::Skeleton;

const JSON: &str = r#"
{
  "skeleton": { "spine": "4.3.00" },
  "bones": [ { "name": "root" } ],
  "slots": [
    { "name": "slot0", "bone": "root", "attachment": "head" }
  ],
  "skins": {
    "default": {
      "slot0": {
        "head": { "type": "region", "path": "head.png", "x": 1, "y": 2, "rotation": 30, "scaleX": 1, "scaleY": 1, "width": 10, "height": 20 }
      }
    }
  },
  "animations": {}
}
"#;

#[test]
fn parse_slots_and_default_skin_region_attachment() {
    let data = SkeletonData::from_json_str(JSON).unwrap();
    assert_eq!(data.slots.len(), 1);
    assert_eq!(data.skins.len(), 1);
    assert_eq!(
        data.get_default_skin().map(|skin| skin.name.as_str()),
        Some("default")
    );

    let mut skeleton = Skeleton::new(data);
    skeleton.setup_pose();

    assert_eq!(skeleton.slots.len(), 1);
    assert_eq!(skeleton.draw_order, vec![0]);
    assert_eq!(skeleton.slots[0].attachment.as_deref(), Some("head"));
    assert!(std::ptr::eq(
        skeleton.slots[0].get_bone(&skeleton),
        &skeleton.get_bones()[0]
    ));
    assert_eq!(skeleton.skin.as_deref(), None);

    let skin = skeleton.data.find_skin("default").unwrap();
    let attachment = skin.get_attachment(0, "head").unwrap();
    match attachment {
        crate::AttachmentData::Region(region) => {
            assert_eq!(region.path, "head.png");
            assert_eq!(region.x, 1.0);
            assert_eq!(region.y, 2.0);
            assert_eq!(region.rotation, 30.0);
            assert_eq!(region.width, 10.0);
            assert_eq!(region.height, 20.0);
        }
        _ => panic!("expected region attachment"),
    }
}

#[test]
fn skeleton_data_default_skin_is_none_when_no_default_skin_exists() {
    let data = SkeletonData::from_json_str(
        r#"
{
  "skeleton": { "spine": "4.3.00" },
  "bones": [ { "name": "root" } ],
  "skins": {
    "custom": {}
  },
  "animations": {}
}
"#,
    )
    .unwrap();

    assert!(data.get_default_skin().is_none());
}