From 1c283a6fbeb22cd8574cf201e902d2350e24e70d Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 15 Sep 2024 00:55:14 +0300 Subject: [PATCH] Centralize subspace matching --- src/bin/flat/tube/mod.rs | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/bin/flat/tube/mod.rs b/src/bin/flat/tube/mod.rs index 0fbd959..6b256c0 100644 --- a/src/bin/flat/tube/mod.rs +++ b/src/bin/flat/tube/mod.rs @@ -73,6 +73,14 @@ impl Space { self.trace_flat(OuterCS(self.tube), ray) } + fn obj_hitter(&self, pos: Vec2) -> Option FlatTraceResult> { + match self.which_subspace(pos) { + Inner => Some(Self::trace_inner), + Outer => Some(Self::trace_outer), + Boundary => None, + } + } + fn trace_flat(&self, cs: impl FlatRegion, ray: Ray) -> FlatTraceResult { let ray = cs.global_to_flat(ray); let dist = cs.distance_to_boundary(ray); @@ -168,19 +176,13 @@ impl Traceable for Space { let ray = self.camera_ray_to_abs(camera, ray); let mut hits = vec![]; std::iter::successors(Some(ray), |ray: &Ray| { - self.trace_iter(*ray) + let ret = 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") + .find_map(|ray| self.obj_hitter(ray.pos).map(|hitter| hitter(self, ray))) + .expect("Space::trace_iter does not terminate"); + hits.extend(ret.objects); // TODO fix distance + ret.end }) .nth(100) .is_some() @@ -198,12 +200,9 @@ impl DebugTraceable for Space { let trace_to_flat = |points: &mut Vec, ray| { for ray in self.trace_iter(ray).skip(1) { points.push(ray.pos); - let hitter = match self.which_subspace(ray.pos) { - Inner => Self::trace_inner, - Outer => Self::trace_outer, - Boundary => continue, - }; - return (ray, hitter(self, ray)); + if let Some(hitter) = self.obj_hitter(ray.pos) { + return (ray, hitter(self, ray)); + } } unreachable!("Space::trace_iter terminated!") };