Optimized implementation of <Space as Traceable>::trace
This commit is contained in:
parent
d8eed54c8b
commit
644530e312
|
|
@ -165,7 +165,27 @@ impl Space {
|
|||
|
||||
impl Traceable for Space {
|
||||
fn trace(&self, camera: Location, ray: Ray) -> Vec<Hit> {
|
||||
self.trace_dbg(camera, ray).0
|
||||
let ray = self.camera_ray_to_abs(camera, ray);
|
||||
let mut hits = vec![];
|
||||
std::iter::successors(Some(ray), |ray: &Ray| {
|
||||
self.trace_iter(*ray)
|
||||
.skip(1)
|
||||
.find_map(|ray| {
|
||||
let hitter = match self.which_subspace(ray.pos) {
|
||||
Inner => Self::trace_inner,
|
||||
Outer => Self::trace_outer,
|
||||
Boundary => return None,
|
||||
};
|
||||
let ret = hitter(self, ray);
|
||||
hits.extend(ret.objects); // TODO fix distance
|
||||
Some(ret.end)
|
||||
})
|
||||
.expect("Space::trace_iter does not terminate")
|
||||
})
|
||||
.nth(100)
|
||||
.is_some()
|
||||
.then(|| panic!("tracing didn't terminate"));
|
||||
hits
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user