#quad-tree #tree #oct-tree #terrain #lod

lodtree

一个简单的crate,用于创建八叉树和四叉树,以实现分块细节级别。

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 数据结构

MIT/Apache

43KB
512

Documentation

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-2.0 许可证定义,你提交的任何旨在包含在作品中的贡献都将按上述方式双重许可,不附加任何额外条款或条件。

无运行时依赖