1use super::Format;
2use SpriteAnchor;
3
4pub struct AmethystNamedFormat;
5
6#[derive(Clone, Debug, PartialEq, Serialize)]
9struct NamedSpritePosition {
10 name: String,
11 x: f32,
12 y: f32,
13 width: f32,
14 height: f32,
15 offsets: Option<[f32; 2]>,
16}
17
18impl From<(&SpriteAnchor, String)> for NamedSpritePosition {
19 fn from(anchor: (&SpriteAnchor, String)) -> NamedSpritePosition {
20 return NamedSpritePosition {
21 name: anchor.1,
22 x: anchor.0.position.0 as f32,
23 y: anchor.0.position.1 as f32,
24 width: anchor.0.dimensions.0 as f32,
25 height: anchor.0.dimensions.1 as f32,
26 offsets: None,
27 };
28 }
29}
30
31#[derive(Clone, Debug, PartialEq, Serialize)]
35pub struct SerializedNamedSpriteSheet {
36 texture_width: f32,
37 texture_height: f32,
38 sprites: Vec<NamedSpritePosition>,
39}
40
41impl Format for AmethystNamedFormat {
42 type Data = SerializedNamedSpriteSheet;
43 type Options = Vec<String>;
44
45 fn encode(
46 dimensions: (u32, u32),
47 sprites: &[SpriteAnchor],
48 options: Self::Options,
49 ) -> Self::Data {
50 let sprite_positions = sprites
51 .iter()
52 .map(|anchor| (anchor, options[anchor.id].clone()))
53 .map(Into::into)
54 .collect::<Vec<NamedSpritePosition>>();
55
56 SerializedNamedSpriteSheet {
57 texture_width: dimensions.0 as f32,
58 texture_height: dimensions.1 as f32,
59 sprites: sprite_positions,
60 }
61 }
62}