From e2a3c56206080008f34072b5c7cf2ef961e0ed49 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 9 Jan 2025 23:22:30 +0100 Subject: new prefab index --- server/src/main.rs | 48 +++++++++++++++++++++++++++++++++++------------- 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>, + prefab_index_have: HashSet>, } 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::); + 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, /// Add skybox #[arg(short, long)] skybox: Option, + /// Override prefab name + #[arg(short, long)] + name: Option, } 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() { -- cgit v1.2.3-70-g09d2