use crate::{Matrix4x4, SsbhArray, SsbhString, Version};
use binrw::BinRead;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "strum")]
use strum::{Display, EnumIter, EnumString, FromRepr};
use ssbh_write::SsbhWrite;
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[derive(Debug, BinRead, SsbhWrite, PartialEq, Clone)]
#[br(import(major_version: u16, minor_version: u16))]
pub enum Skel {
#[br(pre_assert(major_version == 1 && minor_version == 0))]
V10 {
bone_entries: SsbhArray<SkelBoneEntry>,
world_transforms: SsbhArray<Matrix4x4>,
inv_world_transforms: SsbhArray<Matrix4x4>,
transforms: SsbhArray<Matrix4x4>,
inv_transforms: SsbhArray<Matrix4x4>,
},
}
impl Version for Skel {
fn major_minor_version(&self) -> (u16, u16) {
match self {
Skel::V10 { .. } => (1, 0),
}
}
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[derive(Debug, BinRead, SsbhWrite, Clone, PartialEq, Eq)]
pub struct SkelBoneEntry {
pub name: SsbhString,
pub index: u16,
pub parent_index: i16,
pub flags: SkelEntryFlags,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[derive(Debug, BinRead, SsbhWrite, Clone, PartialEq, Eq)]
#[ssbhwrite(pad_after = 2)]
pub struct SkelEntryFlags {
pub unk1: u8, #[br(pad_after = 2)]
pub billboard_type: BillboardType,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "strum", derive(FromRepr, Display, EnumIter, EnumString))]
#[derive(Debug, BinRead, SsbhWrite, Clone, Copy, PartialEq, Eq)]
#[br(repr(u8))]
#[ssbhwrite(repr(u8))]
pub enum BillboardType {
Disabled = 0,
XAxisViewPointAligned = 1, YAxisViewPointAligned = 2, Unk3 = 3,
XYAxisViewPointAligned = 4, YAxisViewPlaneAligned = 6, XYAxisViewPlaneAligned = 8, }