summaryrefslogtreecommitdiff
path: root/client
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
parent745c0ff9cfb27381114ce832baed3b57a2e4b4f6 (diff)
downloadweareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar
weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.bz2
weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.zst
static typing for resources
Diffstat (limited to 'client')
-rw-r--r--client/src/download.rs17
-rw-r--r--client/src/scene_prepare.rs52
-rw-r--r--client/src/scene_render.rs6
3 files changed, 38 insertions, 37 deletions
diff --git a/client/src/download.rs b/client/src/download.rs
index 95f9cc7..e65ef25 100644
--- a/client/src/download.rs
+++ b/client/src/download.rs
@@ -17,9 +17,9 @@
use crate::network::Network;
use anyhow::Result;
use log::debug;
-use std::collections::HashSet;
+use std::{collections::HashSet, marker::PhantomData};
use weareshared::{
- packets::{Packet, Resource},
+ packets::{Packet, ReadWrite, Resource},
store::{ResourceStore, sha256},
};
@@ -39,9 +39,14 @@ impl Downloader {
store,
}
}
- pub fn try_get(&mut self, hash: Resource) -> Result<Option<Vec<u8>>> {
+ pub fn try_get<T: ReadWrite>(&mut self, hash: Resource<T>) -> Result<Option<T>> {
+ self.try_get_raw(Resource(hash.0, PhantomData))?
+ .map(|x| T::read(&mut x.as_slice()))
+ .transpose()
+ }
+ pub fn try_get_raw(&mut self, hash: Resource) -> Result<Option<Vec<u8>>> {
if self.have.contains(&hash) {
- self.store.get(hash)
+ self.store.get_raw(hash)
} else {
self.need.insert(hash);
Ok(None)
@@ -50,8 +55,8 @@ impl Downloader {
pub fn packet(&mut self, p: &Packet) -> Result<()> {
match p {
Packet::RespondResource(d) => {
- let key = Resource(sha256(&d.0));
- self.store.set(&d.0)?;
+ let key = Resource(sha256(&d.0), PhantomData);
+ self.store.set_raw(&d.0)?;
self.need.remove(&key);
self.pending.remove(&key);
if self.have.insert(key) {
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;
};
diff --git a/client/src/scene_render.rs b/client/src/scene_render.rs
index d619f3d..6ec5f25 100644
--- a/client/src/scene_render.rs
+++ b/client/src/scene_render.rs
@@ -16,7 +16,7 @@
*/
use glam::{EulerRot, Mat3, Mat4};
use std::sync::Arc;
-use weareshared::{packets::Resource, tree::SceneTree};
+use weareshared::{packets::Resource, resources::Prefab, tree::SceneTree};
use wgpu::{
BindGroupLayout, BindGroupLayoutDescriptor, BindGroupLayoutEntry, BindingType, BlendState,
Color, ColorTargetState, ColorWrites, CommandEncoder, CompareFunction, DepthBiasState,
@@ -164,7 +164,7 @@ impl ScenePipeline {
commands: &mut CommandEncoder,
target: &TextureView,
scene: &SceneTree,
- prefabs: &mut DemandMap<Resource, Arc<RPrefab>>,
+ prefabs: &mut DemandMap<Resource<Prefab>, Arc<RPrefab>>,
camera: Mat4,
) {
let mut rpass = commands.begin_render_pass(&RenderPassDescriptor {
@@ -202,7 +202,7 @@ impl ScenePipeline {
ob.rot.z,
))
* Mat4::from_translation(ob.pos.into());
- if let Some(prefab) = prefabs.try_get(ob.res) {
+ if let Some(prefab) = prefabs.try_get(ob.res.clone()) {
for (affine, part) in &prefab.0 {
let part_projection = prefab_projection
* Mat4::from_mat3a(affine.matrix3)