rust/landgen/src/wavefront_collapse/generator.rs
branchtransitional_engine
changeset 16053 3402b2185698
parent 16052 0fd23fc57947
child 16058 9cbd18220eb7
equal deleted inserted replaced
16052:0fd23fc57947 16053:3402b2185698
     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, Result};
     8 use std::io::{BufReader, Result};
     9 use std::path::Path;
     9 use std::path::{Path, PathBuf};
    10 
    10 
    11 #[derive(Clone)]
    11 #[derive(Clone)]
    12 pub struct EdgeDescription {
    12 pub struct EdgeDescription {
    13     pub name: String,
    13     pub name: String,
    14     pub reversed: Option<bool>,
    14     pub reversed: Option<bool>,
    51     pub wrap: bool,
    51     pub wrap: bool,
    52 }
    52 }
    53 
    53 
    54 pub struct WavefrontCollapseLandGenerator {
    54 pub struct WavefrontCollapseLandGenerator {
    55     pub template: TemplateDescription,
    55     pub template: TemplateDescription,
       
    56     data_path: PathBuf,
    56 }
    57 }
    57 
    58 
    58 impl WavefrontCollapseLandGenerator {
    59 impl WavefrontCollapseLandGenerator {
    59     pub fn new(template: TemplateDescription) -> Self {
    60     pub fn new(template: TemplateDescription, data_path: &Path) -> Self {
    60         Self { template }
    61         Self { template, data_path: data_path.to_owned() }
    61     }
    62     }
    62 
    63 
    63     fn load_image_tiles<T: Copy + PartialEq + Default>(
    64     fn load_image_tiles<T: Copy + PartialEq + Default>(
       
    65         &self,
    64         parameters: &LandGenerationParameters<T>,
    66         parameters: &LandGenerationParameters<T>,
    65         tile_description: &TileDescription,
    67         tile_description: &TileDescription,
    66     ) -> Result<Vec<TileImage<T, String>>> {
    68     ) -> Result<Vec<TileImage<T, String>>> {
    67         let mut result = Vec::new();
    69         let mut result = Vec::new();
    68 
    70 
    69         let file = File::open(
    71         let file = File::open(
    70             Path::new("../share/hedgewars/Data/Tiles")
    72             self.data_path.join("Tiles")
    71                 .join(&tile_description.name)
    73                 .join(&tile_description.name)
    72                 .as_path(),
    74                 .as_path(),
    73         )?;
    75         )?;
    74         let decoder = Decoder::new(BufReader::new(file));
    76         let decoder = Decoder::new(BufReader::new(file));
    75         let mut reader = decoder.read_info().unwrap();
    77         let mut reader = decoder.read_info().unwrap();
   158         parameters: &LandGenerationParameters<T>,
   160         parameters: &LandGenerationParameters<T>,
   159     ) -> Vec<TileImage<T, String>> {
   161     ) -> Vec<TileImage<T, String>> {
   160         let mut result = Vec::new();
   162         let mut result = Vec::new();
   161 
   163 
   162         for tile_description in self.template.tiles.iter() {
   164         for tile_description in self.template.tiles.iter() {
   163             if let Ok(mut tiles) = Self::load_image_tiles(parameters, tile_description) {
   165             if let Ok(mut tiles) = self.load_image_tiles(parameters, tile_description) {
   164                 result.append(&mut tiles);
   166                 result.append(&mut tiles);
   165             } else {
   167             } else {
   166                 eprintln!("Failed to load a tile!");
   168                 eprintln!("Failed to load a tile!");
   167             }
   169             }
   168         }
   170         }