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 } |
|