cook a bit

This commit is contained in:
Quaternions 2025-01-10 23:18:53 -08:00
parent 47bf9f1af3
commit 1b35c96f6e

View File

@ -31,8 +31,70 @@ pub enum StepInstruction{
ReplaceMouse,
}
#[derive(Clone)]
enum BufferState{
Unbuffered,
Initializing(SessionTime,MouseState<PhysicsTimeInner>),
Buffered(SessionTime,MouseState<PhysicsTimeInner>),
}
impl BufferState{
fn next_state(&self,ins:DoubleTimedUnbufferedInstruction,physics_timeline:&mut std::collections::VecDeque<TimedPhysicsInstruction>)->Self{
match self{
BufferState::Unbuffered=>{
if let UnbufferedInputInstruction::MoveMouse(pos)=ins.instruction.instruction{
return BufferState::Initializing(ins.time,MouseState{pos,time:ins.instruction.time});
}
},
BufferState::Initializing(time,mouse_state)=>{
let timeout=*time+MOUSE_TIMEOUT;
if timeout<ins.time{
// duplicate the current mouse
physics_timeline.push_front(TimedInstruction{
// This should be simulation_timer.time(time)
// but the timer is not accessible from this scope
// and it's just here to say that the mouse isn't moving anyways.
time:ins.instruction.time,
instruction:PhysicsInputInstruction::SetNextMouse(MouseState{pos:mouse_state.pos,time:ins.instruction.time}),
});
return BufferState::Unbuffered;
}
if let UnbufferedInputInstruction::MoveMouse(pos)=ins.instruction.instruction{
let next_mouse_state=MouseState{pos,time:ins.instruction.time};
physics_timeline.push_front(TimedInstruction{
time:mouse_state.time,
instruction:PhysicsInputInstruction::ReplaceMouse(mouse_state.clone(),next_mouse_state.clone()),
});
return BufferState::Buffered(ins.time,next_mouse_state);
}
},
BufferState::Buffered(time,mouse_state)=>{
let timeout=*time+MOUSE_TIMEOUT;
if timeout<ins.time{
// duplicate the current mouse
physics_timeline.push_front(TimedInstruction{
// This should be simulation_timer.time(time)
// but the timer is not accessible from this scope
// and it's just here to say that the mouse isn't moving anyways.
time:ins.instruction.time,
instruction:PhysicsInputInstruction::SetNextMouse(MouseState{pos:mouse_state.pos,time:ins.instruction.time}),
});
return BufferState::Unbuffered;
}
if let UnbufferedInputInstruction::MoveMouse(pos)=ins.instruction.instruction{
let next_mouse_state=MouseState{pos,time:ins.instruction.time};
physics_timeline.push_front(TimedInstruction{
time:ins.instruction.time,
instruction:PhysicsInputInstruction::SetNextMouse(next_mouse_state.clone()),
});
return BufferState::Buffered(ins.time,next_mouse_state);
}
},
}
self.clone()
}
}
pub struct MouseInterpolator{
last_mouse_state:MouseState<SessionTimeInner>,
buffer_state:BufferState,
// double timestamped timeline?
physics_timeline:std::collections::VecDeque<TimedPhysicsInstruction>,
}
@ -53,13 +115,23 @@ impl InstructionEmitter<StepInstruction> for MouseInterpolator{
impl MouseInterpolator{
pub fn new()->MouseInterpolator{
MouseInterpolator{
last_mouse_state:MouseState::default(),
buffer_state:BufferState::Unbuffered,
physics_timeline:std::collections::VecDeque::new(),
}
}
pub fn push_unbuffered_input(&mut self,ins:DoubleTimedUnbufferedInstruction){
// new input
// if there is zero instruction buffered, it means the mouse is not moving
// case 1: unbuffered
// no mouse event is buffered
// - ins is mouse event? change to buffered
// - ins other -> write to timeline
// case 2: buffered
// a mouse event is buffered, and exists within the last 10ms
// case 3: stop
// a mouse event is buffered, but no mouse events have transpired within 10ms
// TODO: remove clone
self.buffer_state=self.buffer_state.next_state(ins,&mut self.physics_timeline);
}
fn is_first_ready(&self)->bool{
// if the last instruction is a ReplaceMouse instruction