work
This commit is contained in:
parent
b58ebb2775
commit
bd61d03c91
@ -4,6 +4,12 @@ use crate::mouse::MouseState;
|
||||
pub enum TimeInner{}
|
||||
pub type Time=crate::integer::Time<TimeInner>;
|
||||
|
||||
#[derive(Clone,Debug)]
|
||||
pub enum UnbufferedInstruction{
|
||||
MoveMouse(glam::IVec2),
|
||||
Other(OtherInstruction),
|
||||
}
|
||||
|
||||
#[derive(Clone,Debug)]
|
||||
pub enum Instruction{
|
||||
Mouse(MouseInstruction),
|
||||
|
@ -1,9 +1,3 @@
|
||||
#[derive(Clone,Copy,Hash,Eq,PartialEq,PartialOrd,Debug)]
|
||||
pub enum TimeInner{}
|
||||
pub type Time=crate::integer::Time<TimeInner>;
|
||||
|
||||
#[derive(Clone,Debug)]
|
||||
pub enum UnbufferedInputInstruction{
|
||||
MoveMouse(glam::IVec2),
|
||||
Other(crate::physics::OtherInstruction),
|
||||
}
|
||||
|
@ -1,16 +1,17 @@
|
||||
use strafesnet_common::mouse::MouseState;
|
||||
use strafesnet_common::physics::{
|
||||
UnbufferedInstruction as PhysicsUnbufferedInstruction,
|
||||
Instruction as PhysicsInputInstruction,
|
||||
Time as PhysicsTime,
|
||||
TimeInner as PhysicsTimeInner,
|
||||
MouseInstruction,
|
||||
OtherInstruction,
|
||||
};
|
||||
use strafesnet_common::session::{Time as SessionTime,TimeInner as SessionTimeInner,UnbufferedInputInstruction};
|
||||
use strafesnet_common::session::{Time as SessionTime,TimeInner as SessionTimeInner};
|
||||
use strafesnet_common::instruction::{InstructionConsumer,InstructionEmitter,TimedInstruction};
|
||||
|
||||
type TimedPhysicsInstruction=TimedInstruction<PhysicsInputInstruction,PhysicsTimeInner>;
|
||||
type PhysicsTimedUnbufferedInstruction=TimedInstruction<UnbufferedInputInstruction,PhysicsTimeInner>;
|
||||
type PhysicsTimedUnbufferedInstruction=TimedInstruction<PhysicsUnbufferedInstruction,PhysicsTimeInner>;
|
||||
type DoubleTimedUnbufferedInstruction=TimedInstruction<PhysicsTimedUnbufferedInstruction,SessionTimeInner>;
|
||||
|
||||
const MOUSE_TIMEOUT:SessionTime=SessionTime::from_millis(10);
|
||||
@ -30,7 +31,7 @@ impl BufferState{
|
||||
fn next_state(&self,ins:DoubleTimedUnbufferedInstruction,physics_timeline:&mut std::collections::VecDeque<TimedPhysicsInstruction>)->(Self,Option<TimedInstruction<OtherInstruction,PhysicsTimeInner>>){
|
||||
match self{
|
||||
BufferState::Unbuffered=>{
|
||||
if let UnbufferedInputInstruction::MoveMouse(pos)=ins.instruction.instruction{
|
||||
if let PhysicsUnbufferedInstruction::MoveMouse(pos)=ins.instruction.instruction{
|
||||
return (BufferState::Initializing(ins.time,MouseState{pos,time:ins.instruction.time}),None);
|
||||
}
|
||||
},
|
||||
@ -49,7 +50,7 @@ impl BufferState{
|
||||
});
|
||||
return (BufferState::Unbuffered,None);
|
||||
}
|
||||
if let UnbufferedInputInstruction::MoveMouse(pos)=ins.instruction.instruction{
|
||||
if let PhysicsUnbufferedInstruction::MoveMouse(pos)=ins.instruction.instruction{
|
||||
let next_mouse_state=MouseState{pos,time:ins.instruction.time};
|
||||
physics_timeline.push_front(TimedInstruction{
|
||||
time:mouse_state.time,
|
||||
@ -79,7 +80,7 @@ impl BufferState{
|
||||
});
|
||||
return (BufferState::Unbuffered,None);
|
||||
}
|
||||
if let UnbufferedInputInstruction::MoveMouse(pos)=ins.instruction.instruction{
|
||||
if let PhysicsUnbufferedInstruction::MoveMouse(pos)=ins.instruction.instruction{
|
||||
let next_mouse_state=MouseState{pos,time:ins.instruction.time};
|
||||
physics_timeline.push_front(TimedInstruction{
|
||||
time:ins.instruction.time,
|
||||
@ -92,8 +93,8 @@ impl BufferState{
|
||||
},
|
||||
}
|
||||
let instruction_out=match ins.instruction.instruction{
|
||||
UnbufferedInputInstruction::MoveMouse(_)=>None,
|
||||
UnbufferedInputInstruction::Other(other_instruction)=>Some(TimedInstruction{
|
||||
PhysicsUnbufferedInstruction::MoveMouse(_)=>None,
|
||||
PhysicsUnbufferedInstruction::Other(other_instruction)=>Some(TimedInstruction{
|
||||
time:ins.instruction.time,
|
||||
instruction:other_instruction,
|
||||
}),
|
||||
@ -208,9 +209,9 @@ impl MouseInterpolator{
|
||||
// This should be simulation_timer.time(timeout)
|
||||
// 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,
|
||||
time:mouse_state.time,
|
||||
instruction:PhysicsInputInstruction::Mouse(
|
||||
MouseInstruction::SetNextMouse(MouseState{pos:mouse_state.pos,time:ins.instruction.time})
|
||||
MouseInstruction::SetNextMouse(MouseState{pos:mouse_state.pos,time:mouse_state.time})
|
||||
),
|
||||
})
|
||||
},
|
||||
|
@ -1,14 +1,14 @@
|
||||
use strafesnet_common::instruction::{InstructionConsumer, InstructionEmitter, InstructionFeedback, TimedInstruction};
|
||||
use strafesnet_common::instruction::{InstructionConsumer,InstructionEmitter,InstructionFeedback,TimedInstruction};
|
||||
// session represents the non-hardware state of the client.
|
||||
// Ideally it is a deterministic state which is atomically updated by instructions, same as the simulation state.
|
||||
use strafesnet_common::physics::{Instruction as PhysicsInputInstruction,TimeInner as PhysicsTimeInner,Time as PhysicsTime};
|
||||
use strafesnet_common::physics::{UnbufferedInstruction as PhysicsUnbufferedInstruction,Instruction as PhysicsInputInstruction,TimeInner as PhysicsTimeInner,Time as PhysicsTime};
|
||||
use strafesnet_common::timer::{Scaled,Timer};
|
||||
use strafesnet_common::session::{TimeInner as SessionTimeInner,Time as SessionTime,UnbufferedInputInstruction};
|
||||
use strafesnet_common::session::{TimeInner as SessionTimeInner,Time as SessionTime};
|
||||
|
||||
use crate::mouse_interpolator::{MouseInterpolator,StepInstruction};
|
||||
|
||||
pub enum ExternalInstruction{
|
||||
ToBuffer(UnbufferedInputInstruction),
|
||||
Input(PhysicsUnbufferedInstruction),
|
||||
SetPaused(bool),
|
||||
Render,
|
||||
Resize(winit::dpi::PhysicalSize<u32>),
|
||||
@ -89,7 +89,7 @@ impl InstructionConsumer<ExternalInstruction> for Session{
|
||||
fn process_instruction(&mut self,ins:TimedInstruction<ExternalInstruction,Self::TimeInner>){
|
||||
match ins.instruction{
|
||||
// send it down to MouseInterpolator with two timestamps, SessionTime and PhysicsTime
|
||||
ExternalInstruction::ToBuffer(instruction)=>self.mouse_interpolator.process_instruction(TimedInstruction{
|
||||
ExternalInstruction::Input(instruction)=>self.mouse_interpolator.process_instruction(TimedInstruction{
|
||||
time:ins.time,
|
||||
instruction:TimedInstruction{
|
||||
time:self.simulation.timer.time(ins.time),
|
||||
|
@ -1,4 +1,4 @@
|
||||
use crate::window::WindowInstruction;
|
||||
use crate::window::Instruction;
|
||||
use strafesnet_common::instruction::TimedInstruction;
|
||||
use strafesnet_common::integer;
|
||||
use strafesnet_common::session::TimeInner as SessionTimeInner;
|
||||
@ -224,7 +224,7 @@ pub fn setup_and_start(title:&str){
|
||||
let path=std::path::PathBuf::from(arg);
|
||||
window_thread.send(TimedInstruction{
|
||||
time:integer::Time::ZERO,
|
||||
instruction:WindowInstruction::WindowEvent(winit::event::WindowEvent::DroppedFile(path)),
|
||||
instruction:Instruction::WindowEvent(winit::event::WindowEvent::DroppedFile(path)),
|
||||
}).unwrap();
|
||||
};
|
||||
|
||||
@ -235,7 +235,7 @@ pub fn setup_and_start(title:&str){
|
||||
|
||||
fn run_event_loop(
|
||||
event_loop:winit::event_loop::EventLoop<()>,
|
||||
mut window_thread:crate::compat_worker::QNWorker<TimedInstruction<WindowInstruction,SessionTimeInner>>,
|
||||
mut window_thread:crate::compat_worker::QNWorker<TimedInstruction<Instruction,SessionTimeInner>>,
|
||||
root_time:std::time::Instant
|
||||
)->Result<(),winit::error::EventLoopError>{
|
||||
event_loop.run(move |event,elwt|{
|
||||
@ -247,7 +247,7 @@ fn run_event_loop(
|
||||
// };
|
||||
match event{
|
||||
winit::event::Event::AboutToWait=>{
|
||||
window_thread.send(TimedInstruction{time,instruction:WindowInstruction::RequestRedraw}).unwrap();
|
||||
window_thread.send(TimedInstruction{time,instruction:Instruction::RequestRedraw}).unwrap();
|
||||
}
|
||||
winit::event::Event::WindowEvent {
|
||||
event:
|
||||
@ -259,7 +259,7 @@ fn run_event_loop(
|
||||
winit::event::WindowEvent::Resized(size),//ignoring scale factor changed for now because mutex bruh
|
||||
window_id:_,
|
||||
} => {
|
||||
window_thread.send(TimedInstruction{time,instruction:WindowInstruction::Resize(size)}).unwrap();
|
||||
window_thread.send(TimedInstruction{time,instruction:Instruction::Resize(size)}).unwrap();
|
||||
}
|
||||
winit::event::Event::WindowEvent{event,..}=>match event{
|
||||
winit::event::WindowEvent::KeyboardInput{
|
||||
@ -275,17 +275,17 @@ fn run_event_loop(
|
||||
elwt.exit();
|
||||
}
|
||||
winit::event::WindowEvent::RedrawRequested=>{
|
||||
window_thread.send(TimedInstruction{time,instruction:WindowInstruction::Render}).unwrap();
|
||||
window_thread.send(TimedInstruction{time,instruction:Instruction::Render}).unwrap();
|
||||
}
|
||||
_=>{
|
||||
window_thread.send(TimedInstruction{time,instruction:WindowInstruction::WindowEvent(event)}).unwrap();
|
||||
window_thread.send(TimedInstruction{time,instruction:Instruction::WindowEvent(event)}).unwrap();
|
||||
}
|
||||
},
|
||||
winit::event::Event::DeviceEvent{
|
||||
event,
|
||||
..
|
||||
} => {
|
||||
window_thread.send(TimedInstruction{time,instruction:WindowInstruction::DeviceEvent(event)}).unwrap();
|
||||
window_thread.send(TimedInstruction{time,instruction:Instruction::DeviceEvent(event)}).unwrap();
|
||||
},
|
||||
_=>{}
|
||||
}
|
||||
|
@ -1,8 +1,9 @@
|
||||
use crate::physics_worker::InputInstruction;
|
||||
use strafesnet_common::instruction::TimedInstruction;
|
||||
use strafesnet_common::session::{Time as SessionTime,TimeInner as SessionTimeInner};
|
||||
use strafesnet_common::physics::{OtherInstruction,UnbufferedInstruction};
|
||||
use crate::session::ExternalInstruction as SessionExternalInstruction;
|
||||
|
||||
pub enum WindowInstruction{
|
||||
pub enum Instruction{
|
||||
Resize(winit::dpi::PhysicalSize<u32>),
|
||||
WindowEvent(winit::event::WindowEvent),
|
||||
DeviceEvent(winit::event::DeviceEvent),
|
||||
@ -16,7 +17,7 @@ struct WindowContext<'a>{
|
||||
mouse:strafesnet_common::mouse::MouseState<SessionTimeInner>,//std::sync::Arc<std::sync::Mutex<>>
|
||||
screen_size:glam::UVec2,
|
||||
window:&'a winit::window::Window,
|
||||
physics_thread:crate::compat_worker::QNWorker<'a,TimedInstruction<crate::physics_worker::Instruction,SessionTimeInner>>,
|
||||
physics_thread:crate::compat_worker::QNWorker<'a,TimedInstruction<SessionExternalInstruction,SessionTimeInner>>,
|
||||
}
|
||||
|
||||
impl WindowContext<'_>{
|
||||
@ -27,7 +28,7 @@ impl WindowContext<'_>{
|
||||
match event{
|
||||
winit::event::WindowEvent::DroppedFile(path)=>{
|
||||
match crate::file::load(path.as_path()){
|
||||
Ok(map)=>self.physics_thread.send(TimedInstruction{time,instruction:crate::physics_worker::Instruction::ChangeMap(map)}).unwrap(),
|
||||
Ok(map)=>self.physics_thread.send(TimedInstruction{time,instruction:SessionExternalInstruction::ChangeMap(map)}).unwrap(),
|
||||
Err(e)=>println!("Failed to load map: {e}"),
|
||||
}
|
||||
},
|
||||
@ -35,7 +36,7 @@ impl WindowContext<'_>{
|
||||
//pause unpause
|
||||
self.physics_thread.send(TimedInstruction{
|
||||
time,
|
||||
instruction:crate::physics_worker::Instruction::SetPaused(!state),
|
||||
instruction:SessionExternalInstruction::SetPaused(!state),
|
||||
}).unwrap();
|
||||
//recalculate pressed keys on focus
|
||||
},
|
||||
@ -91,28 +92,28 @@ impl WindowContext<'_>{
|
||||
(keycode,state)=>{
|
||||
let s=state.is_pressed();
|
||||
if let Some(input_instruction)=match keycode{
|
||||
winit::keyboard::Key::Named(winit::keyboard::NamedKey::Space)=>Some(InputInstruction::Jump(s)),
|
||||
winit::keyboard::Key::Named(winit::keyboard::NamedKey::Space)=>Some(OtherInstruction::SetJump(s)),
|
||||
winit::keyboard::Key::Character(key)=>match key.as_str(){
|
||||
"W"|"w"=>Some(InputInstruction::MoveForward(s)),
|
||||
"A"|"a"=>Some(InputInstruction::MoveLeft(s)),
|
||||
"S"|"s"=>Some(InputInstruction::MoveBack(s)),
|
||||
"D"|"d"=>Some(InputInstruction::MoveRight(s)),
|
||||
"E"|"e"=>Some(InputInstruction::MoveUp(s)),
|
||||
"Q"|"q"=>Some(InputInstruction::MoveDown(s)),
|
||||
"Z"|"z"=>Some(InputInstruction::Zoom(s)),
|
||||
"W"|"w"=>Some(OtherInstruction::SetMoveForward(s)),
|
||||
"A"|"a"=>Some(OtherInstruction::SetMoveLeft(s)),
|
||||
"S"|"s"=>Some(OtherInstruction::SetMoveBack(s)),
|
||||
"D"|"d"=>Some(OtherInstruction::SetMoveRight(s)),
|
||||
"E"|"e"=>Some(OtherInstruction::SetMoveUp(s)),
|
||||
"Q"|"q"=>Some(OtherInstruction::SetMoveDown(s)),
|
||||
"Z"|"z"=>Some(OtherInstruction::SetZoom(s)),
|
||||
"R"|"r"=>if s{
|
||||
//mouse needs to be reset since the position is absolute
|
||||
self.mouse=strafesnet_common::mouse::MouseState::default();
|
||||
Some(InputInstruction::ResetAndRestart)
|
||||
Some(OtherInstruction::ResetAndRestart)
|
||||
}else{None},
|
||||
"F"|"f"=>if s{Some(InputInstruction::PracticeFly)}else{None},
|
||||
"F"|"f"=>if s{Some(OtherInstruction::PracticeFly)}else{None},
|
||||
_=>None,
|
||||
},
|
||||
_=>None,
|
||||
}{
|
||||
self.physics_thread.send(TimedInstruction{
|
||||
time,
|
||||
instruction:crate::physics_worker::Instruction::Input(input_instruction),
|
||||
instruction:SessionExternalInstruction::Input(UnbufferedInstruction::Other(input_instruction)),
|
||||
}).unwrap();
|
||||
}
|
||||
},
|
||||
@ -140,7 +141,7 @@ impl WindowContext<'_>{
|
||||
self.mouse.pos+=delta;
|
||||
self.physics_thread.send(TimedInstruction{
|
||||
time,
|
||||
instruction:crate::physics_worker::Instruction::Input(InputInstruction::MoveMouse(self.mouse.pos)),
|
||||
instruction:SessionExternalInstruction::Input(InputInstruction::MoveMouse(self.mouse.pos)),
|
||||
}).unwrap();
|
||||
},
|
||||
winit::event::DeviceEvent::MouseWheel {
|
||||
@ -150,7 +151,7 @@ impl WindowContext<'_>{
|
||||
if false{//self.physics.style.use_scroll{
|
||||
self.physics_thread.send(TimedInstruction{
|
||||
time,
|
||||
instruction:crate::physics_worker::Instruction::Input(InputInstruction::Jump(true)),//activates the immediate jump path, but the style modifier prevents controls&CONTROL_JUMP bit from being set to auto jump
|
||||
instruction:SessionExternalInstruction::Input(InputInstruction::Jump(true)),//activates the immediate jump path, but the style modifier prevents controls&CONTROL_JUMP bit from being set to auto jump
|
||||
}).unwrap();
|
||||
}
|
||||
},
|
||||
@ -161,7 +162,7 @@ impl WindowContext<'_>{
|
||||
pub fn worker<'a>(
|
||||
window:&'a winit::window::Window,
|
||||
setup_context:crate::setup::SetupContext<'a>,
|
||||
)->crate::compat_worker::QNWorker<'a,TimedInstruction<WindowInstruction,SessionTimeInner>>{
|
||||
)->crate::compat_worker::QNWorker<'a,TimedInstruction<Instruction,SessionTimeInner>>{
|
||||
// WindowContextSetup::new
|
||||
let user_settings=crate::settings::read_user_settings();
|
||||
|
||||
@ -184,30 +185,30 @@ pub fn worker<'a>(
|
||||
};
|
||||
|
||||
//WindowContextSetup::into_worker
|
||||
crate::compat_worker::QNWorker::new(move |ins:TimedInstruction<WindowInstruction,SessionTimeInner>|{
|
||||
crate::compat_worker::QNWorker::new(move |ins:TimedInstruction<Instruction,SessionTimeInner>|{
|
||||
match ins.instruction{
|
||||
WindowInstruction::RequestRedraw=>{
|
||||
Instruction::RequestRedraw=>{
|
||||
window_context.window.request_redraw();
|
||||
}
|
||||
WindowInstruction::WindowEvent(window_event)=>{
|
||||
Instruction::WindowEvent(window_event)=>{
|
||||
window_context.window_event(ins.time,window_event);
|
||||
},
|
||||
WindowInstruction::DeviceEvent(device_event)=>{
|
||||
Instruction::DeviceEvent(device_event)=>{
|
||||
window_context.device_event(ins.time,device_event);
|
||||
},
|
||||
WindowInstruction::Resize(size)=>{
|
||||
Instruction::Resize(size)=>{
|
||||
window_context.physics_thread.send(
|
||||
TimedInstruction{
|
||||
time:ins.time,
|
||||
instruction:crate::physics_worker::Instruction::Resize(size)
|
||||
instruction:SessionExternalInstruction::Resize(size)
|
||||
}
|
||||
).unwrap();
|
||||
}
|
||||
WindowInstruction::Render=>{
|
||||
Instruction::Render=>{
|
||||
window_context.physics_thread.send(
|
||||
TimedInstruction{
|
||||
time:ins.time,
|
||||
instruction:crate::physics_worker::Instruction::Render
|
||||
instruction:SessionExternalInstruction::Render
|
||||
}
|
||||
).unwrap();
|
||||
}
|
||||
|
@ -190,7 +190,7 @@ mod test{
|
||||
for _ in 0..5 {
|
||||
let task = instruction::TimedInstruction{
|
||||
time:strafesnet_common::physics::Time::ZERO,
|
||||
instruction:strafesnet_common::physics::Instruction::Idle,
|
||||
instruction:strafesnet_common::physics::Instruction::Other(strafesnet_common::physics::OtherInstruction::Idle),
|
||||
};
|
||||
worker.send(task).unwrap();
|
||||
}
|
||||
@ -204,7 +204,7 @@ mod test{
|
||||
// Send a new task
|
||||
let task = instruction::TimedInstruction{
|
||||
time:integer::Time::ZERO,
|
||||
instruction:strafesnet_common::physics::Instruction::Idle,
|
||||
instruction:strafesnet_common::physics::Instruction::Other(strafesnet_common::physics::OtherInstruction::Idle),
|
||||
};
|
||||
worker.send(task).unwrap();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user