create CompatWorker and move physics back into main thread so it feels good to play

eventually I will work on thread stuff again and make threads for everything and workarounds to latency issues
This commit is contained in:
Quaternions 2023-10-05 19:45:15 -07:00
parent edd3ca566a
commit 40af48068a
3 changed files with 29 additions and 4 deletions

View File

@ -119,7 +119,7 @@ pub struct GlobalState{
manual_mouse_lock:bool,
mouse:physics::MouseState,
graphics:GraphicsState,
physics_thread:worker::Worker<TimedInstruction<InputInstruction>,physics::PhysicsOutputState>,
physics_thread:worker::CompatWorker<TimedInstruction<InputInstruction>,physics::PhysicsOutputState,Box<dyn FnMut(TimedInstruction<InputInstruction>)->physics::PhysicsOutputState>>,
}
impl GlobalState{

View File

@ -567,11 +567,11 @@ impl PhysicsState {
self.intersects.clear();
}
pub fn into_worker(mut self)->crate::worker::Worker<TimedInstruction<InputInstruction>,PhysicsOutputState>{
pub fn into_worker(mut self)->crate::worker::CompatWorker<TimedInstruction<InputInstruction>,PhysicsOutputState,Box<dyn FnMut(TimedInstruction<InputInstruction>)->PhysicsOutputState>>{
let mut mouse_blocking=true;
let mut last_mouse_time=self.next_mouse.time;
let mut timeline=std::collections::VecDeque::new();
crate::worker::Worker::new(self.output(),move |ins:TimedInstruction<InputInstruction>|{
crate::worker::CompatWorker::new(self.output(),Box::new(move |ins:TimedInstruction<InputInstruction>|{
if if let Some(phys_input)=match ins.instruction{
InputInstruction::MoveMouse(m)=>{
if mouse_blocking{
@ -651,7 +651,7 @@ impl PhysicsState {
}
}
self.output()
})
}))
}
pub fn output(&self)->PhysicsOutputState{

View File

@ -45,6 +45,31 @@ impl<Task:Send+'static,Value:Clone+Send+'static> Worker<Task,Value> {
}
}
pub struct CompatWorker<Task,Value:Clone,F>{
data:std::marker::PhantomData<Task>,
f:F,
value:Value,
}
impl<Task,Value:Clone,F:FnMut(Task)->Value> CompatWorker<Task,Value,F> {
pub fn new(value:Value,f:F) -> Self {
Self {
f,
value,
data:std::marker::PhantomData,
}
}
pub fn send(&mut self,task:Task)->Result<(),()>{
self.value=(self.f)(task);
Ok(())
}
pub fn grab_clone(&self)->Value{
self.value.clone()
}
}
#[test]//How to run this test with printing: cargo test --release -- --nocapture
fn test_worker() {
println!("hiiiii");