#[derive(Clone)] pub enum Instruction{ Render(crate::physics::PhysicsOutputState,crate::integer::Time,glam::IVec2), //UpdateModel(crate::graphics::ModelUpdate), Resize(winit::dpi::PhysicalSize), } //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 pub fn new( mut graphics:crate::graphics::GraphicsState, mut config:wgpu::SurfaceConfiguration, surface:wgpu::Surface, device:&wgpu::Device, queue:&wgpu::Queue, )->crate::compat_worker::INWorker{ crate::compat_worker::INWorker::new(move |ins:Instruction|{ match ins{ Instruction::Resize(size)=>{ config.width=size.width.max(1); config.height=size.height.max(1); surface.configure(device,&config); } Instruction::Render(physics_output,predicted_time,mouse_pos)=>{ //this has to go deeper somehow let frame=match surface.get_current_texture(){ Ok(frame)=>frame, Err(_)=>{ surface.configure(device,&config); surface .get_current_texture() .expect("Failed to acquire next surface texture!") } }; let view=frame.texture.create_view(&wgpu::TextureViewDescriptor{ format:Some(config.view_formats[0]), ..wgpu::TextureViewDescriptor::default() }); graphics.render(&view,device,queue,physics_output,predicted_time,mouse_pos); frame.present(); } } }) }