sheep/format/
named.rs

1use super::Format;
2use SpriteAnchor;
3
4pub struct AmethystNamedFormat;
5
6/// `NameSprite` represents a field in a `SerializedNamedSpriteSheet`.
7/// All of the fields, except `name`, mimic the `SpritePosition` struct.
8#[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/// `SerializedNamedSpriteSheet` is the serializable representation of the sprite sheet.
32/// It is similar to `SerializedSpriteSheet`, except that it has a `Vec` of `NamedSpritePosition`s
33/// instead of `SpriteAnchor`s
34#[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}