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