Skip to main content

world_gen/
map.rs

1pub type Map3DDataCol = Vec<bool>;
2pub type Map3DDataLayer = Vec<Map3DDataCol>;
3pub type Map3DData = Vec<Map3DDataLayer>;
4
5use crate::heightmap::HeightMap;
6
7pub struct Map3DDimensions {
8    pub height: u32,
9    pub width: u32,
10    pub depth: u32,
11}
12
13pub struct Map3D {
14    pub dimensions: Map3DDimensions,
15    pub seed: u32,
16    pub data: Map3DData,
17}
18
19impl Map3D {
20    /// Creates a new `Map3D` instance.
21    /// # Examples
22    /// ```
23    /// use world_gen::map::Map3D;
24    ///
25    /// let height = 300;
26    /// let width = 400;
27    /// let depth = 255;
28    /// let seed = 12345;
29    /// let map = Map3D::new(height, width, depth, seed);
30    /// ```
31    pub fn new(height: u32, width: u32, depth: u32, seed: u32) -> Map3D {
32        let dimensions = Map3DDimensions {
33            height,
34            width,
35            depth,
36        };
37        let map_data = Map3D::gen(&dimensions, seed);
38        Map3D {
39            dimensions,
40            seed,
41            data: map_data,
42        }
43    }
44
45    fn gen(dimensions: &Map3DDimensions, seed: u32) -> Map3DData {
46        let height_map = HeightMap::new(dimensions.height, dimensions.width, seed);
47        let mut map_data = Map3DData::new();
48        for level in 0..dimensions.depth {
49            map_data.push(Map3D::get_data_layer(dimensions.depth, level, &height_map));
50        }
51        map_data
52    }
53
54    fn get_data_layer(depth: u32, level: u32, height_map: &HeightMap) -> Map3DDataLayer {
55        let mut data_layer = Map3DDataLayer::new();
56        for x in 0usize..height_map.width as usize {
57            let mut data_col = Map3DDataCol::new();
58            for y in 0usize..height_map.height as usize {
59                data_col.push(
60                    if (height_map.data[x][y] * depth as f64).round() >= (depth - level) as f64 {
61                        true
62                    } else {
63                        false
64                    },
65                );
66            }
67            data_layer.push(data_col);
68        }
69        data_layer
70    }
71}