lib: add helper for interpolating output events

This commit is contained in:
2026-03-06 08:30:16 -08:00
parent 2af2134f72
commit 01916e0682

View File

@@ -97,30 +97,44 @@ impl PlaybackHead{
} }
} }
} }
pub fn get_position_angles(&self,bot:&CompleteBot,time:SessionTime)->(glam::Vec3,glam::Vec2){ fn interpolate_output<'a>(&self,bot:&'a CompleteBot,time:SessionTime)->InterpolateOutput<'a>{
let time=bot.time(self.time(time)); let time=bot.time(self.time(time));
let event0=&bot.timelines().output_events[self.head.get_event_index(EventType::Output)-1]; let event0=&bot.timelines().output_events[self.head.get_event_index(EventType::Output)-1];
let event1=&bot.timelines().output_events[self.head.get_event_index(EventType::Output)]; let event1=&bot.timelines().output_events[self.head.get_event_index(EventType::Output)];
let p0=vector3_to_glam(&event0.event.position)-bot.world_offset();
let p1=vector3_to_glam(&event1.event.position)-bot.world_offset();
// let v0=vector3_to_glam(&event0.event.velocity);
// let v1=vector3_to_glam(&event1.event.velocity);
// let a0=vector3_to_glam(&event0.event.acceleration);
// let a1=vector3_to_glam(&event1.event.acceleration);
let t0=event0.time; let t0=event0.time;
let t1=event1.time; let t1=event1.time;
let time_float:f64=time.into(); let time_float:f64=time.into();
let t=((time_float-t0)/(t1-t0)) as f32; let t=((time_float-t0)/(t1-t0)) as f32;
let p=p0.lerp(p1,t); InterpolateOutput{
event0:&event0.event,
event1:&event1.event,
t:t,
}
}
pub fn get_position_angles(&self,bot:&CompleteBot,time:SessionTime)->(glam::Vec3,glam::Vec2){
let interp=self.interpolate_output(bot,time);
let p0=vector3_to_glam(&interp.event0.position)-bot.world_offset();
let p1=vector3_to_glam(&interp.event1.position)-bot.world_offset();
// let v0=vector3_to_glam(&event0.event.velocity);
// let v1=vector3_to_glam(&event1.event.velocity);
// let a0=vector3_to_glam(&event0.event.acceleration);
// let a1=vector3_to_glam(&event1.event.acceleration);
let p=p0.lerp(p1,interp.t);
// let v=v0.lerp(v1,t); // let v=v0.lerp(v1,t);
// let a=a0.lerp(a1,t); // let a=a0.lerp(a1,t);
//println!("position={:?}",p); //println!("position={:?}",p);
let angles0=vector3_to_glam(&event0.event.angles); let angles0=vector3_to_glam(&interp.event0.angles);
let angles1=vector3_to_glam(&event1.event.angles); let angles1=vector3_to_glam(&interp.event1.angles);
let angles=angles0.lerp(angles1,t); let angles=angles0.lerp(angles1,interp.t);
(p+CompleteBot::CAMERA_OFFSET,angles.yx()) (p+CompleteBot::CAMERA_OFFSET,angles.yx())
} }
} }
struct InterpolateOutput<'a>{
event0:&'a strafesnet_roblox_bot_file::v0::OutputEvent,
event1:&'a strafesnet_roblox_bot_file::v0::OutputEvent,
t:f32,
}