ray_tracing_core/geometry/collection/
leaf_node.rs

1use crate::core::object::Object;
2use crate::core::HitRecord;
3use crate::geometry::{Geometry, Visitor};
4use crate::math::{Ray, AABB};
5use crate::types::{FSize, Vector3};
6use std::error::Error;
7use std::ops::Range;
8use std::sync::Arc;
9
10/// Bounding volume leaf node  
11pub struct LeafNode {
12    pub id: usize,
13    pub node: Arc<dyn Geometry>,
14    bounding_box: Option<AABB>,
15}
16
17impl LeafNode {
18    pub fn new(node: Arc<dyn Geometry>, t_range: Range<FSize>) -> LeafNode {
19        LeafNode {
20            id: Object::new_id(),
21            node: node.clone(),
22            bounding_box: node.bounding_box(t_range.clone()),
23        }
24    }
25}
26
27impl Geometry for LeafNode {
28    fn get_id(&self) -> usize {
29        self.id
30    }
31
32    fn bounding_box(&self, _: Range<FSize>) -> Option<AABB> {
33        self.bounding_box.clone()
34    }
35
36    fn hit(&self, ray: &Ray, t_range: Range<FSize>) -> Option<HitRecord> {
37        match &self.bounding_box {
38            Some(bounding_box) => {
39                if !bounding_box.hit(&ray, t_range.clone()) {
40                    return None;
41                }
42            }
43            None => (),
44        }
45        self.node.hit(ray, t_range.clone())
46    }
47
48    fn pdf_value(&self, o: &Vector3, v: &Vector3) -> FSize {
49        self.node.pdf_value(o, v)
50    }
51
52    fn random(&self, o: &Vector3) -> Vector3 {
53        self.node.random(o)
54    }
55
56    fn accept(&self, visitor: &mut dyn Visitor) -> Result<(), Box<dyn Error>> {
57        visitor.visit_collection_leave_node(&self)
58    }
59}