1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
use crate::ldtk::{Definitions, Type};
use bevy::{
asset::RenderAssetUsages,
prelude::*,
render::render_resource::{Extent3d, TextureDimension, TextureFormat},
};
impl Definitions {
/// Creates image that will be used for rendering IntGrid colors.
///
/// The resulting image is completely white and can be thought of as a single tile of the grid.
/// The image is only as big as the biggest int grid layer's grid size.
///
/// Can return `None` if there are no IntGrid layers that will be rendered by color.
/// IntGrid layers that have a tileset are excluded since they will not be rendered by color.
pub fn create_int_grid_image(&self) -> Option<Image> {
self.layers
.iter()
.filter(|l| l.purple_type == Type::IntGrid && l.tileset_def_uid.is_none())
.max_by(|layer_a, layer_b| layer_a.grid_size.cmp(&layer_b.grid_size))
.map(|l| {
Image::new_fill(
Extent3d {
width: l.grid_size as u32,
height: l.grid_size as u32,
depth_or_array_layers: 1,
},
TextureDimension::D2,
&[255, 255, 255, 255],
TextureFormat::Rgba8UnormSrgb,
RenderAssetUsages::default(),
)
})
}
}
#[cfg(test)]
mod tests {
use crate::ldtk::LayerDefinition;
use super::*;
#[test]
fn int_grid_image_is_white() {
let definitions = Definitions {
layers: vec![LayerDefinition {
purple_type: Type::IntGrid,
grid_size: 16,
..default()
}],
..default()
};
let image = definitions.create_int_grid_image().unwrap();
for byte in image.data.unwrap_or_default().iter() {
assert_eq!(*byte, 255);
}
}
#[test]
fn int_grid_image_is_size_of_max_int_grid_layer() {
let definitions = Definitions {
layers: vec![
LayerDefinition {
purple_type: Type::IntGrid,
grid_size: 16,
..default()
},
LayerDefinition {
purple_type: Type::IntGrid,
grid_size: 32,
..default()
},
LayerDefinition {
purple_type: Type::IntGrid,
grid_size: 2,
..default()
},
// Excludes non-intgrid layers
LayerDefinition {
purple_type: Type::AutoLayer,
grid_size: 64,
..default()
},
LayerDefinition {
purple_type: Type::Tiles,
grid_size: 64,
..default()
},
LayerDefinition {
purple_type: Type::Entities,
grid_size: 64,
..default()
},
// Excludes intgrid layers w/ tileset
LayerDefinition {
purple_type: Type::IntGrid,
grid_size: 64,
tileset_def_uid: Some(1),
..default()
},
],
..default()
};
let image = definitions.create_int_grid_image().unwrap();
assert_eq!(image.size(), UVec2::splat(32));
}
#[test]
fn no_int_grid_image_for_no_elligible_int_grid_layers() {
let definitions = Definitions {
layers: vec![
// Excludes non-intgrid layers
LayerDefinition {
purple_type: Type::AutoLayer,
grid_size: 64,
..default()
},
LayerDefinition {
purple_type: Type::Tiles,
grid_size: 64,
..default()
},
LayerDefinition {
purple_type: Type::Entities,
grid_size: 64,
..default()
},
// Excludes intgrid layers w/ tileset
LayerDefinition {
purple_type: Type::IntGrid,
grid_size: 64,
tileset_def_uid: Some(1),
..default()
},
],
..default()
};
assert!(definitions.create_int_grid_image().is_none());
}
}