1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use std::sync::Arc;
use geometry::{Boundable, BBox, BoundableGeom, DifferentialGeometry};
use material::Material;
use linalg::{Ray, AnimatedTransform};
pub struct Receiver {
geom: Arc<BoundableGeom + Send + Sync>,
pub material: Arc<Material + Send + Sync>,
transform: AnimatedTransform,
pub tag: String,
}
impl Receiver {
pub fn new(geom: Arc<BoundableGeom + Send + Sync>, material: Arc<Material + Send + Sync>,
transform: AnimatedTransform, tag: String) -> Receiver {
Receiver { geom: geom, material: material, transform: transform, tag: tag }
}
pub fn intersect(&self, ray: &mut Ray) -> Option<(DifferentialGeometry, &Material)> {
let transform = self.transform.transform(ray.time);
let mut local = transform.inv_mul_ray(ray);
let mut dg = match self.geom.intersect(&mut local) {
Some(dg) => dg,
None => return None,
};
ray.max_t = local.max_t;
dg.p = transform * dg.p;
dg.n = transform * dg.n;
dg.ng = transform * dg.ng;
dg.dp_du = transform * dg.dp_du;
dg.dp_dv = transform * dg.dp_dv;
Some((dg, &*self.material))
}
pub fn get_transform(&self) -> &AnimatedTransform {
&self.transform
}
pub fn set_transform(&mut self, transform: AnimatedTransform) {
self.transform = transform;
}
}
impl Boundable for Receiver {
fn bounds(&self, start: f32, end: f32) -> BBox {
self.transform.animation_bounds(&self.geom.bounds(start, end), start, end)
}
}