1pub mod idle;
2
3pub use self::idle::IdleAnimation;
5
6use super::{FigureBoneData, Skeleton, vek::*};
7use common::comp::{self};
8use core::convert::TryFrom;
9
10pub type Body = comp::ship::Body;
11
12skeleton_impls!(struct ShipSkeleton ComputedShipSkeleton {
13 + bone0
14 + bone1
15 + bone2
16 + bone3
17});
18
19impl Skeleton for ShipSkeleton {
20 type Attr = SkeletonAttr;
21 type Body = Body;
22 type ComputedSkeleton = ComputedShipSkeleton;
23
24 const BONE_COUNT: usize = ComputedShipSkeleton::BONE_COUNT;
25 #[cfg(feature = "use-dyn-lib")]
26 const COMPUTE_FN: &'static [u8] = b"ship_compute_mats\0";
27
28 #[cfg_attr(feature = "be-dyn-lib", unsafe(export_name = "ship_compute_mats"))]
29 fn compute_matrices_inner(
30 &self,
31 base_mat: Mat4<f32>,
32 buf: &mut [FigureBoneData; super::MAX_BONE_COUNT],
33 _body: Self::Body,
34 ) -> Self::ComputedSkeleton {
35 let scale_mat = Mat4::scaling_3d(1.0);
37
38 let bone0_mat = base_mat * scale_mat * Mat4::<f32>::from(self.bone0);
39 let bone1_mat = bone0_mat * Mat4::<f32>::from(self.bone1);
40 let bone2_mat = bone0_mat * Mat4::<f32>::from(self.bone2);
41
42 let computed_skeleton = ComputedShipSkeleton {
43 bone0: bone0_mat,
44 bone1: bone1_mat,
45 bone2: bone2_mat,
46 bone3: bone0_mat * Mat4::<f32>::from(self.bone3),
47 };
48
49 computed_skeleton.set_figure_bone_data(buf);
50 computed_skeleton
51 }
52}
53
54pub struct SkeletonAttr {
55 bone0: (f32, f32, f32),
56 bone1: (f32, f32, f32),
57 bone2: (f32, f32, f32),
58 bone3: (f32, f32, f32),
59 bone1_ori: f32,
60 bone2_ori: f32,
61 bone_rotation_rate: f32,
62 pub bone1_prop_trail_offset: Option<f32>,
63 pub bone2_prop_trail_offset: Option<f32>,
64}
65
66impl<'a> TryFrom<&'a comp::Body> for SkeletonAttr {
67 type Error = ();
68
69 fn try_from(body: &'a comp::Body) -> Result<Self, Self::Error> {
70 match body {
71 comp::Body::Ship(body) => Ok(SkeletonAttr::from(body)),
72 _ => Err(()),
73 }
74 }
75}
76
77impl Default for SkeletonAttr {
78 fn default() -> Self {
79 Self {
80 bone0: (0.0, 0.0, 0.0),
81 bone1: (0.0, 0.0, 0.0),
82 bone2: (0.0, 0.0, 0.0),
83 bone3: (0.0, 0.0, 0.0),
84 bone1_ori: 0.0,
85 bone2_ori: 0.0,
86 bone_rotation_rate: 0.0,
87 bone1_prop_trail_offset: None,
88 bone2_prop_trail_offset: None,
89 }
90 }
91}
92
93impl<'a> From<&'a Body> for SkeletonAttr {
94 fn from(body: &'a Body) -> Self {
95 use comp::ship::Body::*;
96 Self {
97 bone0: match body {
98 DefaultAirship => (0.0, 0.0, 0.0),
99 AirBalloon => (0.0, 0.0, 0.0),
100 SailBoat => (0.0, 0.0, 0.0),
101 Galleon => (0.0, 0.0, 0.0),
102 Skiff => (0.0, 0.0, 0.0),
103 Submarine => (0.0, 0.0, 0.0),
104 Carriage => (0.0, 0.0, 0.0),
105 Cart => (0.0, 0.0, 0.0),
106 Volume => (0.0, 0.0, 0.0),
107 },
108 bone1: match body {
109 DefaultAirship => (-13.0, -25.0, 10.0),
110 AirBalloon => (0.0, 0.0, 0.0),
111 SailBoat => (0.0, 0.0, 0.0),
112 Galleon => (0.0, 0.0, 0.0),
113 Skiff => (0.0, 0.0, 0.0),
114 Submarine => (0.0, -15.0, 3.5),
115 Carriage => (0.0, 3.0, 2.0),
116 Cart => (0.0, 1.0, 1.0),
117 Volume => (0.0, 0.0, 0.0),
118 },
119 bone2: match body {
120 DefaultAirship => (13.0, -25.0, 10.0),
121 AirBalloon => (0.0, 0.0, 0.0),
122 SailBoat => (0.0, 0.0, 0.0),
123 Galleon => (0.0, 0.0, 0.0),
124 Skiff => (0.0, 0.0, 0.0),
125 Submarine => (0.0, 0.0, 0.0),
126 Carriage => (0.0, -3.0, 2.0),
127 Cart => (0.0, -2.5, 1.0),
128 Volume => (0.0, 0.0, 0.0),
129 },
130 bone3: match body {
131 DefaultAirship => (0.0, -27.5, 8.5),
132 AirBalloon => (0.0, -9.0, 8.0),
133 SailBoat => (0.0, 0.0, 0.0),
134 Galleon => (0.0, 0.0, 0.0),
135 Skiff => (0.0, 0.0, 0.0),
136 Submarine => (0.0, -18.0, 3.5),
137 Carriage => (0.0, 0.0, 0.0),
138 Cart => (0.0, 0.0, 0.0),
139 Volume => (0.0, 0.0, 0.0),
140 },
141 bone1_ori: match body {
142 Carriage | Cart => std::f32::consts::PI * 0.5,
143 _ => 0.0,
144 },
145 bone2_ori: match body {
146 Carriage | Cart => std::f32::consts::PI * -0.5,
147 _ => 0.0,
148 },
149 bone_rotation_rate: match body {
150 Carriage => 0.25,
151 Cart => 0.4,
152 _ => 0.8,
153 },
154 bone1_prop_trail_offset: match body {
155 DefaultAirship => Some(8.5),
156 Submarine => Some(3.5),
157 _ => None,
158 },
159 bone2_prop_trail_offset: match body {
160 DefaultAirship => Some(8.5),
161 _ => None,
162 },
163 }
164 }
165}