refactor lerp

This commit is contained in:
2026-03-17 08:26:59 -07:00
parent d2ded2f53d
commit 67d5953471

View File

@@ -1,9 +1,8 @@
use core::ops::Range;
use glam::FloatExt;
use strafesnet_common::aabb::Aabb;
use strafesnet_common::bvh::generate_bvh;
use strafesnet_common::integer::vec3;
use strafesnet_common::integer::Fixed;
use strafesnet_common::integer::{Fixed,Planar64};
use strafesnet_common::physics::Time as PhysicsTime;
use crate::bot::CompleteBot;
use strafesnet_roblox_bot_file::v0;
@@ -118,11 +117,12 @@ impl Bvh{
let (_,event_slice)=self.bvh.traverse(start_point,Fixed::ZERO,Fixed::MAX,intersect_leaf,intersect_aabb)?;
// find time at the closest point
let (mut best_time,mut best_distance)=output_events[event_slice.slice.start..event_slice.slice.end].iter().map(|event|{
let (best_time,mut best_distance)=output_events[event_slice.slice.start..event_slice.slice.end].iter().map(|event|{
let p=event.event.position;
let p=vec3::try_from_f32_array([p.x,p.y,p.z]).unwrap();
(event.time,(start_point-p).length_squared())
}).min_by_key(|&(_,distance)|distance)?;
let mut best_time=crate::time::from_float(best_time).unwrap();
let mut prev_event=&output_events[event_slice.slice.start];
let mut f=|event:&'a v0::Timed<v0::OutputEvent>|{
let p0=vec3::try_from_f32_array([event.event.position.x,event.event.position.y,event.event.position.z]).unwrap();
@@ -133,14 +133,15 @@ impl Bvh{
let sp_d=start_point.dot(d);
// must be on the segment
if d0<sp_d&&sp_d<d1{
let a=sp_d-d0;
let b=d1-d0;
let distance=((p0+(d*a/b).divide().wrap_1())-start_point).length_squared();
let t0=d1-sp_d;
let t1=sp_d-d0;
let dt=d1-d0;
let distance=(((p0*t0+p1*t1)/dt).divide().wrap_1()-start_point).length_squared();
if distance<best_distance{
best_distance=distance;
let a:f64=a.into();
let b:f64=b.into();
best_time=prev_event.time.lerp(event.time,a/b);
let p0:Planar64=prev_event.time.try_into().unwrap();
let p1:Planar64=event.time.try_into().unwrap();
best_time=((p0*t0+p1*t1)/dt).into();
}
}
prev_event=event;
@@ -151,6 +152,6 @@ impl Bvh{
if event_slice.inclusive{
f(&output_events[event_slice.slice.end]);
}
crate::time::from_float(best_time).ok()
Some(best_time)
}
}