diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-09 23:22:30 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-09 23:22:30 +0100 |
commit | e2a3c56206080008f34072b5c7cf2ef961e0ed49 (patch) | |
tree | e879816e60281f941cfabee69ee86b06e9a051aa | |
parent | 77486da1c97c988205c8bb117b1168a1a0ef6a46 (diff) | |
download | weareserver-e2a3c56206080008f34072b5c7cf2ef961e0ed49.tar weareserver-e2a3c56206080008f34072b5c7cf2ef961e0ed49.tar.bz2 weareserver-e2a3c56206080008f34072b5c7cf2ef961e0ed49.tar.zst |
new prefab index
-rw-r--r-- | server/src/main.rs | 48 | ||||
-rw-r--r-- | world/src/main.rs | 10 |
2 files changed, 40 insertions, 18 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index 4528ede..a599efa 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -20,11 +20,15 @@ use anyhow::Result; use clap::Parser; use log::{debug, warn}; use network::ServerNetwork; -use std::net::{IpAddr, SocketAddr}; +use std::{ + collections::HashSet, + marker::PhantomData, + net::{IpAddr, SocketAddr}, +}; use weareshared::{ - packets::{Data, Packet}, - resources::PrefabIndex, - store::ResourceStore, + packets::{Data, Packet, Resource}, + resources::{Prefab, PrefabIndex}, + store::{ResourceStore, sha256}, tree::SceneTree, }; @@ -40,6 +44,8 @@ struct State { store: ResourceStore, tree: SceneTree, prefab_index: PrefabIndex, + prefab_index_pending: HashSet<Resource<Prefab>>, + prefab_index_have: HashSet<Resource<Prefab>>, } fn main() -> Result<()> { @@ -66,6 +72,8 @@ impl State { )?, tree: SceneTree::default(), prefab_index: PrefabIndex::default(), + prefab_index_pending: HashSet::new(), + prefab_index_have: HashSet::new(), }) } pub fn prime_client(&self, conn: u128, net: &ServerNetwork) -> Result<()> { @@ -95,8 +103,24 @@ impl State { } } Packet::RespondResource(data) => { - self.store.set_raw(&data.0)?; + let resource = self.store.set_raw(&data.0)?; net.broadcast(Packet::RespondResource(data), true); + + if self + .prefab_index_pending + .remove(&Resource(resource.0, PhantomData)) + { + let resource = Resource(resource.0, PhantomData::<Prefab>); + 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, + ); + } + } + } } Packet::Add(object, resource) => { net.broadcast(Packet::Add(object, resource), true); @@ -120,14 +144,12 @@ impl State { // ok } 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, - ); - } + if self.prefab_index_have.insert(resource.clone()) { + self.prefab_index_pending.insert(resource.clone()); + net.broadcast( + Packet::RequestResource(Resource(resource.0, PhantomData)), + true, + ); } } } diff --git a/world/src/main.rs b/world/src/main.rs index 694d57b..5dbfd06 100644 --- a/world/src/main.rs +++ b/world/src/main.rs @@ -61,12 +61,12 @@ struct Args { /// Transcode all textures to WebP #[arg(short, long)] webp: bool, - /// Register to the prefab index - #[arg(short, long)] - name: Option<String>, /// Add skybox #[arg(short, long)] skybox: Option<PathBuf>, + /// Override prefab name + #[arg(short, long)] + name: Option<String>, } fn main() -> Result<()> { @@ -85,11 +85,11 @@ fn main() -> Result<()> { let mut prefab = Prefab::default(); - prefab.name = gltf + prefab.name = args.name.or(gltf .default_scene() .map(|n| n.name()) .flatten() - .map(|n| n.to_owned()); + .map(|n| n.to_owned())); for node in gltf.nodes() { if let Some(mesh) = node.mesh() { |