forked from StrafesNET/roblox-bot-player
refactor lerp
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user