real threads + GraphicsInstruction + thread accessible mouse

This commit is contained in:
Quaternions 2023-10-19 14:56:39 -07:00
parent 7130eafc06
commit 124139274f
3 changed files with 30 additions and 10 deletions

View File

@ -1,3 +1,18 @@
use std::borrow::Cow;
use wgpu::{util::DeviceExt,AstcBlock,AstcChannel};
use crate::model_graphics::{GraphicsVertex,ModelGraphicsInstance};
#[derive(Clone)]
pub struct ModelUpdate{
transform:Option<glam::Mat4>,
color:Option<glam::Vec4>,
}
#[derive(Clone)]
pub enum GraphicsInstruction{
UpdateModel(ModelUpdate),
Render,
}
struct Entity {
index_count: u32,

View File

@ -1,6 +1,4 @@
use std::{borrow::Cow, time::Instant};
use wgpu::{util::DeviceExt, AstcBlock, AstcChannel};
use model_graphics::{GraphicsVertex,ModelGraphicsInstance};
use std::time::Instant;
use physics::{InputInstruction, PhysicsInstruction};
use instruction::{TimedInstruction, InstructionConsumer};
@ -23,10 +21,18 @@ mod load_roblox;
pub struct GlobalState{
start_time: std::time::Instant,
manual_mouse_lock:bool,
mouse:physics::MouseState,
mouse:std::sync::Arc<std::sync::Mutex<physics::MouseState>>,
user_settings:settings::UserSettings,
graphics:graphics::GraphicsState,
physics_thread:worker::CompatWorker<TimedInstruction<InputInstruction>,physics::PhysicsOutputState,Box<dyn FnMut(TimedInstruction<InputInstruction>)->physics::PhysicsOutputState>>,
//Ideally the graphics thread worker description is:
/*
WorkerDescription{
input:Immediate,
output:Realtime(PoolOrdering::Ordered(3)),
}
*/
//up to three frames in flight, dropping new frame requests when all three are busy, and dropping output frames when one renders out of order
graphics_thread:worker::INWorker<graphics::GraphicsInstruction>,
physics_thread:worker::QNWorker<TimedInstruction<InputInstruction>>,
}
impl framework::Example for GlobalState {

View File

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