ray_tracing_core/geometry/collection/
leaf_node.rs1use 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
10pub 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}