This commit is contained in:
2026-03-16 09:49:08 -07:00
parent 48c235d73d
commit 7b80b8dd43

View File

@@ -5,6 +5,7 @@ use strafesnet_common::integer::vec3;
use strafesnet_common::integer::Fixed;
use strafesnet_common::physics::Time as PhysicsTime;
use crate::bot::CompleteBot;
use strafesnet_roblox_bot_file::v0;
const MAX_SLICE_LEN:usize=16;
struct EventSlice{
@@ -80,30 +81,33 @@ impl Bvh{
// grow a sphere starting at start_point until we find the closest point on the bot output events
let intersect_leaf=|event_slice:&EventSlice|{
// calculate the distance to the leaf contents
let closest_point=output_events[event_slice.slice.start..event_slice.slice.end].iter().map(|event|{
let 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();
(start_point-p).length_squared()
}).min()?;
let it=output_events[event_slice.slice.start..].iter();
let mut last_event=it.next()?;
let mut it=it.filter_map(|event|{
let mut prev_event=&output_events[event_slice.slice.start];
let mut f=|event:&v0::Timed<v0::OutputEvent>|{
let p0=vec3::try_from_f32_array([event.event.position.x,event.event.position.y,event.event.position.z]).unwrap();
let p1=vec3::try_from_f32_array([last_event.event.position.x,last_event.event.position.y,last_event.event.position.z]).unwrap();
let p1=vec3::try_from_f32_array([prev_event.event.position.x,prev_event.event.position.y,prev_event.event.position.z]).unwrap();
let d=p1-p0;
last_event=event;
prev_event=event;
// must be on the segment
if (start_point-p0).dot(d).is_positive()&&(start_point-p1).dot(d).is_negative(){
let sin=(start_point-p0).cross(d);
let distance=(sin.length_squared()/d.length_squared()).divide().wrap_2();
Some(distance)
}else{
None
if distance<best_distance{
best_distance=distance;
}
}
});
let Some(mut best_distance)=it.next()else{
return Some(closest_point);
};
for event in &output_events[event_slice.slice.start+1..event_slice.slice.start-1]{
f(event);
}
if event_slice.inclusive{
f(&output_events[event_slice.slice.end]);
}
Some(best_distance)
};
let intersect_aabb=|aabb:&Aabb|{
// calculate the distance to the aabb