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