author | Wuzzy <Wuzzy2@mail.ru> |
Tue, 12 May 2020 22:21:19 +0200 | |
changeset 15560 | 6d0682485ed5 |
parent 14207 | bb2f301d4fe0 |
child 15828 | 44b49f255e31 |
permissions | -rw-r--r-- |
use integral_geometry::{Point, Size}; use land2d::Land2D; use crate::{ LandGenerationParameters, LandGenerator, outline::OutlinePoints, outline_template::OutlineTemplate }; pub struct TemplatedLandGenerator { outline_template: OutlineTemplate, } impl TemplatedLandGenerator { pub fn new(outline_template: OutlineTemplate) -> Self { Self { outline_template } } } impl LandGenerator for TemplatedLandGenerator { fn generate_land<T: Copy + PartialEq, I: Iterator<Item = u32>>( &self, parameters: &LandGenerationParameters<T>, random_numbers: &mut I, ) -> Land2D<T> { let mut land = Land2D::new(self.outline_template.size, parameters.basic); let mut points = OutlinePoints::from_outline_template( &self.outline_template, land.play_box(), land.size(), random_numbers, ); // mirror if self.outline_template.can_mirror { if let Some(b) = random_numbers.next() { if b & 1 != 0 { points.mirror(); } } } // flip if self.outline_template.can_flip { if let Some(b) = random_numbers.next() { if b & 1 != 0 { points.flip(); } } } if !parameters.skip_distort { points.distort(parameters.distance_divisor, random_numbers); } if !parameters.skip_bezier { points.bezierize(5); } points.draw(&mut land, parameters.zero); for p in &points.fill_points { land.fill(*p, parameters.zero, parameters.zero) } points.draw(&mut land, parameters.basic); land } }