From e8fdd5f338aaf1e9270008466ecd84e2e0ce4e84 Mon Sep 17 00:00:00 2001 From: numzero Date: Mon, 10 Jun 2024 14:52:57 +0300 Subject: [PATCH] Nerdy! --- src/bin/flat.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/bin/flat.rs b/src/bin/flat.rs index 860a583..538fad2 100644 --- a/src/bin/flat.rs +++ b/src/bin/flat.rs @@ -593,6 +593,16 @@ fn test_rect() { assert_abs_diff_eq!(r.dx(10.0, r.du(r.x(10.0), 3.0)), 3.0, epsilon = 1.0e-5); } +trait FloatExt2 { + fn lerp(&self, t: f32) -> f32; +} + +impl FloatExt2 for (f32, f32) { + fn lerp(&self, t: f32) -> f32 { + self.0.lerp(self.1, t) + } +} + impl Metric for Rect { fn sqrt_at(&self, pos: Vec2) -> Decomp2 { let y = pos.y.abs(); @@ -603,7 +613,7 @@ impl Metric for Rect { assert!(sy > 0.0); Decomp2 { ortho: Mat2::IDENTITY, - diag: vec2(1.0, sy.lerp(1.0, sx)), + diag: vec2(1.0, (sy, 1.0).lerp(sx)), } } @@ -612,7 +622,7 @@ impl Metric for Rect { let y = pos.y.abs(); let sx = ((x - self.inner_radius) / (self.outer_radius - self.inner_radius)).clamp(0.0, 1.0); let sy = if y <= self.external_halflength { 1.0 / self.root(y) } else { 1.0 }; - let s = sy.lerp(1.0, sx); + let s = (sy, 1.0).lerp(sx); let dsx_dx = if x > self.inner_radius && x < self.outer_radius { pos.x.signum() / (self.outer_radius - self.inner_radius) } else { 0.0 }; let dsy_dy = if y <= self.external_halflength { -2.0 * pos.y.signum() * self.a() * sy.powi(3) } else { 0.0 }; let ds2_dx = 2.0 * s * (1.0 - sy) * dsx_dx;