summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/protocol.md2
-rw-r--r--doc/resources.md1
-rw-r--r--server/src/main.rs16
-rw-r--r--shared/src/helper.rs8
-rw-r--r--shared/src/packets.rs7
-rw-r--r--shared/src/resources.rs6
-rw-r--r--world/src/main.rs7
-rw-r--r--world/src/mesh.rs6
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,