diff options
Diffstat (limited to 'client/src/scene_prepare.rs')
-rw-r--r-- | client/src/scene_prepare.rs | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs index f74277c..ae7e599 100644 --- a/client/src/scene_prepare.rs +++ b/client/src/scene_prepare.rs @@ -22,7 +22,7 @@ use std::{ collections::{HashMap, HashSet}, hash::Hash, io::Cursor, - sync::Arc, + sync::{Arc, RwLock}, }; use weareshared::{ Affine3A, @@ -37,25 +37,36 @@ use wgpu::{ }; pub struct DemandMap<K, V> { + inner: RwLock<DemandMapState<K, V>>, +} +struct DemandMapState<K, V> { values: HashMap<K, V>, needed: HashSet<K>, } -impl<K: Hash + Eq, V: Clone> DemandMap<K, V> { +impl<K: Hash + Eq + Clone, V: Clone> DemandMap<K, V> { pub fn new() -> Self { Self { - needed: HashSet::new(), - values: HashMap::new(), + inner: DemandMapState { + needed: HashSet::new(), + values: HashMap::new(), + } + .into(), } } - pub fn insert(&mut self, key: K, value: V) { - self.needed.remove(&key); - self.values.insert(key, value); + pub fn needed(&self) -> Vec<K> { + self.inner.read().unwrap().needed.iter().cloned().collect() + } + pub fn insert(&self, key: K, value: V) { + let mut s = self.inner.write().unwrap(); + s.needed.remove(&key); + s.values.insert(key, value); } - pub fn try_get(&mut self, key: K) -> Option<V> { - if let Some(k) = self.values.get(&key) { + pub fn try_get(&self, key: K) -> Option<V> { + let mut s = self.inner.write().unwrap(); + if let Some(k) = s.values.get(&key) { Some(k.to_owned()) } else { - self.needed.insert(key); + s.needed.insert(key); None } } @@ -100,8 +111,8 @@ impl ScenePreparer { queue, } } - pub fn update(&mut self, dls: &mut Downloader) -> Result<()> { - for pres in self.prefabs.needed.clone() { + pub fn update(&self, dls: &Downloader) -> Result<()> { + for pres in self.prefabs.needed() { if let Some(prefab) = dls.try_get(pres.clone())? { let mut rprefab = RPrefab(Vec::new()); for (aff, partres) in &prefab.mesh { @@ -115,7 +126,7 @@ impl ScenePreparer { } } } - for pres in self.index_buffers.needed.clone() { + for pres in self.index_buffers.needed() { if let Some(buf) = dls.try_get(pres.clone())? { let buf = buf .0 @@ -133,7 +144,7 @@ impl ScenePreparer { debug!("index buffer created (len={}) {pres}", buf.len() / 2); } } - for pres in self.vertex_buffers.needed.clone() { + for pres in self.vertex_buffers.needed() { if let Some(buf) = dls.try_get(pres.clone())? { let buf = buf .0 @@ -154,7 +165,7 @@ impl ScenePreparer { ); } } - for pres in self.textures.needed.clone() { + for pres in self.textures.needed() { if let Some(buf) = dls.try_get(pres.clone())? { let image = ImageReader::new(Cursor::new(buf.0)).with_guessed_format()?; let image = image.decode()?; @@ -171,7 +182,7 @@ impl ScenePreparer { self.textures.insert(pres.clone(), tex_bg); } } - for pres in self.placeholder_textures.needed.clone() { + for pres in self.placeholder_textures.needed() { let tex_bg = create_texture( &self.device, &self.queue, @@ -182,12 +193,11 @@ impl ScenePreparer { ); self.placeholder_textures.insert(pres, tex_bg); } - for pres in self.mesh_parts.needed.clone() { + for pres in self.mesh_parts.needed() { if let Some(part) = dls.try_get(pres.clone())? { if let (Some(indexres), Some(positionres)) = (part.index, part.va_position) { let Some((index, index_count)) = self.index_buffers.try_get(indexres.clone()) else { - self.index_buffers.needed.insert(indexres); continue; }; let mut position = Vec::new(); |