rust/landgen/src/outline_template_based/outline.rs
branchtransitional_engine
changeset 16073 5c941f5deeec
parent 16064 0caa3dfb3ba2
child 16087 de01be16df95
--- a/rust/landgen/src/outline_template_based/outline.rs	Fri Nov 29 22:29:58 2024 +0100
+++ b/rust/landgen/src/outline_template_based/outline.rs	Sun Dec 01 21:08:03 2024 +0100
@@ -8,6 +8,7 @@
 
 pub struct OutlinePoints {
     pub islands: Vec<Polygon>,
+    pub walls: Vec<Polygon>,
     pub fill_points: Vec<Point>,
     pub size: Size,
     pub play_box: Rect,
@@ -37,6 +38,19 @@
                         .into()
                 })
                 .collect(),
+            walls: outline_template
+                .walls
+                .iter()
+                .map(|i| {
+                    i.iter()
+                        .zip(random_numbers.tuples())
+                        .map(|(rect, (rnd_a, rnd_b))| {
+                            play_box.top_left() + rect.quotient(rnd_a as usize, rnd_b as usize)
+                        })
+                        .collect::<Vec<_>>()
+                        .into()
+                })
+                .collect(),
             fill_points: outline_template.fill_points.clone(),
             intersections_box: Rect::at_origin(size)
                 .with_margin(size.to_square().width as i32 * -2),
@@ -51,6 +65,7 @@
         self.islands
             .iter()
             .flat_map(|p| p.iter())
+            .chain(self.walls.iter().flat_map(|p| p.iter()))
             .chain(self.fill_points.iter())
     }
 
@@ -58,6 +73,7 @@
         self.islands
             .iter_mut()
             .flat_map(|i| i.iter_mut())
+            .chain(self.walls.iter_mut().flat_map(|p| p.iter_mut()))
             .chain(self.fill_points.iter_mut())
     }
 
@@ -292,13 +308,22 @@
     }
 
     pub fn draw<T: Copy + PartialEq + Default>(&self, land: &mut Land2D<T>, value: T) {
-        for segment in self.segments_iter() {
+        for segment in self.visible_segments_iter() {
             land.draw_line(segment, value);
         }
     }
 
+    fn visible_segments_iter<'a>(&'a self) -> impl Iterator<Item = Line> + 'a {
+        self.islands
+            .iter()
+            .flat_map(|p| p.iter_edges())
+    }
+
     fn segments_iter<'a>(&'a self) -> impl Iterator<Item = Line> + 'a {
-        self.islands.iter().flat_map(|p| p.iter_edges())
+        self.islands
+            .iter()
+            .flat_map(|p| p.iter_edges())
+            .chain(self.walls.iter().flat_map(|p| p.iter_edges()))
     }
 
     pub fn mirror(&mut self) {
@@ -322,6 +347,7 @@
             Polygon::new(&[Point::new(0, 0), Point::new(20, 0), Point::new(30, 30)]),
             Polygon::new(&[Point::new(10, 15), Point::new(15, 20), Point::new(20, 15)]),
         ],
+        walls: vec![],
         fill_points: vec![Point::new(1, 1)],
         play_box: Rect::at_origin(size).with_margin(10),
         size: Size::square(100),