summaryrefslogtreecommitdiff
path: root/client/src/scene_prepare.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-10 17:49:37 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-10 17:49:37 +0100
commit9335f7193ae666c378f5011e1eb90db5721e43fd (patch)
tree0e45add1360a74012c5aec8f665f2bde94c51d1d /client/src/scene_prepare.rs
parentc4e99ec50b3ac45ff01f902655cad07118835d1c (diff)
downloadweareserver-9335f7193ae666c378f5011e1eb90db5721e43fd.tar
weareserver-9335f7193ae666c378f5011e1eb90db5721e43fd.tar.bz2
weareserver-9335f7193ae666c378f5011e1eb90db5721e43fd.tar.zst
multithreaded world loading
Diffstat (limited to 'client/src/scene_prepare.rs')
-rw-r--r--client/src/scene_prepare.rs46
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();