veloren_voxygen_anim/plugin/
mod.rs

1use crate::{Offsets, make_bone};
2
3use super::{
4    Skeleton,
5    vek::{Lerp, Mat4, Transform, Vec3, Vec4},
6};
7use common::comp;
8// use vek::quaternion::repr_simd::Quaternion;
9use vek::Quaternion;
10
11pub type Body = comp::plugin::Body;
12
13skeleton_impls!(struct PluginSkeleton {
14    + bone0,
15    + bone1,
16    + bone2,
17    + bone3,
18    + bone4,
19    + bone5,
20    + bone6,
21    + bone7,
22    + bone8,
23    + bone9,
24    + bone10,
25    + bone11,
26    + bone12,
27    + bone13,
28    + bone14,
29    + bone15,
30});
31
32impl PluginSkeleton {
33    pub fn from_module(skel: common_state::plugin::module::Skeleton) -> Self {
34        fn convert(
35            a: Option<&common_state::plugin::module::Transform>,
36        ) -> Transform<f32, f32, f32> {
37            a.map_or_else(
38                || Transform {
39                    position: Vec3::zero(),
40                    orientation: Quaternion::identity(),
41                    scale: Vec3::one(),
42                },
43                |a| Transform {
44                    position: Vec3::from(a.position),
45                    orientation: Quaternion::from_vec4(Vec4::from(a.orientation)),
46                    scale: Vec3::from(a.scale),
47                },
48            )
49        }
50        Self {
51            bone0: convert(skel.first()),
52            bone1: convert(skel.get(1)),
53            bone2: convert(skel.get(2)),
54            bone3: convert(skel.get(3)),
55            bone4: convert(skel.get(4)),
56            bone5: convert(skel.get(5)),
57            bone6: convert(skel.get(6)),
58            bone7: convert(skel.get(7)),
59            bone8: convert(skel.get(8)),
60            bone9: convert(skel.get(9)),
61            bone10: convert(skel.get(10)),
62            bone11: convert(skel.get(11)),
63            bone12: convert(skel.get(12)),
64            bone13: convert(skel.get(13)),
65            bone14: convert(skel.get(14)),
66            bone15: convert(skel.get(15)),
67        }
68    }
69}
70
71impl Skeleton for PluginSkeleton {
72    type Attr = SkeletonAttr;
73    type Body = Body;
74
75    const BONE_COUNT: usize = 16;
76    #[cfg(feature = "use-dyn-lib")]
77    const COMPUTE_FN: &'static [u8] = b"plugin_compute_mats\0";
78
79    #[cfg_attr(feature = "be-dyn-lib", export_name = "plugin_compute_mats")]
80    fn compute_matrices_inner(
81        &self,
82        base_mat: Mat4<f32>,
83        buf: &mut [crate::FigureBoneData; crate::MAX_BONE_COUNT],
84        body: Self::Body,
85    ) -> crate::Offsets {
86        let base_mat = base_mat * Mat4::scaling_3d(1.0 / 13.0);
87
88        *(<&mut [_; Self::BONE_COUNT]>::try_from(&mut buf[0..Self::BONE_COUNT]).unwrap()) = [
89            make_bone(base_mat * Mat4::<f32>::from(self.bone0)),
90            make_bone(base_mat * Mat4::<f32>::from(self.bone1)),
91            make_bone(base_mat * Mat4::<f32>::from(self.bone2)),
92            make_bone(base_mat * Mat4::<f32>::from(self.bone3)),
93            make_bone(base_mat * Mat4::<f32>::from(self.bone4)),
94            make_bone(base_mat * Mat4::<f32>::from(self.bone5)),
95            make_bone(base_mat * Mat4::<f32>::from(self.bone6)),
96            make_bone(base_mat * Mat4::<f32>::from(self.bone7)),
97            make_bone(base_mat * Mat4::<f32>::from(self.bone8)),
98            make_bone(base_mat * Mat4::<f32>::from(self.bone9)),
99            make_bone(base_mat * Mat4::<f32>::from(self.bone10)),
100            make_bone(base_mat * Mat4::<f32>::from(self.bone11)),
101            make_bone(base_mat * Mat4::<f32>::from(self.bone12)),
102            make_bone(base_mat * Mat4::<f32>::from(self.bone13)),
103            make_bone(base_mat * Mat4::<f32>::from(self.bone14)),
104            make_bone(base_mat * Mat4::<f32>::from(self.bone15)),
105        ];
106        Offsets {
107            lantern: None,
108            viewpoint: Some(
109                (base_mat * Mat4::<f32>::from(self.bone0) * Vec4::new(0.0, 3.0, 0.0, 1.0)).xyz(),
110            ),
111            // TODO: see quadruped_medium for how to animate this
112            mount_bone: Transform {
113                position: comp::Body::Plugin(body).mount_offset().into_tuple().into(),
114                ..Default::default()
115            },
116            primary_trail_mat: None,
117            secondary_trail_mat: None,
118            heads: Default::default(),
119            tail: None,
120        }
121    }
122}
123
124#[derive(Default)]
125pub struct SkeletonAttr {}
126
127impl<'a> TryFrom<&'a comp::Body> for SkeletonAttr {
128    type Error = ();
129
130    fn try_from(body: &'a comp::Body) -> Result<Self, Self::Error> {
131        match body {
132            comp::Body::Plugin(body) => Ok(SkeletonAttr::from(body)),
133            _ => Err(()),
134        }
135    }
136}
137
138impl<'a> From<&'a Body> for SkeletonAttr {
139    fn from(_body: &'a Body) -> Self { Self {} }
140}