summaryrefslogtreecommitdiff
path: root/client/src/scene_prepare.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-07 22:56:34 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-07 22:56:34 +0100
commit02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3 (patch)
tree10362c18bccf2e9690d78844a7ff3ca403f7a126 /client/src/scene_prepare.rs
parent745c0ff9cfb27381114ce832baed3b57a2e4b4f6 (diff)
downloadweareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar
weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.bz2
weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.zst
static typing for resources
Diffstat (limited to 'client/src/scene_prepare.rs')
-rw-r--r--client/src/scene_prepare.rs52
1 files changed, 24 insertions, 28 deletions
diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs
index 6e4cb51..1807e39 100644
--- a/client/src/scene_prepare.rs
+++ b/client/src/scene_prepare.rs
@@ -15,7 +15,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use crate::download::Downloader;
-use anyhow::{Context, Result};
+use anyhow::Result;
use image::ImageReader;
use log::debug;
use std::{
@@ -26,8 +26,8 @@ use std::{
};
use weareshared::{
Affine3A,
- packets::{ReadWrite, Resource},
- resources::{MeshPart, Prefab},
+ packets::Resource,
+ resources::{AttributeArray, Image, IndexArray, MeshPart, Prefab},
};
use wgpu::{
BindGroup, BindGroupDescriptor, BindGroupEntry, BindGroupLayout, BindingResource, Buffer,
@@ -66,13 +66,13 @@ pub struct ScenePreparer {
queue: Arc<Queue>,
texture_bgl: BindGroupLayout,
- textures: DemandMap<Resource, (Arc<Texture>, Arc<BindGroup>)>,
+ textures: DemandMap<Resource<Image>, (Arc<Texture>, Arc<BindGroup>)>,
placeholder_textures: DemandMap<(), (Arc<Texture>, Arc<BindGroup>)>,
- index_buffers: DemandMap<Resource, (Arc<Buffer>, u32)>,
- vertex_buffers: DemandMap<Resource, (Arc<Buffer>, u32)>,
+ index_buffers: DemandMap<Resource<IndexArray>, (Arc<Buffer>, u32)>,
+ vertex_buffers: DemandMap<Resource<AttributeArray>, (Arc<Buffer>, u32)>,
placeholder_vertex_buffers: DemandMap<(u32, bool), Arc<Buffer>>,
- mesh_parts: DemandMap<Resource, Arc<RMeshPart>>,
- pub prefabs: DemandMap<Resource, Arc<RPrefab>>,
+ mesh_parts: DemandMap<Resource<MeshPart>, Arc<RMeshPart>>,
+ pub prefabs: DemandMap<Resource<Prefab>, Arc<RPrefab>>,
}
pub struct RPrefab(pub Vec<(Affine3A, Arc<RMeshPart>)>);
@@ -102,28 +102,26 @@ impl ScenePreparer {
}
pub fn update(&mut self, dls: &mut Downloader) -> Result<()> {
for pres in self.prefabs.needed.clone() {
- if let Some(buf) = dls.try_get(pres)? {
- let prefab = Prefab::read(&mut buf.as_slice()).context("parsing prefab")?;
+ if let Some(prefab) = dls.try_get(pres.clone())? {
let mut rprefab = RPrefab(Vec::new());
for (aff, partres) in &prefab.mesh {
- if let Some(part) = self.mesh_parts.try_get(*partres) {
+ if let Some(part) = self.mesh_parts.try_get(partres.clone()) {
rprefab.0.push((*aff, part.clone()));
}
}
if rprefab.0.len() == prefab.mesh.len() {
- self.prefabs.insert(pres, Arc::new(rprefab));
+ self.prefabs.insert(pres.clone(), Arc::new(rprefab));
debug!("prefab created ({pres})");
}
}
}
for pres in self.index_buffers.needed.clone() {
- if let Some(buf) = dls.try_get(pres)? {
+ if let Some(buf) = dls.try_get(pres.clone())? {
let buf = buf
+ .0
.into_iter()
- .array_chunks::<2>()
- .map(u16::from_be_bytes)
- .map(u16::to_le_bytes)
.flatten()
+ .flat_map(u16::to_le_bytes)
.collect::<Vec<_>>();
let buffer = self.device.create_buffer_init(&BufferInitDescriptor {
contents: &buf,
@@ -131,16 +129,15 @@ impl ScenePreparer {
usage: BufferUsages::INDEX | BufferUsages::COPY_DST,
});
self.index_buffers
- .insert(pres, (Arc::new(buffer), (buf.len() / 2) as u32));
+ .insert(pres.clone(), (Arc::new(buffer), (buf.len() / 2) as u32));
debug!("index buffer created (len={}) {pres}", buf.len() / 2);
}
}
for pres in self.vertex_buffers.needed.clone() {
- if let Some(buf) = dls.try_get(pres)? {
+ if let Some(buf) = dls.try_get(pres.clone())? {
let buf = buf
+ .0
.into_iter()
- .array_chunks::<4>()
- .map(f32::from_be_bytes)
.map(f32::to_le_bytes)
.flatten()
.collect::<Vec<_>>();
@@ -150,7 +147,7 @@ impl ScenePreparer {
usage: BufferUsages::VERTEX | BufferUsages::COPY_DST,
});
self.vertex_buffers
- .insert(pres, (Arc::new(buffer), (buf.len() / 4) as u32));
+ .insert(pres.clone(), (Arc::new(buffer), (buf.len() / 4) as u32));
debug!(
"vertex attribute buffer created (len={}) {pres}",
buf.len() / 4
@@ -158,8 +155,8 @@ impl ScenePreparer {
}
}
for pres in self.textures.needed.clone() {
- if let Some(buf) = dls.try_get(pres)? {
- let image = ImageReader::new(Cursor::new(buf)).with_guessed_format()?;
+ if let Some(buf) = dls.try_get(pres.clone())? {
+ let image = ImageReader::new(Cursor::new(buf.0)).with_guessed_format()?;
let image = image.decode()?;
let image = image.to_rgba8();
let image_raw = image.to_vec();
@@ -171,7 +168,7 @@ impl ScenePreparer {
image.width(),
image.height(),
);
- self.textures.insert(pres, tex_bg);
+ self.textures.insert(pres.clone(), tex_bg);
}
}
for pres in self.placeholder_textures.needed.clone() {
@@ -186,11 +183,10 @@ impl ScenePreparer {
self.placeholder_textures.insert(pres, tex_bg);
}
for pres in self.mesh_parts.needed.clone() {
- if let Some(buf) = dls.try_get(pres)? {
- let part = MeshPart::read(&mut buf.as_slice()).context("parsing part")?;
-
+ 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) else {
+ let Some((index, index_count)) = self.index_buffers.try_get(indexres.clone())
+ else {
self.index_buffers.needed.insert(indexres);
continue;
};