Optimized implementation of <Space as Traceable>::trace

This commit is contained in:
numzero 2024-09-15 00:21:42 +03:00
parent d8eed54c8b
commit 644530e312

View File

@ -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
}
}