1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//! Algorithms for generating triangle meshes from:
//! - height maps
//! - signed distance fields
//! - voxel occupancy grids
//!
//! All of the algorithms are designed to be used with a `ChunkMap`, such that each chunk will have
//! its own mesh. In order to update the mesh for a chunk, you must copy not only the chunk, but
//! also some adjacent points, into an array before running the meshing algorithm.
//!
//! An example of updating chunk meshes for a height map is shown below.
//!
//! ```
//! use building_blocks_core::prelude::*;
//! use building_blocks_storage::prelude::*;
//! use building_blocks_mesh::height_map::*;
//!
//! use std::collections::HashSet;
//!
//! let chunk_shape = PointN([16; 2]);
//! let mut map = ChunkMap2::new(chunk_shape, 0.0, (), FastLz4 { level: 10 });
//!
//! // Mutate one or more of the chunks...
//! let mutated_chunk_keys = [PointN([0; 2]), PointN([16; 2])];
//!
//! // For each mutated chunk, and any adjacent chunk, the mesh will need to be updated.
//! let mut chunk_keys_to_update: HashSet<Point2i> = HashSet::new();
//! let offsets = Point2i::moore_offsets();
//! for chunk_key in mutated_chunk_keys.into_iter() {
//! chunk_keys_to_update.insert(*chunk_key);
//! for offset in offsets.iter() {
//! chunk_keys_to_update.insert(*chunk_key + *offset * chunk_shape);
//! }
//! }
//!
//! // Now we generate mesh vertices for each chunk.
//! let local_cache = LocalChunkCache::new();
//! let reader = ChunkMapReader2::new(&map, &local_cache);
//! for chunk_key in chunk_keys_to_update.into_iter() {
//! // It's crucial that we pad the chunk so we have access to adjacent points during meshing.
//! let padded_chunk_extent = padded_height_map_chunk_extent(
//! &map.extent_for_chunk_at_key(&chunk_key)
//! );
//! let mut padded_chunk = Array2::fill(padded_chunk_extent, 0.0);
//! copy_extent(&padded_chunk_extent, &reader, &mut padded_chunk);
//!
//! let mut hm_buffer = HeightMapMeshBuffer::default();
//! triangulate_height_map(&padded_chunk, &padded_chunk_extent, &mut hm_buffer);
//! // Do something with the mesh output...
//! }
//! ```
pub use ;
pub use ;
pub use ;