1#![doc = include_str!("../README.md")]
2#![warn(missing_docs)]
3
4mod morton;
5mod search;
6
7pub mod dim2;
8pub mod dim3;
9
10pub trait BvhVolume: bevy_math::bounding::BoundingVolume + Clone + Debug {
13 const INFINITY: Self;
15
16 fn morton_code(&self) -> usize;
18}
19
20pub struct Bvh<Volume: BvhVolume, T: Copy> {
22 nodes: Vec<BvhNode<Volume>>,
23 items: Vec<BvhItem<Volume, T>>,
24}
25
26impl<Volume: BvhVolume, T: Copy> Default for Bvh<Volume, T> {
27 fn default() -> Self {
28 Self {
29 nodes: Vec::new(),
30 items: Vec::new(),
31 }
32 }
33}
34
35impl<Volume: BvhVolume, T: Copy> Bvh<Volume, T> {
36 pub fn n_nodes(&self) -> usize {
39 self.nodes.len()
40 }
41
42 pub fn n_items(&self) -> usize {
44 self.items.len()
45 }
46
47 pub fn nodes(&self) -> impl Iterator<Item = &BvhNode<Volume>> {
49 self.nodes.iter()
50 }
51
52 pub fn items(&self) -> impl Iterator<Item = &BvhItem<Volume, T>> {
54 self.items.iter()
55 }
56}
57
58mod construct;
59mod debug;
60
61pub mod traverse;
62
63pub mod prelude {
64 pub use crate::{dim2::*, dim3::*, traverse::Stack};
67}
68
69use std::fmt::Debug;
70
71#[derive(Clone, Copy, Debug)]
73pub struct BvhNode<Volume: BvhVolume> {
74 pub volume: Volume,
76 pub count: u32,
78 pub start_index: u32,
80}
81
82#[derive(Clone, Copy, Debug)]
84pub struct BvhItem<Volume: BvhVolume, T: Copy> {
85 pub volume: Volume,
87 pub t: T,
89}