From 08dba8e1dd8767c97f321363ec3ebd3375d7f4b5 Mon Sep 17 00:00:00 2001 From: numzero Date: Fri, 28 Jun 2024 15:19:17 +0300 Subject: [PATCH] Use unified coordinate handling as unified --- src/bin/flat/tube/mod.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/bin/flat/tube/mod.rs b/src/bin/flat/tube/mod.rs index a345bef..eefa4b3 100644 --- a/src/bin/flat/tube/mod.rs +++ b/src/bin/flat/tube/mod.rs @@ -60,12 +60,8 @@ impl Space { let inner = Rect { size: vec2(self.tube.inner_radius, self.tube.internal_halflength) }; let ray = cs.global_to_flat(ray); assert!(inner.is_inside(ray.pos)); - let dist = inner.trace_out_of(ray).expect("Can't get outta here!"); - let objs = self.list_objects(|loc| cs.global_to_flat(loc)); - FlatTraceResult { - end: Some(cs.flat_to_global(ray.forward(dist))), - objects: Self::hit_objects(objs.as_slice(), ray, Some(dist), |pos| cs.flat_to_global(pos)), - } + let dist = inner.trace_out_of(ray); + self.trace_flat(cs, ray, dist) } pub fn trace_outer(&self, ray: Ray) -> FlatTraceResult { @@ -73,10 +69,14 @@ impl Space { let cs = OuterCS(self.tube); let outer = Rect { size: vec2(self.tube.outer_radius, self.tube.external_halflength) }; let dist = outer.trace_into(ray); + self.trace_flat(cs, ray, dist) + } + + fn trace_flat(&self, cs: impl FlatCoordinateSystem + FlatCoordinateSystem + FlatCoordinateSystem, ray: Ray, dist: Option) -> FlatTraceResult { let objs = self.list_objects(|loc| cs.global_to_flat(loc)); FlatTraceResult { - end: dist.map(|dist| ray.forward(dist)), - objects: Self::hit_objects(objs.as_slice(), ray, dist, |pos| pos), + end: dist.map(|dist| cs.flat_to_global(ray.forward(dist))), + objects: Self::hit_objects(objs.as_slice(), ray, dist, |pos| cs.flat_to_global(pos)), } } @@ -196,8 +196,8 @@ mod coords { use super::{Rect, Tube}; pub trait FlatCoordinateSystem { - fn flat_to_global(&self, v: T) -> T; - fn global_to_flat(&self, v: T) -> T; + fn flat_to_global(&self, v: T) -> T { v } + fn global_to_flat(&self, v: T) -> T { v } } pub struct InnerCS(pub Tube); @@ -243,6 +243,10 @@ mod coords { pub struct OuterCS(pub Tube); + impl FlatCoordinateSystem for OuterCS {} + + impl FlatCoordinateSystem for OuterCS {} + impl FlatCoordinateSystem for OuterCS { fn flat_to_global(&self, loc: Location) -> Location { todo!()