5个版本
0.1.4 | 2021年8月27日 |
---|---|
0.1.3 | 2021年8月27日 |
0.1.2 | 2021年8月27日 |
0.1.1 | 2021年8月27日 |
0.1.0 | 2021年8月27日 |
#703 in 数据结构
43KB
512 行
LodTree
LodTree,一个简单的树形数据结构,用于执行基于分块的细节级别。
目标
本crate的目标是提供一个通用、易于使用的树形数据结构,可用于创建Lod四叉树、八叉树等。
内部,该树尽可能保持分配的内存量,以避免堆分配的成本,并将实际的块数据与树数据分开存储。
这确实有一定的成本,主要是,只能检索即将添加的块及其位置作为切片,尽管对于大多数(过程式)地形实现,创建新块和编辑块的成本最高,因此这不应成为最大的问题。
示例
- rayon:展示了如何使用rayon与树一起并行生成新块。
- glium:展示了使用glium进行绘图的基本设置将如何工作。
用法
导入crate
use lodtree::*;
use lodtree::coords::OctVec; // or Quadvec if you're making an octree
树是它自己的结构体,接受一个块(任何实现了Sized的)和lod向量(任何实现了LodVec特质的)。
let mut tree = Tree::<Chunk, OctVec>::new();
如果您想根据相机移动更新块,可以使用prepare_update进行检查。它接受3个参数。
目标:在哪个位置生成最详细的细节。
给定的LodVec实现(OctVec和QuadVec)分别接受4和3个参数。前3/2个是树中的位置,这取决于lod级别。最后一个参数是lod级别。对于这个目标,不会生成比这更小的lod。
细节:目标的细节程度。默认实现将此定义为围绕目标块的周围目标lod级别的块数量。
块创建者:内部填充新块的缓冲区,并调用此函数创建新块。它接受块位置的LodVec。
let needs_updating = tree.prepare_update(
&[OctVec(8, 8, 8, 8)], // the target positions to generate the lod around
4, // amount of detail
|pos| Chunk {} // and the function to construct the chunk with
);
现在,树已准备好进行更新,所以现在我们想做点事情。首先,我们想要处理所有将要添加的块。这是API作为切片公开的唯一事物,因此我们可以使用rayon并行迭代。
tree.get_chunks_to_add_slice_mut()
.par_iter_mut()
.for_each(|(position, chunk)| {
// and run expensive init, probably does something with procedural generation
chunk.expensive_init(*position);
});
接下来,我们还想要更改一些块的可见性,以便它们不与更详细的lod重叠。
// and make all chunks visible or not
for i in 0..tree.get_num_chunks_to_activate() {
tree.get_chunk_to_activate_mut(i).set_visible(true);
}
for i in 0..tree.get_num_chunks_to_deactivate() {
tree.get_chunk_to_deactivate_mut(i).set_visible(false);
}
我们还可能想要对被删除的块进行一些清理。
for i in 0..tree.get_num_chunks_to_remove() {
tree.get_chunk_to_remove_mut(i).cleanup();
}
最后,实际上使用新块更新树。请注意,可能需要多次执行 prepare_update 和 do_update 循环,直到不再需要添加新块,因为树每次只添加一个 LOD 级别。
tree.do_update();
路线图
- 支持获取“已编辑”的块,通过传递一个块将被编辑的区域。
- 所有块数据访问方法的迭代器。
许可证
许可方式为以下之一
- Apache License 2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确声明,否则根据 Apache-2.0 许可证定义,你提交的任何旨在包含在作品中的贡献都将按上述方式双重许可,不附加任何额外条款或条件。