diff -r c571d4b8879c -r 8f093b1b18bc rust/landgen/src/wavefront_collapse/generator.rs --- a/rust/landgen/src/wavefront_collapse/generator.rs Wed Feb 01 11:19:45 2023 +0100 +++ b/rust/landgen/src/wavefront_collapse/generator.rs Thu Feb 02 08:41:31 2023 +0100 @@ -1,22 +1,53 @@ +use super::tile_image::TileImage; use super::wavefront_collapse::WavefrontCollapse; -use super::tile_image::TileImage; use crate::{LandGenerationParameters, LandGenerator}; +use integral_geometry::Size; +use png::Decoder; +use std::fs::File; +use std::io::BufReader; pub struct WavefrontCollapseLandGenerator { wfc: WavefrontCollapse, - tiles: Vec, } impl WavefrontCollapseLandGenerator { pub fn new() -> Self { Self { wfc: WavefrontCollapse::default(), - tiles: Vec::new() } } - pub fn load_template() { + pub fn load_template(&self, parameters: &LandGenerationParameters) -> Vec> { + let file = File::open("sample.png").expect("file exists"); + let decoder = Decoder::new(BufReader::new(file)); + let mut reader = decoder.read_info().unwrap(); + + let info = reader.info(); + let mut tiles_image = vec2d::Vec2D::new( + &Size::new(info.width as usize, info.height as usize), + parameters.zero, + ); + + let mut buf = vec![0; reader.output_buffer_size()]; + let info = reader.next_frame(&mut buf).unwrap(); + let bytes = &buf[..info.buffer_size()]; + let mut tiles_image_pixels = tiles_image.as_mut_slice().into_iter(); + + for line in bytes.chunks_exact(info.line_size) { + for value in line.chunks_exact(info.color_type.samples()) { + *tiles_image_pixels + .next() + .expect("vec2d size matching image dimensions") = + if value.into_iter().all(|p| *p == 0) { + parameters.zero + } else { + parameters.basic + }; + } + } + + TileImage::::new(tiles_image).split(3, 3) } } @@ -26,6 +57,23 @@ parameters: &LandGenerationParameters, random_numbers: &mut I, ) -> land2d::Land2D { + let tiles = self.load_template(parameters); + todo!() } } + +#[cfg(test)] +mod tests { + use super::WavefrontCollapseLandGenerator; + use crate::{LandGenerator, LandGenerationParameters}; + use integral_geometry::Size; + use vec2d::Vec2D; + + #[test] + fn test_generation() { + let wfc_gen =WavefrontCollapseLandGenerator::new(); + let landgen_params = LandGenerationParameters::new(0u8, 255u8, 0, true, true); + wfc_gen.generate_land(&landgen_params, &mut std::iter::repeat(1u32)); + } +}