Centralize subspace matching

This commit is contained in:
numzero 2024-09-15 00:55:14 +03:00
parent 8394e4108c
commit 1c283a6fbe

View File

@ -73,6 +73,14 @@ impl Space {
self.trace_flat(OuterCS(self.tube), ray) self.trace_flat(OuterCS(self.tube), ray)
} }
fn obj_hitter(&self, pos: Vec2) -> Option<fn(&Self, ray: Ray) -> 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 { fn trace_flat(&self, cs: impl FlatRegion, ray: Ray) -> FlatTraceResult {
let ray = cs.global_to_flat(ray); let ray = cs.global_to_flat(ray);
let dist = cs.distance_to_boundary(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 ray = self.camera_ray_to_abs(camera, ray);
let mut hits = vec![]; let mut hits = vec![];
std::iter::successors(Some(ray), |ray: &Ray| { std::iter::successors(Some(ray), |ray: &Ray| {
self.trace_iter(*ray) let ret = self
.trace_iter(*ray)
.skip(1) .skip(1)
.find_map(|ray| { .find_map(|ray| self.obj_hitter(ray.pos).map(|hitter| hitter(self, ray)))
let hitter = match self.which_subspace(ray.pos) { .expect("Space::trace_iter does not terminate");
Inner => Self::trace_inner, hits.extend(ret.objects); // TODO fix distance
Outer => Self::trace_outer, ret.end
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) .nth(100)
.is_some() .is_some()
@ -198,12 +200,9 @@ impl DebugTraceable for Space {
let trace_to_flat = |points: &mut Vec<Vec2>, ray| { let trace_to_flat = |points: &mut Vec<Vec2>, ray| {
for ray in self.trace_iter(ray).skip(1) { for ray in self.trace_iter(ray).skip(1) {
points.push(ray.pos); points.push(ray.pos);
let hitter = match self.which_subspace(ray.pos) { if let Some(hitter) = self.obj_hitter(ray.pos) {
Inner => Self::trace_inner, return (ray, hitter(self, ray));
Outer => Self::trace_outer, }
Boundary => continue,
};
return (ray, hitter(self, ray));
} }
unreachable!("Space::trace_iter terminated!") unreachable!("Space::trace_iter terminated!")
}; };