Centralize subspace matching
This commit is contained in:
parent
8394e4108c
commit
1c283a6fbe
|
|
@ -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!")
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user