veloren_voxygen_anim/plugin/
mod.rs1use crate::{Offsets, make_bone};
2
3use super::{
4 Skeleton,
5 vek::{Lerp, Mat4, Transform, Vec3, Vec4},
6};
7use common::comp;
8use 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 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}