From 5e6154154c12481a2f3377fa99e6935fef1b952f Mon Sep 17 00:00:00 2001 From: Lizzy Fleckenstein Date: Thu, 11 May 2023 12:32:08 +0200 Subject: [PATCH] Mesh data queue --- src/gfx.rs | 10 +++++--- src/gfx/map.rs | 64 +++++++++++++++++++++++++++++++++----------------- 2 files changed, 49 insertions(+), 25 deletions(-) diff --git a/src/gfx.rs b/src/gfx.rs index 385291f..f765a9b 100644 --- a/src/gfx.rs +++ b/src/gfx.rs @@ -24,7 +24,7 @@ pub async fn run( window.set_cursor_visible(false); let mut state = state::State::new(&window).await; - let mut map = None; + let mut map: Option = None; let mut media = media::MediaMgr::new(); let mut nodedefs = None; @@ -41,6 +41,10 @@ pub async fn run( last_frame = now; state.update(dt); + if let Some(map) = &mut map { + map.update(&mut state); + } + net_events .send(NetEvent::PlayerPos( state.camera.position.into(), @@ -118,8 +122,8 @@ pub async fn run( Close => *flow = ExitWithCode(0), NodeDefs(defs) => nodedefs = Some(defs), MapBlock(pos, blk) => { - if let Some(map) = map.as_mut() { - map.add_block(&mut state, pos, blk); + if let Some(map) = &map { + map.add_block(pos, blk); } } Media(files, finished) => { diff --git a/src/gfx/map.rs b/src/gfx/map.rs index e5a42f3..dfc41be 100644 --- a/src/gfx/map.rs +++ b/src/gfx/map.rs @@ -4,10 +4,14 @@ mod mesh; use super::{media::MediaMgr, state::State, util::MatrixUniform}; use atlas::create_atlas; use cgmath::{prelude::*, Matrix4, Point3, Vector3}; -use mesh::create_mesh; +use mesh::{create_mesh, MeshData}; use mt_net::{MapBlock, NodeDef}; use serde::{Deserialize, Serialize}; -use std::{collections::HashMap, sync::Arc}; +use std::{ + collections::HashMap, + ops::DerefMut, + sync::{Arc, Mutex}, +}; use wgpu::util::DeviceExt; #[derive(Serialize, Deserialize, PartialEq, Eq, Copy, Clone, Debug)] @@ -43,13 +47,17 @@ struct MeshMakeInfo { nodes: [Option>; u16::MAX as usize + 1], } +type MeshQueue = HashMap, MeshData>; + pub struct MapRender { pipeline: wgpu::RenderPipeline, atlas: wgpu::BindGroup, model: wgpu::BindGroupLayout, blocks: HashMap<[i16; 3], BlockModel>, mesh_make_info: Arc, - mesh_data_buffer: usize, + mesh_data_buffer: Mutex, + queue_consume: MeshQueue, + queue_produce: Arc>, } #[repr(C)] @@ -157,31 +165,41 @@ impl MapRender { } } - pub fn add_block(&mut self, state: &mut State, pos: Point3, block: Box) { + pub fn update(&mut self, state: &mut State) { + std::mem::swap( + self.queue_produce.lock().unwrap().deref_mut(), + &mut self.queue_consume, + ); + for (pos, data) in self.queue_consume.drain() { + self.blocks.insert( + pos.into(), + BlockModel { + mesh: BlockMesh::new(state, &data.vertices), + mesh_blend: BlockMesh::new(state, &data.vertices_blend), + transform: MatrixUniform::new( + &state.device, + &self.model, + Matrix4::from_translation( + block_float_pos(pos.to_vec()) + Vector3::new(8.5, 8.5, 8.5), + ), + "mapblock", + false, + ), + }, + ); + } + } + + pub fn add_block(&self, pos: Point3, block: Box) { let (pos, data) = create_mesh( - &mut self.mesh_data_buffer, + &mut self.mesh_data_buffer.lock().unwrap(), self.mesh_make_info.clone(), &Default::default(), pos, block, ); - self.blocks.insert( - pos.into(), - BlockModel { - mesh: BlockMesh::new(state, &data.vertices), - mesh_blend: BlockMesh::new(state, &data.vertices_blend), - transform: MatrixUniform::new( - &state.device, - &self.model, - Matrix4::from_translation( - block_float_pos(pos.to_vec()) + Vector3::new(8.5, 8.5, 8.5), - ), - "mapblock", - false, - ), - }, - ); + self.queue_produce.lock().unwrap().insert(pos, data); } pub fn new(state: &mut State, media: &MediaMgr, mut nodes: HashMap) -> Self { @@ -342,10 +360,12 @@ impl MapRender { nodes: std::array::from_fn(|i| nodes.get(&(i as u16)).cloned().map(Box::new)), textures: atlas_slices, }), - mesh_data_buffer: 16384, + mesh_data_buffer: Mutex::new(0), atlas: atlas_bind_group, model: model_bind_group_layout, blocks: HashMap::new(), + queue_consume: HashMap::new(), + queue_produce: Arc::new(Mutex::new(HashMap::new())), } } } -- 2.44.0