rust/landgen/src/wavefront_collapse/generator.rs
changeset 16058 de01be16df95
parent 16029 9cbd18220eb7
child 16059 2acea266d297
--- a/rust/landgen/src/wavefront_collapse/generator.rs	Sat Jan 18 16:55:04 2025 +0100
+++ b/rust/landgen/src/wavefront_collapse/generator.rs	Sat Jan 18 16:57:26 2025 +0100
@@ -3,6 +3,7 @@
 use crate::{LandGenerationParameters, LandGenerator};
 use integral_geometry::Size;
 use png::Decoder;
+use rand::Rng;
 use std::collections::HashSet;
 use std::fs::File;
 use std::io::{BufReader, Result};
@@ -179,6 +180,7 @@
     pub fn build_rules<T: Copy + PartialEq + Default>(
         &self,
         tiles: &[TileImage<T, String>],
+        probability_distribution_factor: i32,
     ) -> Vec<CollapseRule> {
         let [grid_top_edge, grid_right_edge, grid_bottom_edge, grid_left_edge]: [Option<
             Edge<String>,
@@ -263,7 +265,12 @@
                 }
             }
 
+            let weight = (probability_distribution_factor * 2 * i as i32 / (tiles.len() - 1) as i32
+                + 100
+                - probability_distribution_factor) as u32;
+
             rules.push(CollapseRule {
+                weight,
                 tile: Tile::Numbered(i),
                 top,
                 right,
@@ -277,13 +284,17 @@
 }
 
 impl LandGenerator for WavefrontCollapseLandGenerator {
-    fn generate_land<T: Copy + PartialEq + Default, I: Iterator<Item = u32>>(
+    fn generate_land<T: Copy + PartialEq + Default>(
         &self,
         parameters: &LandGenerationParameters<T>,
-        random_numbers: &mut I,
+        random_numbers: &mut impl Rng,
     ) -> land2d::Land2D<T> {
+        assert!(parameters.distance_divisor >= 1);
+        assert!(parameters.distance_divisor <= 25);
+
         let tiles = self.load_template(parameters);
-        let rules = self.build_rules(&tiles);
+        let distribution_factor = (parameters.distance_divisor - 1) as i32 * 8 - 96;
+        let rules = self.build_rules(&tiles, distribution_factor);
 
         let mut wfc = WavefrontCollapse::new(self.template.wrap);
         wfc.set_rules(rules);