summaryrefslogtreecommitdiff
path: root/client/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-06 15:34:40 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-06 15:34:40 +0100
commit14d348febd549b944d03030bf748f7817a2bedac (patch)
tree96fb79928296a9b6e6b50e0c805fcafaaf32e16a /client/src
parent48a0fb31737362c9bae0ff8f6fcf1e4e10600f94 (diff)
downloadweareserver-14d348febd549b944d03030bf748f7817a2bedac.tar
weareserver-14d348febd549b944d03030bf748f7817a2bedac.tar.bz2
weareserver-14d348febd549b944d03030bf748f7817a2bedac.tar.zst
a
Diffstat (limited to 'client/src')
-rw-r--r--client/src/scene_prepare.rs24
-rw-r--r--client/src/scene_render.rs14
2 files changed, 27 insertions, 11 deletions
diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs
index f069b5d..30c1742 100644
--- a/client/src/scene_prepare.rs
+++ b/client/src/scene_prepare.rs
@@ -3,16 +3,23 @@ use std::{
collections::{HashMap, HashSet},
sync::Arc,
};
-use weareshared::{packets::Resource, resources::Part, tree::SceneTree};
+use weareshared::{
+ packets::{ReadWrite, Resource},
+ resources::Prefab,
+ tree::SceneTree,
+};
use wgpu::Buffer;
+use crate::download::Downloader;
+
pub struct ScenePreparer {
index_buffers: HashMap<Resource, Arc<Buffer>>,
vertex_buffers_x3: HashMap<[Resource; 1], Arc<Buffer>>,
vertex_buffers_x2: HashMap<[Resource; 2], Arc<Buffer>>,
vertex_buffers_x1: HashMap<[Resource; 3], Arc<Buffer>>,
- parts: HashMap<Resource, Arc<Part>>,
+ parts: HashMap<Resource, Arc<RPart>>,
prefabs: HashMap<Resource, RPrefab>,
+ prefabs_needed: HashSet<Resource>,
}
pub struct RPrefab(pub Vec<Arc<RPart>>);
@@ -32,11 +39,16 @@ impl ScenePreparer {
vertex_buffers_x1: HashMap::new(),
parts: HashMap::new(),
prefabs: HashMap::new(),
+ prefabs_needed: HashSet::new(),
}
}
- fn update(&mut self, tree: &SceneTree) -> Result<()> {
- let need = tree.objects.values().map(|o| o.res).collect::<HashSet<_>>();
-
- for n in need {}
+ fn update(&mut self, dls: &mut Downloader) -> Result<()> {
+ for pres in &self.prefabs_needed {
+ if let Some(buf) = dls.try_get(*pres)? {
+ let prefab = Prefab::read(&mut buf.as_slice())?;
+
+ }
+ }
+ Ok(())
}
}
diff --git a/client/src/scene_render.rs b/client/src/scene_render.rs
index d19b083..f80f6c2 100644
--- a/client/src/scene_render.rs
+++ b/client/src/scene_render.rs
@@ -1,9 +1,9 @@
-use std::collections::HashMap;
+use std::collections::{HashMap, HashSet};
use weareshared::{packets::Resource, tree::SceneTree};
use wgpu::{
- BindGroup, BindGroupDescriptor, BindGroupLayoutDescriptor, BlendState, Buffer, Color,
- ColorTargetState, ColorWrites, CommandEncoder, Device, FragmentState, FrontFace, IndexFormat,
- LoadOp, MultisampleState, Operations, PipelineCompilationOptions, PipelineLayoutDescriptor,
+ BindGroup, BindGroupDescriptor, BindGroupLayoutDescriptor, BlendState, Color, ColorTargetState,
+ ColorWrites, CommandEncoder, Device, FragmentState, FrontFace, IndexFormat, LoadOp,
+ MultisampleState, Operations, PipelineCompilationOptions, PipelineLayoutDescriptor,
PolygonMode, PrimitiveState, PrimitiveTopology, RenderPassColorAttachment,
RenderPassDescriptor, RenderPipeline, RenderPipelineDescriptor, StoreOp, TextureFormat,
TextureView, VertexAttribute, VertexBufferLayout, VertexFormat, VertexState, VertexStepMode,
@@ -16,6 +16,7 @@ pub struct ScenePipeline {
pipeline: RenderPipeline,
bind_group: BindGroup,
prefabs: HashMap<Resource, RPrefab>,
+ prefabs_needed: HashSet<Resource>,
}
impl ScenePipeline {
@@ -85,10 +86,11 @@ impl ScenePipeline {
Self {
bind_group,
pipeline,
+ prefabs_needed: HashSet::new(),
prefabs: HashMap::new(),
}
}
- pub fn draw(&self, commands: &mut CommandEncoder, target: &TextureView, scene: &SceneTree) {
+ pub fn draw(&mut self, commands: &mut CommandEncoder, target: &TextureView, scene: &SceneTree) {
let mut rpass = commands.begin_render_pass(&RenderPassDescriptor {
label: None,
color_attachments: &[Some(RenderPassColorAttachment {
@@ -117,6 +119,8 @@ impl ScenePipeline {
rpass.set_vertex_buffer(1, part.normals.slice(..));
rpass.draw_indexed(0..part.index_count, 0, 0..1);
}
+ } else {
+ self.prefabs_needed.insert(ob.res);
}
}
}