nif 0.4.0

A super-primitive Gamebryo NIF parser targeting version 20.0.0.4
Documentation
use super::Quaternion;
use crate::parse_utils;
use binread::BinRead;

#[derive(Debug, PartialEq, BinRead)]
pub struct KeyGroup<T: BinRead<Args = ()>> {
    pub num_keys: u32,
    #[br(if(num_keys > 0))]
    pub interpolation: Option<KeyType>,
    #[br(args(num_keys, interpolation))]
    #[br(parse_with = parse_utils::parse_keys)]
    pub keys: Vec<Key<T>>,
}

#[derive(Debug, PartialEq, BinRead)]
#[br(import(key_type: KeyType))]
pub struct Key<T: BinRead<Args = ()>> {
    pub time: f32,
    pub value: T,
    #[br(if(key_type == KeyType::Quadratic))]
    pub forward: Option<T>,
    #[br(if(key_type == KeyType::Quadratic))]
    pub backward: Option<T>,
    #[br(if(key_type == KeyType::Tbc))]
    pub tbc: Option<Tbc>,
}

#[derive(Debug, PartialEq, BinRead)]
#[br(import(key_type: KeyType))]
pub struct QuatKey {
    #[br(if(key_type != KeyType::XyzRotation))]
    pub time: Option<f32>,
    #[br(if(key_type != KeyType::XyzRotation))]
    pub value: Option<Quaternion>,
    #[br(if(key_type == KeyType::Tbc))]
    pub tbc: Option<Tbc>,
}

#[derive(Debug, PartialEq, BinRead)]
pub struct Tbc {
    pub tension: f32,
    pub bias: f32,
    pub continuity: f32,
}

#[derive(Debug, PartialEq, BinRead, Clone, Copy)]
pub enum KeyType {
    #[br(magic = 1u32)]
    Linear,
    #[br(magic = 2u32)]
    Quadratic,
    #[br(magic = 3u32)]
    Tbc,
    #[br(magic = 4u32)]
    XyzRotation,
    #[br(magic = 5u32)]
    Const,
    Invalid(u32),
}