From 9b3a9ce43785993eea3139ccd628a286e6809710 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 16 Dec 2025 12:24:04 -0800 Subject: [PATCH] narrow directions more carefully --- engine/physics/src/minimum_difference.rs | 55 ++++++++++++++++++------ 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/engine/physics/src/minimum_difference.rs b/engine/physics/src/minimum_difference.rs index b63d3e4e..9a8217fd 100644 --- a/engine/physics/src/minimum_difference.rs +++ b/engine/physics/src/minimum_difference.rs @@ -100,6 +100,37 @@ const fn choose_any_direction()->Planar64Vec3{ vec3::X } +fn narrow_dir2(dir:Vector3>)->Planar64Vec3{ + if dir==vec3::zero(){ + return dir.narrow_1().unwrap(); + } + let x=dir.x.as_bits().unsigned_abs().bits(); + let y=dir.y.as_bits().unsigned_abs().bits(); + let z=dir.z.as_bits().unsigned_abs().bits(); + let big=x.max(y).max(z); + const MAX_BITS:u32=64+31; + if MAX_BITS>(big-MAX_BITS) + }else{ + dir + }.narrow_1().unwrap() +} +fn narrow_dir3(dir:Vector3>)->Planar64Vec3{ + if dir==vec3::zero(){ + return dir.narrow_1().unwrap(); + } + let x=dir.x.as_bits().unsigned_abs().bits(); + let y=dir.y.as_bits().unsigned_abs().bits(); + let z=dir.z.as_bits().unsigned_abs().bits(); + let big=x.max(y).max(z); + const MAX_BITS:u32=96+31; + if MAX_BITS>(big-MAX_BITS) + }else{ + dir + }.narrow_1().unwrap() +} + fn reduce1( [v0]:Simplex<1,M::Vert>, mesh:&M, @@ -165,7 +196,7 @@ fn reduce2( // -- modify the direction to take into account a0R and b0R // return direction, a0, a1, b0, b1 return Reduced{ - dir:direction.narrow_1().unwrap(), + dir:narrow_dir3(direction), simplex:Simplex1_3::Simplex2([v0,v1]), }; } @@ -231,7 +262,7 @@ fn reduce3( // return direction, a0, a1, b0, b1, c0, c1 return Reduced{ - dir:direction.narrow_1().unwrap(), + dir:narrow_dir2(direction), simplex:Simplex1_3::Simplex3([v0,v1,v2]), }; } @@ -265,14 +296,14 @@ fn reduce3( if direction==vec3::zero(){ // direction = uv return Reduced{ - dir:uv.narrow_1().unwrap(), + dir:narrow_dir2(uv), simplex:Simplex1_3::Simplex2([v0,v1]), }; } // return direction, a0, a1, b0, b1 return Reduced{ - dir:direction.narrow_1().unwrap(), + dir:narrow_dir3(direction), simplex:Simplex1_3::Simplex2([v0,v1]), }; } @@ -283,7 +314,7 @@ fn reduce3( if dir==vec3::zero(){ // direction = uv return Reduced{ - dir:uv.narrow_1().unwrap(), + dir:narrow_dir2(uv), simplex:Simplex1_3::Simplex1([v0]), }; } @@ -399,12 +430,12 @@ fn reduce4( // return direction, a0, a1, b0, b1, c0, c1 if uv_w.is_negative(){ return Reduce::Reduced(Reduced{ - dir:uv.narrow_1().unwrap(), + dir:narrow_dir2(uv), simplex:Simplex1_3::Simplex3([v0,v1,v2]), }); }else{ return Reduce::Reduced(Reduced{ - dir:-uv.narrow_1().unwrap(), + dir:narrow_dir2(-uv), simplex:Simplex1_3::Simplex3([v0,v1,v2]), }); } @@ -441,12 +472,12 @@ fn reduce4( // return direction, a0, a1, b0, b1 if uv_w.is_negative(){ return Reduce::Reduced(Reduced{ - dir:uv.narrow_1().unwrap(), + dir:narrow_dir2(uv), simplex:Simplex1_3::Simplex2([v0,v1]), }); }else{ return Reduce::Reduced(Reduced{ - dir:-uv.narrow_1().unwrap(), + dir:narrow_dir2(-uv), simplex:Simplex1_3::Simplex2([v0,v1]), }); } @@ -454,7 +485,7 @@ fn reduce4( // return direction, a0, a1, b0, b1 return Reduce::Reduced(Reduced{ - dir:direction.narrow_1().unwrap(), + dir:narrow_dir3(direction), simplex:Simplex1_3::Simplex2([v0,v1]), }); } @@ -466,12 +497,12 @@ fn reduce4( // direction = uvw < 0 and uv or -uv if uv_w.is_negative(){ return Reduce::Reduced(Reduced{ - dir:uv.narrow_1().unwrap(), + dir:narrow_dir2(uv), simplex:Simplex1_3::Simplex1([v0]), }); }else{ return Reduce::Reduced(Reduced{ - dir:-uv.narrow_1().unwrap(), + dir:narrow_dir2(-uv), simplex:Simplex1_3::Simplex1([v0]), }); }