summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/main.rs48
-rw-r--r--world/src/main.rs10
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() {