From f8c243d5a06cbb72f4757e2fb5421c3ec50d509c Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 23 Mar 2025 15:09:21 +0100 Subject: fix endless loading on broken meshes --- client/src/camera.rs | 2 +- client/src/render/scene/mod.rs | 17 ++++++++++++----- server/src/network.rs | 13 +++++++++---- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/client/src/camera.rs b/client/src/camera.rs index 78ce240..5e71519 100644 --- a/client/src/camera.rs +++ b/client/src/camera.rs @@ -39,7 +39,7 @@ impl Camera { } } pub fn update(&mut self, input_move: Vec3, input_rot: Vec2, dt: f32) { - let speed = 3.; + let speed = 5.; let vel_local = vec3(input_move.z, input_move.y, -input_move.x) * dt * speed; self.pos += self.rotation_mat() * vel_local; self.rot.x += input_rot.x * -0.002; diff --git a/client/src/render/scene/mod.rs b/client/src/render/scene/mod.rs index 569f3b9..e0af292 100644 --- a/client/src/render/scene/mod.rs +++ b/client/src/render/scene/mod.rs @@ -64,7 +64,7 @@ pub struct ScenePreparer { generated_tangent_buffers: DemandMap>, generated_normal_buffers: DemandMap>, generated_texcoord_buffers: DemandMap>, - mesh_parts: DemandMap, Arc>, + mesh_parts: DemandMap, Result, String>>, materials: DemandMap>, pipelines: DemandMap>, mip_generation_pipelines: DemandMap>, @@ -193,12 +193,16 @@ impl ScenePreparer { for pres in self.prefabs.needed() { if let Some(prefab) = self.downloader.try_get(pres.clone())? { let mut rprefab = RPrefab(Vec::new()); + let mut done_or_failed = 0; for (aff, partres) in &prefab.mesh { if let Some(part) = self.mesh_parts.try_get(partres.clone()) { - rprefab.0.push((*aff, part.clone())); + if let Ok(part) = part.clone() { + rprefab.0.push((*aff, part)); + } + done_or_failed += 1; } } - if rprefab.0.len() == prefab.mesh.len() { + if done_or_failed == prefab.mesh.len() { self.prefabs.insert(pres.clone(), Arc::new(rprefab), 0); debug!("prefab created ({pres})"); num_done += 1; @@ -383,7 +387,7 @@ impl ScenePreparer { debug!("part created (took {:?}) {pres}", start.elapsed()); self.mesh_parts.insert( pres, - Arc::new(RMeshPart { + Ok(Arc::new(RMeshPart { pipeline, index_count, index, @@ -398,11 +402,14 @@ impl ScenePreparer { material, double_sided, joint_uniform, - }), + })), 0, ); num_done += 1; } + } else { + self.mesh_parts + .insert(pres, Err("index or positions missing".to_string()), 0); } } } diff --git a/server/src/network.rs b/server/src/network.rs index ec65218..19498c5 100644 --- a/server/src/network.rs +++ b/server/src/network.rs @@ -30,11 +30,13 @@ use std::{ use weareshared::{helper::ReadWrite, packets::Packet, tree::PacketSink}; type Conns = Arc>>, Option)>>>; + pub struct ServerNetwork { conns: Conns, udp_sock: Arc, pub recv: Receiver<(u128, Packet)>, } + impl ServerNetwork { pub fn new(addr: SocketAddr) -> Result { let (recv_tx, recv_rx) = channel(); @@ -118,10 +120,13 @@ fn serve_udp(udp_sock: Arc, conns: Conns, recv_tx: Sender<(u128, Pack if let Packet::Connect(id) = &packet { if let Some((_send, udp_addr)) = conns.lock().unwrap().get_mut(id) { *udp_addr = Some(addr); - cstates.insert(addr, CState { - conn_id: *id, - last_ack: Instant::now(), - }); + cstates.insert( + addr, + CState { + conn_id: *id, + last_ack: Instant::now(), + }, + ); } } else if let Some(conn) = cstates.get(&addr) { let cid = conn.conn_id; -- cgit v1.2.3-70-g09d2