rust/landgen/src/template_based.rs
branchtransitional_engine
changeset 15921 5f00829c55ec
parent 15920 168f44ef9b67
child 15922 da6b67f13c12
equal deleted inserted replaced
15920:168f44ef9b67 15921:5f00829c55ec
     1 use crate::{
       
     2     outline::OutlinePoints, outline_template::OutlineTemplate, LandGenerationParameters,
       
     3     LandGenerator,
       
     4 };
       
     5 use land2d::Land2D;
       
     6 
       
     7 pub struct TemplatedLandGenerator {
       
     8     outline_template: OutlineTemplate,
       
     9 }
       
    10 
       
    11 impl TemplatedLandGenerator {
       
    12     pub fn new(outline_template: OutlineTemplate) -> Self {
       
    13         Self { outline_template }
       
    14     }
       
    15 }
       
    16 
       
    17 impl LandGenerator for TemplatedLandGenerator {
       
    18     fn generate_land<T: Copy + PartialEq + Default, I: Iterator<Item = u32>>(
       
    19         &self,
       
    20         parameters: &LandGenerationParameters<T>,
       
    21         random_numbers: &mut I,
       
    22     ) -> Land2D<T> {
       
    23         let mut land = Land2D::new(&self.outline_template.size, parameters.basic);
       
    24 
       
    25         let mut points = OutlinePoints::from_outline_template(
       
    26             &self.outline_template,
       
    27             land.play_box(),
       
    28             land.size().size(),
       
    29             random_numbers,
       
    30         );
       
    31 
       
    32         // mirror
       
    33         if self.outline_template.can_mirror {
       
    34             if let Some(b) = random_numbers.next() {
       
    35                 if b & 1 != 0 {
       
    36                     points.mirror();
       
    37                 }
       
    38             }
       
    39         }
       
    40 
       
    41         // flip
       
    42         if self.outline_template.can_flip {
       
    43             if let Some(b) = random_numbers.next() {
       
    44                 if b & 1 != 0 {
       
    45                     points.flip();
       
    46                 }
       
    47             }
       
    48         }
       
    49 
       
    50         if !parameters.skip_distort {
       
    51             points.distort(parameters.distance_divisor, random_numbers);
       
    52         }
       
    53 
       
    54         if !parameters.skip_bezier {
       
    55             points.bezierize(5);
       
    56         }
       
    57 
       
    58         points.draw(&mut land, parameters.zero);
       
    59 
       
    60         for p in &points.fill_points {
       
    61             land.fill(*p, parameters.zero, parameters.zero)
       
    62         }
       
    63 
       
    64         points.draw(&mut land, parameters.basic);
       
    65 
       
    66         land
       
    67     }
       
    68 }