summaryrefslogtreecommitdiff
path: root/client/src/part.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-05 22:27:53 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-05 22:27:53 +0100
commite15b39b2a9cf028b12cbe98f56674e58c5a6bd4c (patch)
tree92484ce572dff978fc289eb54d19bbb692c01c12 /client/src/part.rs
parentc427fed04f89147bcdcb2b4b1be9198a063d89cd (diff)
downloadweareserver-e15b39b2a9cf028b12cbe98f56674e58c5a6bd4c.tar
weareserver-e15b39b2a9cf028b12cbe98f56674e58c5a6bd4c.tar.bz2
weareserver-e15b39b2a9cf028b12cbe98f56674e58c5a6bd4c.tar.zst
a
Diffstat (limited to 'client/src/part.rs')
-rw-r--r--client/src/part.rs36
1 files changed, 21 insertions, 15 deletions
diff --git a/client/src/part.rs b/client/src/part.rs
index 15835d0..0ad714a 100644
--- a/client/src/part.rs
+++ b/client/src/part.rs
@@ -1,8 +1,6 @@
+use crate::download::Downloader;
use anyhow::Result;
-use weareshared::{
- packets::Resource,
- resources::{Indecies, Part, VertexAttributes},
-};
+use weareshared::resources::{Indecies, Part, VertexAttributes};
use wgpu::{
BindGroup, BindGroupDescriptor, BindGroupLayoutDescriptor, BlendState, Buffer, BufferUsages,
ColorTargetState, ColorWrites, CommandEncoder, Device, FragmentState, FrontFace, IndexFormat,
@@ -28,16 +26,25 @@ pub struct PartData {
}
impl PartData {
- pub fn update(&mut self, hash: Resource, data: &[u8]) -> Result<bool> {
- if Some(hash) == self.target.index {
- self.index = Some(Indecies::deserialize(data)?)
+ pub fn update(&mut self, dls: &mut Downloader) -> Result<bool> {
+ let mut ready = true;
+ if self.index.is_none() {
+ ready = false;
+ if let Some(hash) = self.target.index {
+ if let Some(data) = dls.try_get(hash)? {
+ self.index = Some(Indecies::deserialize(data.as_slice())?)
+ }
+ }
}
- for (thash, tdata) in self.target.vertex.iter().zip(self.vertex.iter_mut()) {
- if hash == *thash {
- *tdata = Some(VertexAttributes::deserialize(data)?)
+ for (hash, slot) in self.target.vertex.iter().zip(self.vertex.iter_mut()) {
+ if slot.is_none() {
+ ready = false;
+ if let Some(data) = dls.try_get(*hash)? {
+ *slot = Some(VertexAttributes::deserialize(data.as_slice())?)
+ }
}
}
- Ok(self.vertex.iter().all(|v| v.is_some()) && self.index.is_some())
+ Ok(ready)
}
}
@@ -45,11 +52,10 @@ impl RenderPart {
pub fn new(device: Device, data: PartData, format: TextureFormat) -> Self {
let mut vertex = Vec::new();
let mut index = Vec::new();
- let attrs = data.vertex.unwrap();
for i in 0..data.vertex[0].as_ref().unwrap().0.len() {
- vertex.extend(attrs[0].0[i].to_le_bytes());
- vertex.extend(attrs[1].0[i].to_le_bytes());
- vertex.extend(attrs[2].0[i].to_le_bytes());
+ vertex.extend(data.vertex[0].as_ref().unwrap().0[i].to_le_bytes());
+ vertex.extend(data.vertex[1].as_ref().unwrap().0[i].to_le_bytes());
+ vertex.extend(data.vertex[2].as_ref().unwrap().0[i].to_le_bytes());
}
let mut n_vertex = 0;
for ind in data.index.unwrap().0 {