diff options
-rw-r--r-- | doc/protocol.md | 2 | ||||
-rw-r--r-- | doc/resources.md | 1 | ||||
-rw-r--r-- | server/src/main.rs | 16 | ||||
-rw-r--r-- | shared/src/helper.rs | 8 | ||||
-rw-r--r-- | shared/src/packets.rs | 7 | ||||
-rw-r--r-- | shared/src/resources.rs | 6 | ||||
-rw-r--r-- | world/src/main.rs | 7 | ||||
-rw-r--r-- | world/src/mesh.rs | 6 |
8 files changed, 32 insertions, 21 deletions
diff --git a/doc/protocol.md b/doc/protocol.md index bb20a05..63355dd 100644 --- a/doc/protocol.md +++ b/doc/protocol.md @@ -29,7 +29,7 @@ encoded text. 0x07 parent(parent: Obj, child: Obj) 0x08 sound(id: Obj, data: Vec<u8>) 0x09 prefab_index(res: Res) -0x0a prefab_name(res: Res, name: String) +0x0a announce_prefab(res: Res) ``` ## Resources diff --git a/doc/resources.md b/doc/resources.md index ba1ce72..6be292b 100644 --- a/doc/resources.md +++ b/doc/resources.md @@ -34,6 +34,7 @@ white except normals are zero. | Key | Value Type | | | ------------------ | ------------- | ------------------ | +| name | String | | | index | Resource | | | g_metallic | Float | | | g_roughness | Float | | diff --git a/server/src/main.rs b/server/src/main.rs index 9ccab02..5cfbb96 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -119,12 +119,16 @@ impl State { Packet::PrefabIndex(_) => { // ok } - Packet::PrefabName(resource, name) => { - self.prefab_index.0.insert(name, resource); - net.broadcast( - Packet::PrefabIndex(self.store.set(&self.prefab_index)?), - true, - ); + Packet::AnnouncePrefab(resource) => { + if let Some(prefab) = self.store.get(resource.clone())? { + if let Some(name) = prefab.name { + self.prefab_index.0.insert(name, resource); + net.broadcast( + Packet::PrefabIndex(self.store.set(&self.prefab_index)?), + true, + ); + } + } } } Ok(()) diff --git a/shared/src/helper.rs b/shared/src/helper.rs index 65918ad..d91313c 100644 --- a/shared/src/helper.rs +++ b/shared/src/helper.rs @@ -67,16 +67,12 @@ impl ReadWrite for Vec<u8> { } impl ReadWrite for String { fn write(&self, w: &mut dyn Write) -> Result<()> { - w.write_all(&(self.len() as u32).to_be_bytes())?; w.write_all(self.as_bytes())?; Ok(()) } fn read(r: &mut dyn Read) -> Result<Self> { - let mut size = [0; 4]; - r.read_exact(&mut size)?; - let size = u32::from_be_bytes(size); - let mut buf = vec![0; size as usize]; - r.read_exact(&mut buf)?; + let mut buf = Vec::new(); + r.read_to_end(&mut buf)?; Ok(String::from_utf8(buf)?) } } diff --git a/shared/src/packets.rs b/shared/src/packets.rs index a35b4e9..2100edc 100644 --- a/shared/src/packets.rs +++ b/shared/src/packets.rs @@ -61,7 +61,7 @@ pub enum Packet { Parent(Object, Object), Sound(Object, Data), PrefabIndex(Resource<PrefabIndex>), - PrefabName(Resource<Prefab>, String), + AnnouncePrefab(Resource<Prefab>), } impl Object { @@ -121,10 +121,9 @@ impl Packet { w.write_all(&[0x09])?; resource.write(w)?; } - Packet::PrefabName(resource, name) => { + Packet::AnnouncePrefab(resource) => { w.write_all(&[0x0a])?; resource.write(w)?; - name.write(w)?; } } Ok(()) @@ -155,7 +154,7 @@ impl ReadWrite for Packet { 0x07 => Packet::Parent(Object::read(r)?, Object::read(r)?), 0x08 => Packet::Sound(Object::read(r)?, Data::read(r)?), 0x09 => Packet::PrefabIndex(Resource::read(r)?), - 0x0a => Packet::PrefabName(Resource::read(r)?, String::read(r)?), + 0x0a => Packet::AnnouncePrefab(Resource::read(r)?), _ => { for _ in 0..packet_len.max(1) - 1 { r.read_exact(&mut [0])?; diff --git a/shared/src/resources.rs b/shared/src/resources.rs index 08fb6f5..25dd965 100644 --- a/shared/src/resources.rs +++ b/shared/src/resources.rs @@ -25,6 +25,7 @@ use std::{ #[derive(Debug, Default, Clone)] pub struct Prefab { + pub name: Option<String>, pub mesh: Vec<(Affine3A, Resource<MeshPart>)>, pub light: Vec<(Vec3A, Resource<LightPart>)>, pub environment: Option<Resource<EnvironmentPart>>, @@ -44,6 +45,7 @@ pub struct EnvironmentPart { #[derive(Debug, Default, Clone)] pub struct MeshPart { + pub name: Option<String>, pub index: Option<Resource<IndexArray>>, pub g_metallic: Option<f32>, pub g_roughness: Option<f32>, @@ -107,6 +109,7 @@ impl ReadWrite for PrefabIndex { impl ReadWrite for Prefab { fn write(&self, w: &mut dyn Write) -> Result<()> { + write_kv_opt(w, b"name", &self.name)?; for x in &self.mesh { write_kv_opt(w, b"mesh", &Some(x.clone()))?; } @@ -119,6 +122,7 @@ impl ReadWrite for Prefab { fn read(r: &mut dyn Read) -> Result<Self> { let mut s = Self::default(); read_kv_iter(r, |k, v| match k { + b"name" => Ok(s.name = Some(read_slice(v)?)), b"mesh" => Ok(s.mesh.push(read_slice(v)?)), b"light" => Ok(s.light.push(read_slice(v)?)), b"environment" => Ok(s.environment = Some(read_slice(v)?)), @@ -171,6 +175,7 @@ impl ReadWrite for EnvironmentPart { } impl ReadWrite for MeshPart { fn write(&self, w: &mut dyn Write) -> Result<()> { + write_kv_opt(w, b"name", &self.name)?; write_kv_opt(w, b"index", &self.index)?; write_kv_opt(w, b"g_metallic", &self.g_metallic)?; write_kv_opt(w, b"g_roughness", &self.g_roughness)?; @@ -199,6 +204,7 @@ impl ReadWrite for MeshPart { fn read(r: &mut dyn Read) -> Result<Self> { let mut s = Self::default(); read_kv_iter(r, |k, v| match k { + b"name" => Ok(s.name = Some(read_slice(v)?)), b"index" => Ok(s.index = Some(read_slice(v)?)), b"g_metallic" => Ok(s.g_metallic = Some(read_slice(v)?)), b"g_roughness" => Ok(s.g_roughness = Some(read_slice(v)?)), diff --git a/world/src/main.rs b/world/src/main.rs index eeea1c9..7f531b4 100644 --- a/world/src/main.rs +++ b/world/src/main.rs @@ -118,10 +118,9 @@ fn main() -> Result<()> { let pres = store.set(&prefab)?; - if let Some(name) = args.name { - Packet::PrefabName(pres.clone(), name).write(&mut sock)?; - sock.flush()?; - } + Packet::AnnouncePrefab(pres.clone()).write(&mut sock)?; + sock.flush()?; + let ob = if args.add { let ob = Object::new(); Packet::Add(ob, pres.clone()).write(&mut sock)?; diff --git a/world/src/mesh.rs b/world/src/mesh.rs index c5bbb7f..2c868ab 100644 --- a/world/src/mesh.rs +++ b/world/src/mesh.rs @@ -303,7 +303,13 @@ pub fn import_mesh( let g_refractive_index = p.material().ior(); let g_thickness = p.material().volume().map(|v| v.thickness_factor()); + let name = mesh.name().map(|e| e.to_owned()); + if let Some(name) = &name { + info!("name is {name:?}"); + } + let mesh = store.set(&MeshPart { + name, index, g_albedo, g_alpha, |