summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-06 14:58:42 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-06 14:58:42 +0100
commit48a0fb31737362c9bae0ff8f6fcf1e4e10600f94 (patch)
treeb7b6940d476ce78081d99b1e9c028c86115bd8ed
parent814cc1cb01692aa934a40636c9226ff7bb911266 (diff)
downloadweareserver-48a0fb31737362c9bae0ff8f6fcf1e4e10600f94.tar
weareserver-48a0fb31737362c9bae0ff8f6fcf1e4e10600f94.tar.bz2
weareserver-48a0fb31737362c9bae0ff8f6fcf1e4e10600f94.tar.zst
prefab offsets
-rw-r--r--a.md2
-rw-r--r--client/src/scene_prepare.rs18
-rw-r--r--client/src/scene_render.rs10
-rw-r--r--shared/src/resources.rs25
4 files changed, 38 insertions, 17 deletions
diff --git a/a.md b/a.md
index 30c1f86..d36109c 100644
--- a/a.md
+++ b/a.md
@@ -20,7 +20,7 @@ len 08 sound(id: Obj, data: Vec<u8>)
### Prefab
```
-Prefab = *(part)
+Prefab = *(pos:f32x3 rot:f32x3 part)
```
### Part
diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs
index 8d52f49..f069b5d 100644
--- a/client/src/scene_prepare.rs
+++ b/client/src/scene_prepare.rs
@@ -7,11 +7,20 @@ use weareshared::{packets::Resource, resources::Part, tree::SceneTree};
use wgpu::Buffer;
pub struct ScenePreparer {
- index_buffers: HashMap<Resource, Buffer>,
+ 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, Part>,
+ parts: HashMap<Resource, Arc<Part>>,
+ prefabs: HashMap<Resource, RPrefab>,
+}
+
+pub struct RPrefab(pub Vec<Arc<RPart>>);
+pub struct RPart {
+ pub index_count: u32,
+ pub index: Arc<Buffer>,
+ pub positions: Arc<Buffer>,
+ pub normals: Arc<Buffer>,
}
impl ScenePreparer {
@@ -22,9 +31,12 @@ impl ScenePreparer {
vertex_buffers_x2: HashMap::new(),
vertex_buffers_x1: HashMap::new(),
parts: HashMap::new(),
+ prefabs: HashMap::new(),
}
}
fn update(&mut self, tree: &SceneTree) -> Result<()> {
- let x = tree.objects.values().map(|o| o.res).collect::<HashSet<_>>();
+ let need = tree.objects.values().map(|o| o.res).collect::<HashSet<_>>();
+
+ for n in need {}
}
}
diff --git a/client/src/scene_render.rs b/client/src/scene_render.rs
index cc15e3f..d19b083 100644
--- a/client/src/scene_render.rs
+++ b/client/src/scene_render.rs
@@ -10,20 +10,14 @@ use wgpu::{
include_wgsl,
};
+use crate::scene_prepare::RPrefab;
+
pub struct ScenePipeline {
pipeline: RenderPipeline,
bind_group: BindGroup,
prefabs: HashMap<Resource, RPrefab>,
}
-struct RPrefab(Vec<RPart>);
-struct RPart {
- index_count: u32,
- index: Buffer,
- positions: Buffer,
- normals: Buffer,
-}
-
impl ScenePipeline {
pub fn new(device: &Device, format: TextureFormat) -> Self {
let module = device.create_shader_module(include_wgsl!("shader.wgsl"));
diff --git a/shared/src/resources.rs b/shared/src/resources.rs
index cdf53bd..e59ea25 100644
--- a/shared/src/resources.rs
+++ b/shared/src/resources.rs
@@ -1,10 +1,11 @@
use crate::packets::{ReadWrite, Resource};
use anyhow::{Result, bail};
+use glam::Vec3;
use log::warn;
use std::io::{Read, Write};
#[derive(Debug, Default, Clone)]
-pub struct Prefab(pub Vec<Resource>);
+pub struct Prefab(pub Vec<(Vec3, Vec3, Resource)>);
#[derive(Debug, Default, Clone)]
pub struct Part {
@@ -32,8 +33,10 @@ pub struct IndexArray(pub Vec<[u16; 3]>);
impl ReadWrite for Prefab {
fn write(&self, w: &mut dyn Write) -> Result<()> {
- for x in self.0.clone() {
- w.write_all(&x.0)?;
+ for (pos, rot, res) in self.0.clone() {
+ pos.write(w)?;
+ rot.write(w)?;
+ res.write(w)?;
}
Ok(())
}
@@ -41,8 +44,8 @@ impl ReadWrite for Prefab {
let mut s = Prefab::default();
let mut g = Vec::new();
r.read_to_end(&mut g)?;
- for x in g.iter().array_chunks::<32>() {
- s.0.push(Resource(x.map(|x| *x)))
+ while !g.is_empty() {
+ s.0.push((Vec3::read(r)?, Vec3::read(r)?, Resource::read(r)?))
}
Ok(s)
}
@@ -182,3 +185,15 @@ impl ReadWrite for Attribute {
})
}
}
+
+impl ReadWrite for Vec3 {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ w.write_all(&self.x.to_be_bytes())?;
+ w.write_all(&self.y.to_be_bytes())?;
+ w.write_all(&self.z.to_be_bytes())?;
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ Ok(Self::new(f32::read(r)?, f32::read(r)?, f32::read(r)?))
+ }
+}