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)
|
||||
}
|
||||
|
||||
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 {
|
||||
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);
|
||||
.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
|
||||
Some(ret.end)
|
||||
})
|
||||
.expect("Space::trace_iter does not terminate")
|
||||
ret.end
|
||||
})
|
||||
.nth(100)
|
||||
.is_some()
|
||||
|
|
@ -198,13 +200,10 @@ impl DebugTraceable for Space {
|
|||
let trace_to_flat = |points: &mut Vec<Vec2>, 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,
|
||||
};
|
||||
if let Some(hitter) = self.obj_hitter(ray.pos) {
|
||||
return (ray, hitter(self, ray));
|
||||
}
|
||||
}
|
||||
unreachable!("Space::trace_iter terminated!")
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user