rust/landgen/src/wavefront_collapse/generator.rs
branchtransitional_engine
changeset 15920 168f44ef9b67
parent 15919 659c92124c26
child 15922 da6b67f13c12
equal deleted inserted replaced
15919:659c92124c26 15920:168f44ef9b67
     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