rust/landgen/src/outline_template_based/template_based.rs
changeset 16058 de01be16df95
parent 16044 5c941f5deeec
child 16073 5d302b12d837
equal deleted inserted replaced
16057:106674bb21b1 16058:de01be16df95
     1 use super::{outline::OutlinePoints, outline_template::OutlineTemplate};
     1 use super::{outline::OutlinePoints, outline_template::OutlineTemplate};
     2 use crate::{LandGenerationParameters, LandGenerator};
     2 use crate::{LandGenerationParameters, LandGenerator};
     3 use land2d::Land2D;
     3 use land2d::Land2D;
       
     4 use rand::Rng;
     4 
     5 
     5 pub struct TemplatedLandGenerator {
     6 pub struct TemplatedLandGenerator {
     6     outline_template: OutlineTemplate,
     7     outline_template: OutlineTemplate,
     7 }
     8 }
     8 
     9 
    11         Self { outline_template }
    12         Self { outline_template }
    12     }
    13     }
    13 }
    14 }
    14 
    15 
    15 impl LandGenerator for TemplatedLandGenerator {
    16 impl LandGenerator for TemplatedLandGenerator {
    16     fn generate_land<T: Copy + PartialEq + Default, I: Iterator<Item = u32>>(
    17     fn generate_land<T: Copy + PartialEq + Default>(
    17         &self,
    18         &self,
    18         parameters: &LandGenerationParameters<T>,
    19         parameters: &LandGenerationParameters<T>,
    19         random_numbers: &mut I,
    20         random_numbers: &mut impl Rng,
    20     ) -> Land2D<T> {
    21     ) -> Land2D<T> {
    21         let do_invert = self.outline_template.is_negative
    22         let do_invert = self.outline_template.is_negative
    22             && (!self.outline_template.can_invert || random_numbers.next().unwrap() & 1 == 0);
    23             && (!self.outline_template.can_invert || random_numbers.gen());
    23         let (basic, zero) = if do_invert {
    24         let (basic, zero) = if do_invert {
    24             (parameters.zero, parameters.basic)
    25             (parameters.zero, parameters.basic)
    25         } else {
    26         } else {
    26             (parameters.basic, parameters.zero)
    27             (parameters.basic, parameters.zero)
    27         };
    28         };
    34             land.size().size(),
    35             land.size().size(),
    35             random_numbers,
    36             random_numbers,
    36         );
    37         );
    37 
    38 
    38         // mirror
    39         // mirror
    39         if self.outline_template.can_mirror {
    40         if self.outline_template.can_mirror && random_numbers.gen() {
    40             if let Some(b) = random_numbers.next() {
    41             points.mirror();
    41                 if b & 1 != 0 {
       
    42                     points.mirror();
       
    43                 }
       
    44             }
       
    45         }
    42         }
    46 
    43 
    47         // flip
    44         // flip
    48         if self.outline_template.can_flip {
    45         if self.outline_template.can_flip && random_numbers.gen() {
    49             if let Some(b) = random_numbers.next() {
    46             points.flip();
    50                 if b & 1 != 0 {
       
    51                     points.flip();
       
    52                 }
       
    53             }
       
    54         }
    47         }
    55 
    48 
    56         if !parameters.skip_distort {
    49         if !parameters.skip_distort {
    57             let distortion_limiting_factor = 100 + random_numbers.next().unwrap() % 8 * 10;
    50             let distortion_limiting_factor = 100 + random_numbers.gen_range(0..8) * 10;
    58 
    51 
    59             points.distort(
    52             points.distort(
    60                 parameters.distance_divisor,
    53                 parameters.distance_divisor,
    61                 distortion_limiting_factor,
    54                 distortion_limiting_factor,
    62                 random_numbers,
    55                 random_numbers,