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}