equal
deleted
inserted
replaced
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, |