3 use crate::{LandGenerationParameters, LandGenerator}; |
3 use crate::{LandGenerationParameters, LandGenerator}; |
4 use integral_geometry::Size; |
4 use integral_geometry::Size; |
5 use png::Decoder; |
5 use png::Decoder; |
6 use std::collections::HashSet; |
6 use std::collections::HashSet; |
7 use std::fs::File; |
7 use std::fs::File; |
8 use std::io::BufReader; |
8 use std::io::{BufReader, Result}; |
|
9 use std::path::Path; |
9 |
10 |
10 pub struct WavefrontCollapseLandGenerator { |
11 pub struct WavefrontCollapseLandGenerator { |
11 pub size: Size, |
12 pub size: Size, |
12 } |
13 } |
13 |
14 |
14 impl WavefrontCollapseLandGenerator { |
15 impl WavefrontCollapseLandGenerator { |
15 pub fn new(size: &Size) -> Self { |
16 pub fn new(size: &Size) -> Self { |
16 Self { size: *size } |
17 Self { size: *size } |
17 } |
18 } |
18 |
19 |
19 pub fn load_template<T: Copy + PartialEq + Default>( |
20 fn load_image_tiles<T: Copy + PartialEq + Default>( |
20 &self, |
|
21 parameters: &LandGenerationParameters<T>, |
21 parameters: &LandGenerationParameters<T>, |
22 ) -> Vec<TileImage<T, String>> { |
22 path: &Path, |
|
23 ) -> Result<Vec<TileImage<T, String>>> { |
23 let mut result = Vec::new(); |
24 let mut result = Vec::new(); |
24 |
25 |
25 let file = File::open("sample.png").expect("file exists"); |
26 let file = File::open(path)?; |
26 let decoder = Decoder::new(BufReader::new(file)); |
27 let decoder = Decoder::new(BufReader::new(file)); |
27 let mut reader = decoder.read_info().unwrap(); |
28 let mut reader = decoder.read_info().unwrap(); |
28 |
29 |
29 let info = reader.info(); |
30 let info = reader.info(); |
30 let mut tiles_image = vec2d::Vec2D::new( |
31 let mut tiles_image = vec2d::Vec2D::new( |
58 |
59 |
59 let tile = |
60 let tile = |
60 TileImage::<T, String>::new(tiles_image, top_edge, right_edge, bottom_edge, left_edge); |
61 TileImage::<T, String>::new(tiles_image, top_edge, right_edge, bottom_edge, left_edge); |
61 |
62 |
62 result.push(tile.clone()); |
63 result.push(tile.clone()); |
|
64 result.push(tile.flipped()); |
|
65 result.push(tile.mirrored()); |
|
66 result.push(tile.mirrored().flipped()); |
63 result.push(tile.rotated90()); |
67 result.push(tile.rotated90()); |
64 result.push(tile.rotated180()); |
68 result.push(tile.rotated180()); |
65 result.push(tile.rotated270()); |
69 result.push(tile.rotated270()); |
|
70 |
|
71 Ok(result) |
|
72 } |
|
73 |
|
74 pub fn load_template<T: Copy + PartialEq + Default>( |
|
75 &self, |
|
76 parameters: &LandGenerationParameters<T>, |
|
77 ) -> Vec<TileImage<T, String>> { |
|
78 let mut result = Vec::new(); |
|
79 |
|
80 if let Ok(mut tiles) = Self::load_image_tiles(parameters, Path::new("sample.png")) { |
|
81 result.append(&mut tiles); |
|
82 } |
66 |
83 |
67 result |
84 result |
68 } |
85 } |
69 } |
86 } |
70 |
87 |
181 |
198 |
182 #[test] |
199 #[test] |
183 fn test_generation() { |
200 fn test_generation() { |
184 let wfc_gen = WavefrontCollapseLandGenerator::new(&Size::new(2048, 1024)); |
201 let wfc_gen = WavefrontCollapseLandGenerator::new(&Size::new(2048, 1024)); |
185 let landgen_params = LandGenerationParameters::new(0u32, 0xff000000u32, 0, true, true); |
202 let landgen_params = LandGenerationParameters::new(0u32, 0xff000000u32, 0, true, true); |
186 let land = wfc_gen.generate_land(&landgen_params, &mut [0u32, 1u32, 3u32, 5u32, 7u32, 11u32].into_iter().cycle()); |
203 let land = wfc_gen.generate_land( |
|
204 &landgen_params, |
|
205 &mut [0u32, 1u32, 3u32, 5u32, 7u32, 11u32].into_iter().cycle(), |
|
206 ); |
187 |
207 |
188 let path = Path::new(r"output.png"); |
208 let path = Path::new(r"output.png"); |
189 let file = File::create(path).unwrap(); |
209 let file = File::create(path).unwrap(); |
190 let ref mut w = BufWriter::new(file); |
210 let ref mut w = BufWriter::new(file); |
191 |
211 |