From f6f3406f6368977b88da08591c41b9a9fe8f5d2a Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Mon, 9 Oct 2023 16:52:43 +0200 Subject: [PATCH 01/26] refactor for bevy 0.12 --- Cargo.toml | 4 ++-- examples/client.rs | 2 +- examples/host.rs | 2 +- src/bundle_fix.rs | 4 ++-- src/client/receiver.rs | 23 ++++++++++++------ src/client/track.rs | 48 +++++++++++++++++++++++++++----------- src/lib_priv.rs | 29 +++++++---------------- src/networking.rs | 11 +++++---- src/proto.rs | 6 ++--- src/proto_serde.rs | 16 ++++++------- src/server/initial_sync.rs | 36 +++++++++++++++++++--------- src/server/mod.rs | 6 ++--- src/server/receiver.rs | 21 ++++++++++++----- src/server/track.rs | 44 ++++++++++++++++++++++++---------- tests/assert/mod.rs | 12 ++++------ tests/component_sync.rs | 2 +- tests/initial_sync.rs | 7 +++--- tests/setup/mod.rs | 4 ++-- 18 files changed, 170 insertions(+), 107 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5e41be2..705506f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,8 +16,8 @@ include = ["/src", "/LICENSE-MIT", "/LICENSE-APACHE"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bevy = { version = "0.11.0" } -bevy_renet = "0.0.9" +bevy = { git = "https://github.com/awtterpip/bevy" } +bevy_renet = { path = "../renet/bevy_renet" } bincode = "1.3.3" serde = { version = "1.0.160", features = ["derive"] } diff --git a/examples/client.rs b/examples/client.rs index cbb0147..9f2710f 100644 --- a/examples/client.rs +++ b/examples/client.rs @@ -16,7 +16,7 @@ fn main() { let mut client = App::new(); client.add_plugins(DefaultPlugins); - client.add_plugins(bevy_editor_pls::EditorPlugin::default()); + //client.add_plugins(bevy_editor_pls::EditorPlugin::default()); client.add_plugins(SyncPlugin); client.add_plugins(ClientPlugin { ip, port }); diff --git a/examples/host.rs b/examples/host.rs index 2ae4529..6c3f018 100644 --- a/examples/host.rs +++ b/examples/host.rs @@ -19,7 +19,7 @@ fn main() { let port = 4000; let mut host = App::new(); host.add_plugins(DefaultPlugins); - host.add_plugins(bevy_editor_pls::EditorPlugin::default()); + //host.add_plugins(bevy_editor_pls::EditorPlugin::default()); host.add_plugins(SyncPlugin); host.add_plugins(ServerPlugin { ip, port }); diff --git a/src/bundle_fix.rs b/src/bundle_fix.rs index e9a1322..96b69c5 100644 --- a/src/bundle_fix.rs +++ b/src/bundle_fix.rs @@ -20,10 +20,10 @@ impl Plugin for BundleFixPlugin { fn fix_computed_visibility( mut cmd: Commands, - query: Query, Without)>, + query: Query, Without)>, ) { for e in query.iter() { - cmd.entity(e).insert(ComputedVisibility::default()); + cmd.entity(e).insert(ViewVisibility::default()); } } diff --git a/src/client/receiver.rs b/src/client/receiver.rs index 68851c3..7330de8 100644 --- a/src/client/receiver.rs +++ b/src/client/receiver.rs @@ -61,8 +61,12 @@ fn client_received_a_message(msg: Message, track: &mut ResMut, c server_entity_id: e_id, server_parent_id: p_id, } => { - let Some(&c_e_id) = track.server_to_client_entities.get(&e_id) else {return}; - let Some(&c_p_id) = track.server_to_client_entities.get(&p_id) else {return}; + let Some(&c_e_id) = track.server_to_client_entities.get(&e_id) else { + return; + }; + let Some(&c_p_id) = track.server_to_client_entities.get(&p_id) else { + return; + }; cmd.add(move |world: &mut World| { let mut entity = world.entity_mut(c_e_id); let opt_parent = entity.get::(); @@ -78,14 +82,19 @@ fn client_received_a_message(msg: Message, track: &mut ResMut, c id.index(), id.generation() ); - let Some(&e_id) = track.server_to_client_entities.get(&id) else {return}; - let Some(mut e) = cmd.get_entity(e_id) else {return}; + let Some(&e_id) = track.server_to_client_entities.get(&id) else { + return; + }; + let Some(mut e) = cmd.get_entity(e_id) else { + return; + }; e.despawn(); } Message::ComponentUpdated { id, name, data } => { - let Some(&e_id) = track.server_to_client_entities.get(&id) else {return}; - let mut entity = cmd.entity(e_id); - entity.add(move |_: Entity, world: &mut World| { + let Some(&e_id) = track.server_to_client_entities.get(&id) else { + return; + }; + cmd.add(move |world: &mut World| { SyncTrackerRes::apply_component_change_from_network(e_id, name, &data, world); }); } diff --git a/src/client/track.rs b/src/client/track.rs index c8ef43b..cc2fcbc 100644 --- a/src/client/track.rs +++ b/src/client/track.rs @@ -35,7 +35,9 @@ pub(crate) fn entity_parented_on_client( query_parent: Query<(Entity, &SyncUp), With>, ) { for (p, sup) in query.iter() { - let Ok(parent) = query_parent.get_component::(p.get()) else {return}; + let Ok(parent) = query_parent.get_component::(p.get()) else { + return; + }; client.send_message( DefaultChannel::ReliableOrdered, bincode::serialize(&Message::EntityParented { @@ -102,23 +104,33 @@ pub(crate) fn react_on_changed_materials( mut events: EventReader>, ) { let registry = registry.read(); - for event in &mut events { + for event in &mut events.read() { match event { - AssetEvent::Created { handle } | AssetEvent::Modified { handle } => { - let Some(material) = materials.get(handle) else { return; }; - if track.skip_network_handle_change(handle.id()) { + AssetEvent::Added { id } | AssetEvent::Modified { id } => { + let Some(material) = materials.get(*id) else { + return; + }; + let AssetId::Index { + index: id, + marker: _, + } = id + else { + return; + }; + if track.skip_network_handle_change(*id) { return; } client.send_message( DefaultChannel::ReliableOrdered, bincode::serialize(&Message::StandardMaterialUpdated { - id: handle.id(), + id: *id, material: compo_to_bin(material.clone_value(), ®istry), }) .unwrap(), ); } - AssetEvent::Removed { handle: _ } => {} + AssetEvent::Removed { id: _ } => {} + _ => (), } } } @@ -129,23 +141,33 @@ pub(crate) fn react_on_changed_meshes( assets: Res>, mut events: EventReader>, ) { - for event in &mut events { + for event in &mut events.read() { match event { - AssetEvent::Created { handle } | AssetEvent::Modified { handle } => { - let Some(mesh) = assets.get(handle) else { return; }; - if track.skip_network_handle_change(handle.id()) { + AssetEvent::Added { id } | AssetEvent::Modified { id } => { + let Some(mesh) = assets.get(*id) else { + return; + }; + let AssetId::Index { + index: id, + marker: _, + } = id + else { + return; + }; + if track.skip_network_handle_change(*id) { return; } client.send_message( DefaultChannel::ReliableOrdered, bincode::serialize(&Message::MeshUpdated { - id: handle.id(), + id: *id, mesh: mesh_to_bin(mesh), }) .unwrap(), ); } - AssetEvent::Removed { handle: _ } => {} + AssetEvent::Removed { id: _ } => {} + _ => (), } } } diff --git a/src/lib_priv.rs b/src/lib_priv.rs index 725bc24..3c3bc77 100644 --- a/src/lib_priv.rs +++ b/src/lib_priv.rs @@ -1,12 +1,13 @@ use std::{any::TypeId, collections::VecDeque}; use bevy::{ - asset::HandleId, + asset::AssetIndex, ecs::component::ComponentId, prelude::*, reflect::{FromReflect, GetTypeRegistration, Reflect, ReflectFromReflect}, utils::{HashMap, HashSet}, }; +use bevy_renet::renet::ClientId; use crate::{ bundle_fix::BundleFixPlugin, client::ClientSyncPlugin, mesh_serde::bin_to_mesh, @@ -36,9 +37,7 @@ pub(crate) struct SyncTrackerRes { pub(crate) exclude_components: HashMap, pub(crate) changed_components: VecDeque, pushed_component_from_network: HashSet, - pushed_handles_from_network: HashSet, - material_handles: HashMap>, - mesh_handles: HashMap>, + pushed_handles_from_network: HashSet, sync_materials: bool, sync_meshes: bool, } @@ -55,7 +54,7 @@ impl SyncTrackerRes { .push_back(ComponentChange { change_id, data }); } - pub(crate) fn skip_network_handle_change(&mut self, id: HandleId) -> bool { + pub(crate) fn skip_network_handle_change(&mut self, id: AssetIndex) -> bool { if self.pushed_handles_from_network.contains(&id) { self.pushed_handles_from_network.remove(&id); return true; @@ -101,7 +100,7 @@ impl SyncTrackerRes { } pub(crate) fn apply_material_change_from_network( - id: HandleId, + id: AssetIndex, material: &[u8], world: &mut World, ) { @@ -114,27 +113,17 @@ impl SyncTrackerRes { let component_data = bin_to_compo(material, ®istry); let mut materials = world.resource_mut::>(); let mat = *component_data.downcast::().unwrap(); - let handle = materials.set(id, mat); - // need to keep a reference somewhere else the material will be destroyed right away - world - .resource_mut::() - .material_handles - .insert(id, handle); + materials.insert(id, mat); } - pub(crate) fn apply_mesh_change_from_network(id: HandleId, mesh: &[u8], world: &mut World) { + pub(crate) fn apply_mesh_change_from_network(id: AssetIndex, mesh: &[u8], world: &mut World) { world .resource_mut::() .pushed_handles_from_network .insert(id); let mut meshes = world.resource_mut::>(); let mesh = bin_to_mesh(mesh); - let handle = meshes.set(id, mesh); - // need to keep a reference somewhere else the material will be destroyed right away - world - .resource_mut::() - .mesh_handles - .insert(id, handle); + meshes.insert(id, mesh); } fn needs_to_change(previous_value: Option<&dyn Reflect>, component_data: &dyn Reflect) -> bool { @@ -222,7 +211,7 @@ fn setup_cascade_registrations NetcodeServerTransport { let socket = UdpSocket::bind((ip, port)).unwrap(); let server_addr = socket.local_addr().unwrap(); const MAX_CLIENTS: usize = 64; + let current_time = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap(); let server_config = ServerConfig { + current_time, max_clients: MAX_CLIENTS, protocol_id: PROTOCOL_ID, - public_addr: server_addr, + public_addresses: vec![server_addr], authentication: ServerAuthentication::Unsecure, }; - let current_time = SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .unwrap(); - NetcodeServerTransport::new(current_time, server_config, socket).unwrap() + NetcodeServerTransport::new(server_config, socket).unwrap() } pub(crate) fn create_client(ip: IpAddr, port: u16) -> NetcodeClientTransport { diff --git a/src/proto.rs b/src/proto.rs index 9499edd..3455baf 100644 --- a/src/proto.rs +++ b/src/proto.rs @@ -1,4 +1,4 @@ -use bevy::{asset::HandleId, prelude::Entity}; +use bevy::{asset::AssetIndex, prelude::Entity}; use serde::{Deserialize, Serialize}; type EntityId = Entity; @@ -26,11 +26,11 @@ pub(crate) enum Message { data: Vec, } = 5, StandardMaterialUpdated { - id: HandleId, + id: AssetIndex, material: Vec, } = 6, MeshUpdated { - id: HandleId, + id: AssetIndex, mesh: Vec, } = 7, } diff --git a/src/proto_serde.rs b/src/proto_serde.rs index a531eac..bb21b36 100644 --- a/src/proto_serde.rs +++ b/src/proto_serde.rs @@ -2,7 +2,7 @@ use std::any::type_name; use bevy::reflect::{ serde::{ReflectSerializer, UntypedReflectDeserializer}, - DynamicStruct, Reflect, ReflectFromReflect, TypeRegistryInternal, + DynamicStruct, Reflect, ReflectFromReflect, TypeRegistry, }; use bincode::{DefaultOptions, Options}; @@ -12,7 +12,7 @@ use serde::{ Deserializer, Serialize, }; -pub(crate) fn compo_to_bin(compo: Box, registry: &TypeRegistryInternal) -> Vec { +pub(crate) fn compo_to_bin(compo: Box, registry: &TypeRegistry) -> Vec { let serializer = ComponentData { data: compo.clone_value(), registry, @@ -20,7 +20,7 @@ pub(crate) fn compo_to_bin(compo: Box, registry: &TypeRegistryInter bincode::serialize(&serializer).unwrap() } -pub(crate) fn bin_to_compo(data: &[u8], registry: &TypeRegistryInternal) -> Box { +pub(crate) fn bin_to_compo(data: &[u8], registry: &TypeRegistry) -> Box { let binoptions = DefaultOptions::new() .with_fixint_encoding() .allow_trailing_bytes(); @@ -40,7 +40,7 @@ pub(crate) fn bin_to_compo(data: &[u8], registry: &TypeRegistryInternal) -> Box< struct ComponentData<'a> { data: Box, - registry: &'a TypeRegistryInternal, + registry: &'a TypeRegistry, } impl<'a> Serialize for ComponentData<'a> { @@ -58,7 +58,7 @@ impl<'a> Serialize for ComponentData<'a> { } struct ComponentDataDeserializer<'a> { - registry: &'a TypeRegistryInternal, + registry: &'a TypeRegistry, } impl<'a: 'de, 'de: 'a> DeserializeSeed<'de> for ComponentDataDeserializer<'a> { @@ -88,7 +88,7 @@ impl<'a: 'de, 'de> Visitor<'de> for ComponentDataDeserializer<'a> { mod test { use bevy::{ prelude::*, - reflect::{GetTypeRegistration, Reflect, ReflectFromReflect, TypeRegistryInternal}, + reflect::{GetTypeRegistration, Reflect, ReflectFromReflect, TypeRegistry}, }; use serde::{Deserialize, Serialize}; @@ -104,7 +104,7 @@ mod test { where T: Reflect + GetTypeRegistration + PartialEq + std::fmt::Debug, { - let mut registry = TypeRegistryInternal::default(); + let mut registry = TypeRegistry::default(); registry.register::(); let data = compo_to_bin(compo_orig.clone_value(), ®istry); @@ -127,7 +127,7 @@ mod test { fn compo_data_serde_bevy_native_component() { let compo_orig = Transform::default(); - let mut registry = TypeRegistryInternal::default(); + let mut registry = TypeRegistry::default(); registry.register::(); registry.register::(); registry.register::(); diff --git a/src/server/initial_sync.rs b/src/server/initial_sync.rs index 50a5cc3..4a6c3c2 100644 --- a/src/server/initial_sync.rs +++ b/src/server/initial_sync.rs @@ -1,12 +1,12 @@ use bevy::{prelude::*, utils::HashSet}; -use bevy_renet::renet::{DefaultChannel, RenetServer}; +use bevy_renet::renet::{ClientId, DefaultChannel, RenetServer}; use crate::{ lib_priv::SyncTrackerRes, mesh_serde::mesh_to_bin, proto::Message, proto_serde::compo_to_bin, SyncDown, }; -pub(crate) fn send_initial_sync(client_id: u64, world: &mut World) { +pub(crate) fn send_initial_sync(client_id: ClientId, world: &mut World) { info!("Sending initial sync to client id: {}", client_id); // exclusive access to world while looping through all objects, this can be blocking/freezing for the server let mut initial_sync = build_initial_sync(world); @@ -93,7 +93,9 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { for arch_entity in arch.entities() { let entity = world.entity(arch_entity.entity()); let e_id = entity.id(); - let Some(parent) = entity.get::() else {continue}; + let Some(parent) = entity.get::() else { + continue; + }; result.push(Message::EntityParented { server_entity_id: e_id, server_parent_id: parent.get(), @@ -105,20 +107,32 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { if track.sync_materials_enabled() { let materials = world.resource::>(); for (id, material) in materials.iter() { - result.push(Message::StandardMaterialUpdated { - id, - material: compo_to_bin(material.clone_value(), ®istry), - }); + match id { + AssetId::Index { + index: id, + marker: _, + } => result.push(Message::StandardMaterialUpdated { + id, + material: compo_to_bin(material.clone_value(), ®istry), + }), + _ => (), + } } } if track.sync_materials_enabled() { let meshes = world.resource::>(); for (id, mesh) in meshes.iter() { - result.push(Message::MeshUpdated { - id, - mesh: mesh_to_bin(mesh), - }); + match id { + AssetId::Index { + index: id, + marker: _, + } => result.push(Message::MeshUpdated { + id, + mesh: mesh_to_bin(mesh), + }), + _ => (), + } } } diff --git a/src/server/mod.rs b/src/server/mod.rs index aadd1fe..045e34a 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -69,12 +69,12 @@ impl Plugin for ServerSyncPlugin { } fn client_connected(mut cmd: Commands, mut server_events: EventReader) { - for event in server_events.iter() { + for event in server_events.read() { match event { ServerEvent::ClientConnected { client_id } => { + let client_id = client_id.clone(); info!("Client connected with client id: {}", client_id); - let c_id = *client_id; - cmd.add(move |world: &mut World| send_initial_sync(c_id, world)); + cmd.add(move |world: &mut World| send_initial_sync(client_id, world)); } ServerEvent::ClientDisconnected { client_id, reason } => { info!( diff --git a/src/server/receiver.rs b/src/server/receiver.rs index 5d6663c..411b572 100644 --- a/src/server/receiver.rs +++ b/src/server/receiver.rs @@ -1,3 +1,5 @@ +use bevy_renet::renet::ClientId; + use super::*; pub(crate) fn poll_for_messages( @@ -25,7 +27,7 @@ fn receive_as_server( } fn server_received_a_message( - client_id: u64, + client_id: ClientId, msg: Message, track: &mut ResMut, cmd: &mut Commands, @@ -51,7 +53,9 @@ fn server_received_a_message( server_parent_id: p_id, } => { cmd.add(move |world: &mut World| { - let Some(mut entity) = world.get_entity_mut(e_id) else {return}; + let Some(mut entity) = world.get_entity_mut(e_id) else { + return; + }; let opt_parent = entity.get::(); if opt_parent.is_none() || opt_parent.unwrap().get() != p_id { entity.set_parent(p_id); @@ -83,9 +87,10 @@ fn server_received_a_message( client_entity_id: _, } => {} Message::ComponentUpdated { id, name, data } => { - let Some(&e_id) = track.server_to_client_entities.get(&id) else {return}; - let mut entity = cmd.entity(e_id); - entity.add(move |_: Entity, world: &mut World| { + let Some(&e_id) = track.server_to_client_entities.get(&id) else { + return; + }; + cmd.add(move |world: &mut World| { let changed = SyncTrackerRes::apply_component_change_from_network( e_id, name.clone(), @@ -123,7 +128,11 @@ fn server_received_a_message( } } -fn repeat_except_for_client(msg_client_id: u64, server: &mut RenetServer, msg: &Message) { +fn repeat_except_for_client( + msg_client_id: bevy_renet::renet::ClientId, + server: &mut RenetServer, + msg: &Message, +) { for client_id in server.clients_id().into_iter() { if client_id == msg_client_id { continue; diff --git a/src/server/track.rs b/src/server/track.rs index e752fca..3adc2ab 100644 --- a/src/server/track.rs +++ b/src/server/track.rs @@ -160,11 +160,20 @@ pub(crate) fn react_on_changed_materials( mut events: EventReader>, ) { let registry = registry.read(); - for event in &mut events { + for event in &mut events.read() { match event { - AssetEvent::Created { handle } | AssetEvent::Modified { handle } => { - let Some(material) = materials.get(handle) else { return; }; - if track.skip_network_handle_change(handle.id()) { + AssetEvent::Added { id } | AssetEvent::Modified { id } => { + let Some(material) = materials.get(*id) else { + return; + }; + let AssetId::Index { + index: id, + marker: _, + } = id + else { + return; + }; + if track.skip_network_handle_change(*id) { return; } for cid in server.clients_id().into_iter() { @@ -172,14 +181,15 @@ pub(crate) fn react_on_changed_materials( cid, DefaultChannel::ReliableOrdered, bincode::serialize(&Message::StandardMaterialUpdated { - id: handle.id(), + id: *id, material: compo_to_bin(material.clone_value(), ®istry), }) .unwrap(), ); } } - AssetEvent::Removed { handle: _ } => {} + AssetEvent::Removed { id: _ } => {} + _ => (), } } } @@ -190,11 +200,20 @@ pub(crate) fn react_on_changed_meshes( assets: Res>, mut events: EventReader>, ) { - for event in &mut events { + for event in &mut events.read() { match event { - AssetEvent::Created { handle } | AssetEvent::Modified { handle } => { - let Some(mesh) = assets.get(handle) else { return; }; - if track.skip_network_handle_change(handle.id()) { + AssetEvent::Added { id } | AssetEvent::Modified { id } => { + let Some(mesh) = assets.get(*id) else { + return; + }; + let AssetId::Index { + index: id, + marker: _, + } = id + else { + return; + }; + if track.skip_network_handle_change(*id) { return; } for cid in server.clients_id().into_iter() { @@ -202,14 +221,15 @@ pub(crate) fn react_on_changed_meshes( cid, DefaultChannel::ReliableOrdered, bincode::serialize(&Message::MeshUpdated { - id: handle.id(), + id: *id, mesh: mesh_to_bin(mesh), }) .unwrap(), ); } } - AssetEvent::Removed { handle: _ } => {} + AssetEvent::Removed { id: _ } => {} + _ => (), } } } diff --git a/tests/assert/mod.rs b/tests/assert/mod.rs index b8d3049..90e2867 100644 --- a/tests/assert/mod.rs +++ b/tests/assert/mod.rs @@ -1,4 +1,4 @@ -use bevy::{asset::HandleId, prelude::*}; +use bevy::{asset::AssetIndex, prelude::*}; use bevy_renet::renet::{DefaultChannel, RenetClient, RenetServer}; use bevy_sync::{SyncDown, SyncUp}; @@ -89,18 +89,16 @@ pub(crate) fn get_first_entity_component(app: &mut App) -> Option< } #[allow(dead_code)] -pub(crate) fn material_has_color(app: &mut App, id: HandleId, color: Color) { +pub(crate) fn material_has_color(app: &mut App, id: AssetId, color: Color) { let materials = app.world.resource_mut::>(); - let handle = materials.get_handle(id); - let material = materials.get(&handle).unwrap(); + let material = materials.get(id).unwrap(); assert_eq!(material.base_color, color); } #[allow(dead_code)] -pub(crate) fn assets_has_mesh(app: &mut App, id: HandleId) { +pub(crate) fn assets_has_mesh(app: &mut App, id: AssetId) { let meshes = app.world.resource_mut::>(); - let handle = meshes.get_handle(id); - let _ = meshes.get(&handle).unwrap(); + let _ = meshes.get(id).unwrap(); } #[allow(dead_code)] diff --git a/tests/component_sync.rs b/tests/component_sync.rs index 8400083..ff7583f 100644 --- a/tests/component_sync.rs +++ b/tests/component_sync.rs @@ -233,7 +233,7 @@ fn test_auto_spawn_for_computed_visibility() { }, |env, _, _| { let _ = get_first_entity_component::(&mut env.clients[0]).unwrap(); - let _ = get_first_entity_component::(&mut env.clients[0]).unwrap(); + let _ = get_first_entity_component::(&mut env.clients[0]).unwrap(); }, ); } diff --git a/tests/initial_sync.rs b/tests/initial_sync.rs index 6682783..c364b59 100644 --- a/tests/initial_sync.rs +++ b/tests/initial_sync.rs @@ -3,7 +3,6 @@ mod setup; use assert::{assets_has_mesh, material_has_color}; use bevy::{ - asset::HandleId, prelude::*, render::{mesh::Indices, render_resource::PrimitiveTopology}, }; @@ -45,7 +44,7 @@ fn test_initial_world_sync_sent_from_server() { (1, id, m_id) }, TestRun::no_setup, - |env, (entity_count, id, m_id): (u32, HandleId, HandleId), _| { + |env, (entity_count, id, m_id): (u32, AssetId, AssetId), _| { assert::initial_sync_for_client_happened( &mut env.server, &mut env.clients[0], @@ -91,7 +90,9 @@ fn test_init_sync_multiple_clients() { (1, id, m_id) }, TestRun::no_setup, - |env: &mut TestEnv, (entity_count, id, m_id): (u32, HandleId, HandleId), _| { + |env: &mut TestEnv, + (entity_count, id, m_id): (u32, AssetId, AssetId), + _| { for capp in &mut env.clients { assert::initial_sync_for_client_happened(&mut env.server, capp, entity_count); material_has_color(capp, id, Color::RED); diff --git a/tests/setup/mod.rs b/tests/setup/mod.rs index 6325739..69a56ba 100644 --- a/tests/setup/mod.rs +++ b/tests/setup/mod.rs @@ -149,8 +149,8 @@ fn create_client() -> Result> { fn add_plugins(app: &mut App) { app.add_plugins(MinimalPlugins); app.add_plugins(AssetPlugin::default()); - app.add_asset::().add_debug_asset::(); - app.add_asset::().add_debug_asset::(); + app.init_asset::(); + app.init_asset::(); app.add_plugins(PbrPlugin::default()); app.add_plugins(SyncPlugin); From 0a3136d86726d7f3090d24bf325b3c0498cf7c4c Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Mon, 9 Oct 2023 16:54:35 +0200 Subject: [PATCH 02/26] minory clippy --- src/server/initial_sync.rs | 28 ++++++++++++++-------------- src/server/mod.rs | 2 +- tests/assert/mod.rs | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/server/initial_sync.rs b/src/server/initial_sync.rs index 4a6c3c2..da507c9 100644 --- a/src/server/initial_sync.rs +++ b/src/server/initial_sync.rs @@ -107,15 +107,15 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { if track.sync_materials_enabled() { let materials = world.resource::>(); for (id, material) in materials.iter() { - match id { - AssetId::Index { - index: id, - marker: _, - } => result.push(Message::StandardMaterialUpdated { + if let AssetId::Index { + index: id, + marker: _, + } = id + { + result.push(Message::StandardMaterialUpdated { id, material: compo_to_bin(material.clone_value(), ®istry), - }), - _ => (), + }) } } } @@ -123,15 +123,15 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { if track.sync_materials_enabled() { let meshes = world.resource::>(); for (id, mesh) in meshes.iter() { - match id { - AssetId::Index { - index: id, - marker: _, - } => result.push(Message::MeshUpdated { + if let AssetId::Index { + index: id, + marker: _, + } = id + { + result.push(Message::MeshUpdated { id, mesh: mesh_to_bin(mesh), - }), - _ => (), + }) } } } diff --git a/src/server/mod.rs b/src/server/mod.rs index 045e34a..db55cff 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -72,7 +72,7 @@ fn client_connected(mut cmd: Commands, mut server_events: EventReader { - let client_id = client_id.clone(); + let client_id = *client_id; info!("Client connected with client id: {}", client_id); cmd.add(move |world: &mut World| send_initial_sync(client_id, world)); } diff --git a/tests/assert/mod.rs b/tests/assert/mod.rs index 90e2867..01f9914 100644 --- a/tests/assert/mod.rs +++ b/tests/assert/mod.rs @@ -1,4 +1,4 @@ -use bevy::{asset::AssetIndex, prelude::*}; +use bevy::prelude::*; use bevy_renet::renet::{DefaultChannel, RenetClient, RenetServer}; use bevy_sync::{SyncDown, SyncUp}; From 42bfd05e13fdf1d7a013c4a62fed9e6501ecbd2f Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Mon, 9 Oct 2023 23:28:17 +0200 Subject: [PATCH 03/26] wrap both asset id cases --- src/client/track.rs | 29 ++++++++++------------------- src/lib_priv.rs | 25 +++++++++++++++---------- src/proto.rs | 26 +++++++++++++++++++++++--- src/server/initial_sync.rs | 35 ++++++++++++++--------------------- src/server/receiver.rs | 9 ++++++--- src/server/track.rs | 26 +++++++------------------- 6 files changed, 75 insertions(+), 75 deletions(-) diff --git a/src/client/track.rs b/src/client/track.rs index cc2fcbc..22269d5 100644 --- a/src/client/track.rs +++ b/src/client/track.rs @@ -2,7 +2,10 @@ use bevy::{prelude::*, utils::HashSet}; use bevy_renet::renet::{DefaultChannel, RenetClient}; use crate::{ - lib_priv::SyncTrackerRes, mesh_serde::mesh_to_bin, proto::Message, proto_serde::compo_to_bin, + lib_priv::SyncTrackerRes, + mesh_serde::mesh_to_bin, + proto::{AssId, Message}, + proto_serde::compo_to_bin, SyncMark, SyncUp, }; @@ -110,20 +113,14 @@ pub(crate) fn react_on_changed_materials( let Some(material) = materials.get(*id) else { return; }; - let AssetId::Index { - index: id, - marker: _, - } = id - else { - return; - }; - if track.skip_network_handle_change(*id) { + let id: AssId = (*id).into(); + if track.skip_network_handle_change(id.clone()) { return; } client.send_message( DefaultChannel::ReliableOrdered, bincode::serialize(&Message::StandardMaterialUpdated { - id: *id, + id: id.clone(), material: compo_to_bin(material.clone_value(), ®istry), }) .unwrap(), @@ -147,20 +144,14 @@ pub(crate) fn react_on_changed_meshes( let Some(mesh) = assets.get(*id) else { return; }; - let AssetId::Index { - index: id, - marker: _, - } = id - else { - return; - }; - if track.skip_network_handle_change(*id) { + let id: AssId = (*id).into(); + if track.skip_network_handle_change(id.clone()) { return; } client.send_message( DefaultChannel::ReliableOrdered, bincode::serialize(&Message::MeshUpdated { - id: *id, + id: id.clone(), mesh: mesh_to_bin(mesh), }) .unwrap(), diff --git a/src/lib_priv.rs b/src/lib_priv.rs index 3c3bc77..b96b5d8 100644 --- a/src/lib_priv.rs +++ b/src/lib_priv.rs @@ -1,7 +1,6 @@ use std::{any::TypeId, collections::VecDeque}; use bevy::{ - asset::AssetIndex, ecs::component::ComponentId, prelude::*, reflect::{FromReflect, GetTypeRegistration, Reflect, ReflectFromReflect}, @@ -10,7 +9,7 @@ use bevy::{ use bevy_renet::renet::ClientId; use crate::{ - bundle_fix::BundleFixPlugin, client::ClientSyncPlugin, mesh_serde::bin_to_mesh, + bundle_fix::BundleFixPlugin, client::ClientSyncPlugin, mesh_serde::bin_to_mesh, proto::AssId, proto_serde::bin_to_compo, server::ServerSyncPlugin, ClientPlugin, ServerPlugin, SyncComponent, SyncDown, SyncExclude, SyncMark, SyncPlugin, SyncUp, }; @@ -37,7 +36,7 @@ pub(crate) struct SyncTrackerRes { pub(crate) exclude_components: HashMap, pub(crate) changed_components: VecDeque, pushed_component_from_network: HashSet, - pushed_handles_from_network: HashSet, + pushed_handles_from_network: HashSet, sync_materials: bool, sync_meshes: bool, } @@ -54,7 +53,7 @@ impl SyncTrackerRes { .push_back(ComponentChange { change_id, data }); } - pub(crate) fn skip_network_handle_change(&mut self, id: AssetIndex) -> bool { + pub(crate) fn skip_network_handle_change(&mut self, id: AssId) -> bool { if self.pushed_handles_from_network.contains(&id) { self.pushed_handles_from_network.remove(&id); return true; @@ -100,30 +99,36 @@ impl SyncTrackerRes { } pub(crate) fn apply_material_change_from_network( - id: AssetIndex, + id: AssId, material: &[u8], world: &mut World, ) { world .resource_mut::() .pushed_handles_from_network - .insert(id); + .insert(id.clone()); let registry = world.resource::().clone(); let registry = registry.read(); let component_data = bin_to_compo(material, ®istry); let mut materials = world.resource_mut::>(); let mat = *component_data.downcast::().unwrap(); - materials.insert(id, mat); + match id { + AssId::Index { id } => materials.insert(id, mat), + AssId::Uuid { id } => materials.insert(id, mat), + } } - pub(crate) fn apply_mesh_change_from_network(id: AssetIndex, mesh: &[u8], world: &mut World) { + pub(crate) fn apply_mesh_change_from_network(id: AssId, mesh: &[u8], world: &mut World) { world .resource_mut::() .pushed_handles_from_network - .insert(id); + .insert(id.clone()); let mut meshes = world.resource_mut::>(); let mesh = bin_to_mesh(mesh); - meshes.insert(id, mesh); + match id { + AssId::Index { id } => meshes.insert(id, mesh), + AssId::Uuid { id } => meshes.insert(id, mesh), + } } fn needs_to_change(previous_value: Option<&dyn Reflect>, component_data: &dyn Reflect) -> bool { diff --git a/src/proto.rs b/src/proto.rs index 3455baf..77dd8df 100644 --- a/src/proto.rs +++ b/src/proto.rs @@ -1,4 +1,8 @@ -use bevy::{asset::AssetIndex, prelude::Entity}; +use bevy::{ + asset::AssetIndex, + prelude::{Asset, AssetId, Entity}, + utils::Uuid, +}; use serde::{Deserialize, Serialize}; type EntityId = Entity; @@ -26,11 +30,27 @@ pub(crate) enum Message { data: Vec, } = 5, StandardMaterialUpdated { - id: AssetIndex, + id: AssId, material: Vec, } = 6, MeshUpdated { - id: AssetIndex, + id: AssId, mesh: Vec, } = 7, } + +#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] +#[repr(u8)] +pub(crate) enum AssId { + Index { id: AssetIndex }, + Uuid { id: Uuid }, +} + +impl From> for AssId { + fn from(value: AssetId) -> Self { + match value { + AssetId::Index { index, marker: _ } => AssId::Index { id: index }, + AssetId::Uuid { uuid } => AssId::Uuid { id: uuid }, + } + } +} diff --git a/src/server/initial_sync.rs b/src/server/initial_sync.rs index da507c9..fd8d2a1 100644 --- a/src/server/initial_sync.rs +++ b/src/server/initial_sync.rs @@ -2,7 +2,10 @@ use bevy::{prelude::*, utils::HashSet}; use bevy_renet::renet::{ClientId, DefaultChannel, RenetServer}; use crate::{ - lib_priv::SyncTrackerRes, mesh_serde::mesh_to_bin, proto::Message, proto_serde::compo_to_bin, + lib_priv::SyncTrackerRes, + mesh_serde::mesh_to_bin, + proto::{AssId, Message}, + proto_serde::compo_to_bin, SyncDown, }; @@ -107,32 +110,22 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { if track.sync_materials_enabled() { let materials = world.resource::>(); for (id, material) in materials.iter() { - if let AssetId::Index { - index: id, - marker: _, - } = id - { - result.push(Message::StandardMaterialUpdated { - id, - material: compo_to_bin(material.clone_value(), ®istry), - }) - } + let id: AssId = id.into(); + result.push(Message::StandardMaterialUpdated { + id, + material: compo_to_bin(material.clone_value(), ®istry), + }); } } if track.sync_materials_enabled() { let meshes = world.resource::>(); for (id, mesh) in meshes.iter() { - if let AssetId::Index { - index: id, - marker: _, - } = id - { - result.push(Message::MeshUpdated { - id, - mesh: mesh_to_bin(mesh), - }) - } + let id: AssId = id.into(); + result.push(Message::MeshUpdated { + id, + mesh: mesh_to_bin(mesh), + }); } } diff --git a/src/server/receiver.rs b/src/server/receiver.rs index 411b572..7c0fb4d 100644 --- a/src/server/receiver.rs +++ b/src/server/receiver.rs @@ -108,16 +108,19 @@ fn server_received_a_message( }); } Message::StandardMaterialUpdated { id, material } => cmd.add(move |world: &mut World| { - SyncTrackerRes::apply_material_change_from_network(id, &material, world); + SyncTrackerRes::apply_material_change_from_network(id.clone(), &material, world); repeat_except_for_client( client_id, &mut world.resource_mut::(), - &Message::StandardMaterialUpdated { id, material }, + &Message::StandardMaterialUpdated { + id: id.clone(), + material, + }, ); }), Message::MeshUpdated { id, mesh } => cmd.add(move |world: &mut World| { - SyncTrackerRes::apply_mesh_change_from_network(id, &mesh, world); + SyncTrackerRes::apply_mesh_change_from_network(id.clone(), &mesh, world); repeat_except_for_client( client_id, diff --git a/src/server/track.rs b/src/server/track.rs index 3adc2ab..0377ea8 100644 --- a/src/server/track.rs +++ b/src/server/track.rs @@ -4,7 +4,7 @@ use bevy_renet::renet::{DefaultChannel, RenetServer}; use crate::{ lib_priv::{SyncClientGeneratedEntity, SyncTrackerRes}, mesh_serde::mesh_to_bin, - proto::Message, + proto::{AssId, Message}, proto_serde::compo_to_bin, SyncDown, SyncMark, }; @@ -166,14 +166,8 @@ pub(crate) fn react_on_changed_materials( let Some(material) = materials.get(*id) else { return; }; - let AssetId::Index { - index: id, - marker: _, - } = id - else { - return; - }; - if track.skip_network_handle_change(*id) { + let id: AssId = (*id).into(); + if track.skip_network_handle_change(id.clone()) { return; } for cid in server.clients_id().into_iter() { @@ -181,7 +175,7 @@ pub(crate) fn react_on_changed_materials( cid, DefaultChannel::ReliableOrdered, bincode::serialize(&Message::StandardMaterialUpdated { - id: *id, + id: id.clone(), material: compo_to_bin(material.clone_value(), ®istry), }) .unwrap(), @@ -206,14 +200,8 @@ pub(crate) fn react_on_changed_meshes( let Some(mesh) = assets.get(*id) else { return; }; - let AssetId::Index { - index: id, - marker: _, - } = id - else { - return; - }; - if track.skip_network_handle_change(*id) { + let id: AssId = (*id).into(); + if track.skip_network_handle_change(id.clone()) { return; } for cid in server.clients_id().into_iter() { @@ -221,7 +209,7 @@ pub(crate) fn react_on_changed_meshes( cid, DefaultChannel::ReliableOrdered, bincode::serialize(&Message::MeshUpdated { - id: *id, + id: id.clone(), mesh: mesh_to_bin(mesh), }) .unwrap(), From 697e7e6761fd4edffa4cd57041d74178f4246cca Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Tue, 10 Oct 2023 16:52:30 +0200 Subject: [PATCH 04/26] only deal with uuid assets, skip the rest --- src/client/track.rs | 21 +++++------ src/lib_priv.rs | 14 +++----- src/proto.rs | 25 ++----------- src/server/initial_sync.rs | 13 +++---- src/server/receiver.rs | 9 ++--- src/server/track.rs | 18 ++++++---- tests/asset_sync.rs | 72 +++++--------------------------------- tests/initial_sync.rs | 49 ++++---------------------- tests/setup/mod.rs | 59 ++++++++++++++++++++++++++----- 9 files changed, 104 insertions(+), 176 deletions(-) diff --git a/src/client/track.rs b/src/client/track.rs index 22269d5..608e946 100644 --- a/src/client/track.rs +++ b/src/client/track.rs @@ -2,10 +2,7 @@ use bevy::{prelude::*, utils::HashSet}; use bevy_renet::renet::{DefaultChannel, RenetClient}; use crate::{ - lib_priv::SyncTrackerRes, - mesh_serde::mesh_to_bin, - proto::{AssId, Message}, - proto_serde::compo_to_bin, + lib_priv::SyncTrackerRes, mesh_serde::mesh_to_bin, proto::Message, proto_serde::compo_to_bin, SyncMark, SyncUp, }; @@ -113,14 +110,16 @@ pub(crate) fn react_on_changed_materials( let Some(material) = materials.get(*id) else { return; }; - let id: AssId = (*id).into(); - if track.skip_network_handle_change(id.clone()) { + let AssetId::Uuid { uuid: id } = id else { + return; + }; + if track.skip_network_handle_change(*id) { return; } client.send_message( DefaultChannel::ReliableOrdered, bincode::serialize(&Message::StandardMaterialUpdated { - id: id.clone(), + id: *id, material: compo_to_bin(material.clone_value(), ®istry), }) .unwrap(), @@ -144,14 +143,16 @@ pub(crate) fn react_on_changed_meshes( let Some(mesh) = assets.get(*id) else { return; }; - let id: AssId = (*id).into(); - if track.skip_network_handle_change(id.clone()) { + let AssetId::Uuid { uuid: id } = id else { + return; + }; + if track.skip_network_handle_change(*id) { return; } client.send_message( DefaultChannel::ReliableOrdered, bincode::serialize(&Message::MeshUpdated { - id: id.clone(), + id: *id, mesh: mesh_to_bin(mesh), }) .unwrap(), diff --git a/src/lib_priv.rs b/src/lib_priv.rs index b96b5d8..c227201 100644 --- a/src/lib_priv.rs +++ b/src/lib_priv.rs @@ -106,29 +106,23 @@ impl SyncTrackerRes { world .resource_mut::() .pushed_handles_from_network - .insert(id.clone()); + .insert(id); let registry = world.resource::().clone(); let registry = registry.read(); let component_data = bin_to_compo(material, ®istry); let mut materials = world.resource_mut::>(); let mat = *component_data.downcast::().unwrap(); - match id { - AssId::Index { id } => materials.insert(id, mat), - AssId::Uuid { id } => materials.insert(id, mat), - } + materials.insert(id, mat); } pub(crate) fn apply_mesh_change_from_network(id: AssId, mesh: &[u8], world: &mut World) { world .resource_mut::() .pushed_handles_from_network - .insert(id.clone()); + .insert(id); let mut meshes = world.resource_mut::>(); let mesh = bin_to_mesh(mesh); - match id { - AssId::Index { id } => meshes.insert(id, mesh), - AssId::Uuid { id } => meshes.insert(id, mesh), - } + meshes.insert(id, mesh); } fn needs_to_change(previous_value: Option<&dyn Reflect>, component_data: &dyn Reflect) -> bool { diff --git a/src/proto.rs b/src/proto.rs index 77dd8df..e56ee2a 100644 --- a/src/proto.rs +++ b/src/proto.rs @@ -1,11 +1,8 @@ -use bevy::{ - asset::AssetIndex, - prelude::{Asset, AssetId, Entity}, - utils::Uuid, -}; +use bevy::{prelude::Entity, utils::Uuid}; use serde::{Deserialize, Serialize}; -type EntityId = Entity; +pub type EntityId = Entity; +pub type AssId = Uuid; #[derive(Serialize, Deserialize)] #[repr(u8)] @@ -38,19 +35,3 @@ pub(crate) enum Message { mesh: Vec, } = 7, } - -#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] -#[repr(u8)] -pub(crate) enum AssId { - Index { id: AssetIndex }, - Uuid { id: Uuid }, -} - -impl From> for AssId { - fn from(value: AssetId) -> Self { - match value { - AssetId::Index { index, marker: _ } => AssId::Index { id: index }, - AssetId::Uuid { uuid } => AssId::Uuid { id: uuid }, - } - } -} diff --git a/src/server/initial_sync.rs b/src/server/initial_sync.rs index fd8d2a1..0a3fc51 100644 --- a/src/server/initial_sync.rs +++ b/src/server/initial_sync.rs @@ -2,10 +2,7 @@ use bevy::{prelude::*, utils::HashSet}; use bevy_renet::renet::{ClientId, DefaultChannel, RenetServer}; use crate::{ - lib_priv::SyncTrackerRes, - mesh_serde::mesh_to_bin, - proto::{AssId, Message}, - proto_serde::compo_to_bin, + lib_priv::SyncTrackerRes, mesh_serde::mesh_to_bin, proto::Message, proto_serde::compo_to_bin, SyncDown, }; @@ -110,7 +107,9 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { if track.sync_materials_enabled() { let materials = world.resource::>(); for (id, material) in materials.iter() { - let id: AssId = id.into(); + let AssetId::Uuid { uuid: id } = id else { + continue; + }; result.push(Message::StandardMaterialUpdated { id, material: compo_to_bin(material.clone_value(), ®istry), @@ -121,7 +120,9 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { if track.sync_materials_enabled() { let meshes = world.resource::>(); for (id, mesh) in meshes.iter() { - let id: AssId = id.into(); + let AssetId::Uuid { uuid: id } = id else { + continue; + }; result.push(Message::MeshUpdated { id, mesh: mesh_to_bin(mesh), diff --git a/src/server/receiver.rs b/src/server/receiver.rs index 7c0fb4d..411b572 100644 --- a/src/server/receiver.rs +++ b/src/server/receiver.rs @@ -108,19 +108,16 @@ fn server_received_a_message( }); } Message::StandardMaterialUpdated { id, material } => cmd.add(move |world: &mut World| { - SyncTrackerRes::apply_material_change_from_network(id.clone(), &material, world); + SyncTrackerRes::apply_material_change_from_network(id, &material, world); repeat_except_for_client( client_id, &mut world.resource_mut::(), - &Message::StandardMaterialUpdated { - id: id.clone(), - material, - }, + &Message::StandardMaterialUpdated { id, material }, ); }), Message::MeshUpdated { id, mesh } => cmd.add(move |world: &mut World| { - SyncTrackerRes::apply_mesh_change_from_network(id.clone(), &mesh, world); + SyncTrackerRes::apply_mesh_change_from_network(id, &mesh, world); repeat_except_for_client( client_id, diff --git a/src/server/track.rs b/src/server/track.rs index 0377ea8..11f885b 100644 --- a/src/server/track.rs +++ b/src/server/track.rs @@ -4,7 +4,7 @@ use bevy_renet::renet::{DefaultChannel, RenetServer}; use crate::{ lib_priv::{SyncClientGeneratedEntity, SyncTrackerRes}, mesh_serde::mesh_to_bin, - proto::{AssId, Message}, + proto::Message, proto_serde::compo_to_bin, SyncDown, SyncMark, }; @@ -166,8 +166,10 @@ pub(crate) fn react_on_changed_materials( let Some(material) = materials.get(*id) else { return; }; - let id: AssId = (*id).into(); - if track.skip_network_handle_change(id.clone()) { + let AssetId::Uuid { uuid: id } = id else { + return; + }; + if track.skip_network_handle_change(*id) { return; } for cid in server.clients_id().into_iter() { @@ -175,7 +177,7 @@ pub(crate) fn react_on_changed_materials( cid, DefaultChannel::ReliableOrdered, bincode::serialize(&Message::StandardMaterialUpdated { - id: id.clone(), + id: *id, material: compo_to_bin(material.clone_value(), ®istry), }) .unwrap(), @@ -200,8 +202,10 @@ pub(crate) fn react_on_changed_meshes( let Some(mesh) = assets.get(*id) else { return; }; - let id: AssId = (*id).into(); - if track.skip_network_handle_change(id.clone()) { + let AssetId::Uuid { uuid: id } = id else { + return; + }; + if track.skip_network_handle_change(*id) { return; } for cid in server.clients_id().into_iter() { @@ -209,7 +213,7 @@ pub(crate) fn react_on_changed_meshes( cid, DefaultChannel::ReliableOrdered, bincode::serialize(&Message::MeshUpdated { - id: id.clone(), + id: *id, mesh: mesh_to_bin(mesh), }) .unwrap(), diff --git a/tests/asset_sync.rs b/tests/asset_sync.rs index c76181e..65c5469 100644 --- a/tests/asset_sync.rs +++ b/tests/asset_sync.rs @@ -2,13 +2,10 @@ mod assert; mod setup; use assert::{assets_has_mesh, material_has_color}; -use bevy::{ - prelude::*, - render::{mesh::Indices, render_resource::PrimitiveTopology}, -}; +use bevy::prelude::*; use bevy_sync::SyncComponent; use serial_test::serial; -use setup::TestRun; +use setup::{spawn_new_material, spawn_new_mesh, TestRun}; #[test] #[serial] @@ -20,17 +17,8 @@ fn sync_material_from_server() { env.server.sync_materials(true); }, |env| { - let s = &mut env.server; - let mut materials = s.world.resource_mut::>(); - let material = materials.add(StandardMaterial { - base_color: Color::RED, - ..Default::default() - }); - - let id = material.id(); - s.world.spawn(material); - - id + let app = &mut env.server; + spawn_new_material(app) }, |env, _, id| { material_has_color(&mut env.clients[0], id, Color::RED); @@ -50,16 +38,7 @@ fn sync_material_from_client() { }, |env| { let app = &mut env.clients[0]; - let mut materials = app.world.resource_mut::>(); - let material = materials.add(StandardMaterial { - base_color: Color::RED, - ..Default::default() - }); - - let id = material.id(); - app.world.spawn(material); - - id + spawn_new_material(app) }, |env, _, id| { material_has_color(&mut env.clients[0], id, Color::RED); @@ -79,16 +58,7 @@ fn sync_material_from_client_to_client_across_server() { }, |env| { let app = &mut env.clients[0]; - let mut materials = app.world.resource_mut::>(); - let material = materials.add(StandardMaterial { - base_color: Color::RED, - ..Default::default() - }); - - let id = material.id(); - app.world.spawn(material); - - id + spawn_new_material(app) }, |env, _, id| { material_has_color(&mut env.clients[0], id, Color::RED); @@ -108,13 +78,7 @@ fn test_mesh_transferred_from_server() { }, |env| { let app = &mut env.server; - let mut meshes = app.world.resource_mut::>(); - let mesh = meshes.add(sample_mesh()); - - let id = mesh.id(); - app.world.spawn(mesh); - - id + spawn_new_mesh(app) }, |env, _, id| { assets_has_mesh(&mut env.clients[0], id); @@ -134,30 +98,10 @@ fn test_mesh_transferred_from_client() { }, |env| { let app = &mut env.clients[0]; - let mut meshes = app.world.resource_mut::>(); - let mesh = meshes.add(sample_mesh()); - - let id = mesh.id(); - app.world.spawn(mesh); - - id + spawn_new_mesh(app) }, |env, _, id| { assets_has_mesh(&mut env.server, id); }, ); } - -fn sample_mesh() -> Mesh { - let mut mesh = Mesh::new(PrimitiveTopology::TriangleList); - mesh.insert_attribute( - Mesh::ATTRIBUTE_POSITION, - vec![[0., 0., 0.], [1., 2., 1.], [2., 0., 0.]], - ); - mesh.insert_attribute(Mesh::ATTRIBUTE_NORMAL, vec![[0., 1., 0.]; 3]); - mesh.insert_attribute(Mesh::ATTRIBUTE_UV_0, vec![[0., 0.]; 3]); - mesh.insert_attribute(Mesh::ATTRIBUTE_TANGENT, vec![[0., 1., 0., 0.]; 3]); - mesh.set_indices(Some(Indices::U32(vec![0, 2, 1]))); - - mesh -} diff --git a/tests/initial_sync.rs b/tests/initial_sync.rs index c364b59..4e69bc6 100644 --- a/tests/initial_sync.rs +++ b/tests/initial_sync.rs @@ -2,13 +2,10 @@ mod assert; mod setup; use assert::{assets_has_mesh, material_has_color}; -use bevy::{ - prelude::*, - render::{mesh::Indices, render_resource::PrimitiveTopology}, -}; +use bevy::prelude::*; use bevy_sync::{SyncComponent, SyncExclude, SyncMark}; use serial_test::serial; -use setup::{MySynched, TestEnv, TestRun}; +use setup::{spawn_new_material, spawn_new_mesh, MySynched, TestEnv, TestRun}; use crate::{assert::count_entities_with_component, setup::MySynched2}; @@ -27,19 +24,9 @@ fn test_initial_world_sync_sent_from_server() { let mut e = env.server.world.entity_mut(e_id); e.insert(MySynched { value: 7 }); - let mut materials = env.server.world.resource_mut::>(); - let material = materials.add(StandardMaterial { - base_color: Color::RED, - ..Default::default() - }); - let id = material.id(); - env.server.world.spawn(material); - let mut meshes = env.server.world.resource_mut::>(); - let mesh = meshes.add(sample_mesh()); - - let m_id = mesh.id(); - env.server.world.spawn(mesh); + let id = spawn_new_material(&mut env.server); + let m_id = spawn_new_mesh(&mut env.server); (1, id, m_id) }, @@ -73,19 +60,9 @@ fn test_init_sync_multiple_clients() { let mut e = env.server.world.entity_mut(e_id); e.insert(MySynched { value: 7 }); - let mut materials = env.server.world.resource_mut::>(); - let material = materials.add(StandardMaterial { - base_color: Color::RED, - ..Default::default() - }); - let id = material.id(); - env.server.world.spawn(material); - - let mut meshes = env.server.world.resource_mut::>(); - let mesh = meshes.add(sample_mesh()); - let m_id = mesh.id(); - env.server.world.spawn(mesh); + let id = spawn_new_material(&mut env.server); + let m_id = spawn_new_mesh(&mut env.server); (1, id, m_id) }, @@ -133,20 +110,6 @@ fn test_initial_world_sync_not_transfer_excluded_components() { ); } -fn sample_mesh() -> Mesh { - let mut mesh = Mesh::new(PrimitiveTopology::TriangleList); - mesh.insert_attribute( - Mesh::ATTRIBUTE_POSITION, - vec![[0., 0., 0.], [1., 2., 1.], [2., 0., 0.]], - ); - mesh.insert_attribute(Mesh::ATTRIBUTE_NORMAL, vec![[0., 1., 0.]; 3]); - mesh.insert_attribute(Mesh::ATTRIBUTE_UV_0, vec![[0., 0.]; 3]); - mesh.insert_attribute(Mesh::ATTRIBUTE_TANGENT, vec![[0., 1., 0., 0.]; 3]); - mesh.set_indices(Some(Indices::U32(vec![0, 2, 1]))); - - mesh -} - #[test] #[serial] fn test_initial_with_parenting() { diff --git a/tests/setup/mod.rs b/tests/setup/mod.rs index 69a56ba..0bc7a5b 100644 --- a/tests/setup/mod.rs +++ b/tests/setup/mod.rs @@ -8,7 +8,9 @@ use bevy::{ pbr::PbrPlugin, prelude::*, reflect::{FromReflect, GetTypeRegistration, Reflect}, + render::{mesh::Indices, render_resource::PrimitiveTopology}, transform::TransformBundle, + utils::Uuid, MinimalPlugins, }; use bevy_renet::renet::RenetClient; @@ -95,16 +97,16 @@ impl TestRun { #[allow(dead_code)] pub(crate) fn no_setup(_: &mut TestEnv) {} - pub(crate) fn run( + pub(crate) fn run( &self, client_count: u32, - mut pre_setup: F0, - mut setup: F1, + mut pre_connect: F0, + mut post_connect: F1, mut assertion: F2, ) where - F0: FnMut(&mut TestEnv) -> T1, - F1: FnMut(&mut TestEnv) -> T2, - F2: FnMut(&mut TestEnv, T1, T2), + F0: FnMut(&mut TestEnv) -> T0, + F1: FnMut(&mut TestEnv) -> T1, + F2: FnMut(&mut TestEnv, T0, T1), { let mut test_run = TestEnv { server: create_server().unwrap(), @@ -114,11 +116,11 @@ impl TestRun { test_run.clients.push(create_client().unwrap()); } - let x = pre_setup(&mut test_run); + let x = pre_connect(&mut test_run); connect_envs(self, &mut test_run.server, &mut test_run.clients).unwrap(); - let y = setup(&mut test_run); + let y = post_connect(&mut test_run); let mut count = 0; while count < self.updates_per_run { @@ -194,3 +196,44 @@ fn wait_until_connected( Err(TestError("Client did not connect.".into()).into()) } + +pub(crate) fn spawn_new_material(app: &mut App) -> AssetId { + let mut materials = app.world.resource_mut::>(); + let id = Uuid::new_v4(); + let material = StandardMaterial { + base_color: Color::RED, + ..Default::default() + }; + let handle = Handle::::Weak(id.into()); + materials.insert(id, material); + + app.world.spawn(handle); + + id.into() +} + +pub(crate) fn spawn_new_mesh(app: &mut App) -> AssetId { + let mut meshes = app.world.resource_mut::>(); + let id = Uuid::new_v4(); + let mesh = sample_mesh(); + let handle = Handle::::Weak(id.into()); + meshes.insert(id, mesh); + + app.world.spawn(handle); + + id.into() +} + +pub(crate) fn sample_mesh() -> Mesh { + let mut mesh = Mesh::new(PrimitiveTopology::TriangleList); + mesh.insert_attribute( + Mesh::ATTRIBUTE_POSITION, + vec![[0., 0., 0.], [1., 2., 1.], [2., 0., 0.]], + ); + mesh.insert_attribute(Mesh::ATTRIBUTE_NORMAL, vec![[0., 1., 0.]; 3]); + mesh.insert_attribute(Mesh::ATTRIBUTE_UV_0, vec![[0., 0.]; 3]); + mesh.insert_attribute(Mesh::ATTRIBUTE_TANGENT, vec![[0., 1., 0., 0.]; 3]); + mesh.set_indices(Some(Indices::U32(vec![0, 2, 1]))); + + mesh +} From cb39499dec91d7ce8cf0831b6d4b69126e3d19da Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Tue, 10 Oct 2023 16:55:04 +0200 Subject: [PATCH 05/26] circumnvent a cargo bug --- tests/setup/mod.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/setup/mod.rs b/tests/setup/mod.rs index 0bc7a5b..b371548 100644 --- a/tests/setup/mod.rs +++ b/tests/setup/mod.rs @@ -197,6 +197,7 @@ fn wait_until_connected( Err(TestError("Client did not connect.".into()).into()) } +#[allow(dead_code)] pub(crate) fn spawn_new_material(app: &mut App) -> AssetId { let mut materials = app.world.resource_mut::>(); let id = Uuid::new_v4(); @@ -212,6 +213,7 @@ pub(crate) fn spawn_new_material(app: &mut App) -> AssetId { id.into() } +#[allow(dead_code)] pub(crate) fn spawn_new_mesh(app: &mut App) -> AssetId { let mut meshes = app.world.resource_mut::>(); let id = Uuid::new_v4(); @@ -224,6 +226,7 @@ pub(crate) fn spawn_new_mesh(app: &mut App) -> AssetId { id.into() } +#[allow(dead_code)] pub(crate) fn sample_mesh() -> Mesh { let mut mesh = Mesh::new(PrimitiveTopology::TriangleList); mesh.insert_attribute( From b0c7860c499ee8832dd88eefde6d82dbe2b73d11 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Tue, 10 Oct 2023 17:15:24 +0200 Subject: [PATCH 06/26] fix bug --- examples/host.rs | 8 +------- src/client/receiver.rs | 2 +- tests/parent_sync.rs | 6 ------ 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/examples/host.rs b/examples/host.rs index 6c3f018..d4db975 100644 --- a/examples/host.rs +++ b/examples/host.rs @@ -3,11 +3,7 @@ use std::{ net::{IpAddr, Ipv4Addr}, }; -use bevy::{ - pbr::wireframe::{Wireframe, WireframeConfig}, - prelude::*, - render::primitives::Aabb, -}; +use bevy::{pbr::wireframe::Wireframe, prelude::*, render::primitives::Aabb}; use bevy_sync::{ServerPlugin, SyncComponent, SyncExclude, SyncMark, SyncPlugin}; fn main() { @@ -40,11 +36,9 @@ fn main() { fn load_world( mut commands: Commands, - mut wireframe_config: ResMut, mut meshes: ResMut>, mut materials: ResMut>, ) { - wireframe_config.global = false; commands.spawn(( PbrBundle { mesh: meshes.add(shape::Plane::from_size(5.0).into()), diff --git a/src/client/receiver.rs b/src/client/receiver.rs index 7330de8..6515b48 100644 --- a/src/client/receiver.rs +++ b/src/client/receiver.rs @@ -71,7 +71,7 @@ fn client_received_a_message(msg: Message, track: &mut ResMut, c let mut entity = world.entity_mut(c_e_id); let opt_parent = entity.get::(); if opt_parent.is_none() || opt_parent.unwrap().get() != c_p_id { - entity.set_parent(p_id); + entity.set_parent(c_p_id); world.entity_mut(c_p_id).add_child(c_e_id); } }); diff --git a/tests/parent_sync.rs b/tests/parent_sync.rs index f428c54..e2f4766 100644 --- a/tests/parent_sync.rs +++ b/tests/parent_sync.rs @@ -107,9 +107,3 @@ fn test_entity_parent_is_transferred_from_client() { }, ); } - -#[test] -#[serial] -fn test_mesh_transferred_from_server_to_client() { - TestRun::default().run(1, |_| {}, |_| {}, |_, _, _| {}); -} From 76dd2da9298ebc120d2b31ffcf02efb9028ce022 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Tue, 10 Oct 2023 17:17:19 +0200 Subject: [PATCH 07/26] fix docs --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0857bc2..ca34ab1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,11 +24,11 @@ let mut app = App::new(); app.add_plugins(MinimalPlugins); // Either one of these two, if being server or client -app.add_plugin(ServerPlugin { ip: Ipv4Addr::LOCALHOST.into(), port: 5555 }); +app.add_plugins(ServerPlugin { ip: Ipv4Addr::LOCALHOST.into(), port: 5555 }); //app.add_plugin(ClientPlugin { ip: Ipv4Addr::LOCALHOST.into(), port: 5555 }); // Setup sync mechanics and which components will be synced -app.add_plugin(SyncPlugin); +app.add_plugins(SyncPlugin); app.sync_component::(); // Mark entity for sync with SyncMark component From d48728ebd5815c0c854024b89a67f3804b596e11 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Tue, 10 Oct 2023 17:18:27 +0200 Subject: [PATCH 08/26] update docs --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d2e4279..43759b8 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ Current state is in development. - [ ] Asset: Textures - [ ] Asset: Audio +**Asset are synchronized only if they are added to bevy by uuid.** + ## Examples Run both examples so the they connect to each other: From 83c06448fc76b777c8ca23baf516f97f7c368382 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Tue, 10 Oct 2023 17:19:57 +0200 Subject: [PATCH 09/26] main bevy --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 705506f..9fa5f9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ include = ["/src", "/LICENSE-MIT", "/LICENSE-APACHE"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bevy = { git = "https://github.com/awtterpip/bevy" } +bevy = { git = "https://github.com/bevyengine/bevy.git" } bevy_renet = { path = "../renet/bevy_renet" } bincode = "1.3.3" serde = { version = "1.0.160", features = ["derive"] } From fd99264810b3a6e0906c4edf2669d99549927fc9 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Wed, 11 Oct 2023 21:20:07 +0200 Subject: [PATCH 10/26] using updated renet --- src/client/track.rs | 2 +- src/lib.rs | 4 +++- src/lib_priv.rs | 10 ++++++---- src/proto_serde.rs | 6 ++++-- src/server/track.rs | 2 +- tests/setup/mod.rs | 6 ++++-- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/client/track.rs b/src/client/track.rs index 608e946..18b6fa3 100644 --- a/src/client/track.rs +++ b/src/client/track.rs @@ -82,7 +82,7 @@ pub(crate) fn react_on_changed_components( while let Some(change) = track.changed_components.pop_front() { debug!( "Component was changed on client: {}", - change.data.type_name() + change.data.reflect_type_path() ); client.send_message( DefaultChannel::ReliableOrdered, diff --git a/src/lib.rs b/src/lib.rs index ca34ab1..216955c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -106,7 +106,9 @@ pub struct SyncUp { } pub trait SyncComponent { - fn sync_component( + fn sync_component< + T: Component + TypePath + DynamicTypePath + Reflect + FromReflect + GetTypeRegistration, + >( &mut self, ) -> &mut Self; fn sync_materials(&mut self, enable: bool); diff --git a/src/lib_priv.rs b/src/lib_priv.rs index c227201..0ac7b63 100644 --- a/src/lib_priv.rs +++ b/src/lib_priv.rs @@ -3,7 +3,7 @@ use std::{any::TypeId, collections::VecDeque}; use bevy::{ ecs::component::ComponentId, prelude::*, - reflect::{FromReflect, GetTypeRegistration, Reflect, ReflectFromReflect}, + reflect::{DynamicTypePath, FromReflect, GetTypeRegistration, Reflect, ReflectFromReflect}, utils::{HashMap, HashSet}, }; use bevy_renet::renet::ClientId; @@ -43,7 +43,7 @@ pub(crate) struct SyncTrackerRes { impl SyncTrackerRes { pub(crate) fn signal_component_changed(&mut self, id: Entity, data: Box) { - let name = data.type_name().into(); + let name = data.reflect_type_path().into(); let change_id = ComponentChangeId { id, name }; if self.pushed_component_from_network.contains(&change_id) { self.pushed_component_from_network.remove(&change_id); @@ -70,7 +70,7 @@ impl SyncTrackerRes { let registry = world.resource::().clone(); let registry = registry.read(); let component_data = bin_to_compo(data, ®istry); - let registration = registry.get_with_name(name.as_str()).unwrap(); + let registration = registry.get_with_type_path(name.as_str()).unwrap(); let reflect_component = registration.data::().unwrap(); let previous_value = reflect_component.reflect(world.entity(e_id)); if SyncTrackerRes::needs_to_change(previous_value, &*component_data) { @@ -161,7 +161,9 @@ fn sync_detect_client( } impl SyncComponent for App { - fn sync_component( + fn sync_component< + T: Component + TypePath + DynamicTypePath + Reflect + FromReflect + GetTypeRegistration, + >( &mut self, ) -> &mut Self { self.register_type::(); diff --git a/src/proto_serde.rs b/src/proto_serde.rs index bb21b36..d121350 100644 --- a/src/proto_serde.rs +++ b/src/proto_serde.rs @@ -2,7 +2,7 @@ use std::any::type_name; use bevy::reflect::{ serde::{ReflectSerializer, UntypedReflectDeserializer}, - DynamicStruct, Reflect, ReflectFromReflect, TypeRegistry, + DynamicStruct, DynamicTypePath, Reflect, ReflectFromReflect, TypeRegistry, }; use bincode::{DefaultOptions, Options}; @@ -31,7 +31,9 @@ pub(crate) fn bin_to_compo(data: &[u8], registry: &TypeRegistry) -> Box().unwrap(); - let registration = registry.get_with_name(data.type_name()).unwrap(); + let registration = registry + .get_with_type_path(data.reflect_type_path()) + .unwrap(); let rfr = registry .get_type_data::(registration.type_id()) .unwrap(); diff --git a/src/server/track.rs b/src/server/track.rs index 11f885b..e262290 100644 --- a/src/server/track.rs +++ b/src/server/track.rs @@ -135,7 +135,7 @@ pub(crate) fn react_on_changed_components( while let Some(change) = track.changed_components.pop_front() { debug!( "Component was changed on server: {}", - change.data.type_name() + change.data.reflect_type_path() ); for cid in server.clients_id().into_iter() { server.send_message( diff --git a/tests/setup/mod.rs b/tests/setup/mod.rs index b371548..f3979fe 100644 --- a/tests/setup/mod.rs +++ b/tests/setup/mod.rs @@ -7,7 +7,7 @@ use std::{ use bevy::{ pbr::PbrPlugin, prelude::*, - reflect::{FromReflect, GetTypeRegistration, Reflect}, + reflect::{DynamicTypePath, FromReflect, GetTypeRegistration, Reflect}, render::{mesh::Indices, render_resource::PrimitiveTopology}, transform::TransformBundle, utils::Uuid, @@ -69,7 +69,9 @@ impl TestEnv { } #[allow(dead_code)] - pub(crate) fn setup_registration( + pub(crate) fn setup_registration< + T: Component + TypePath + DynamicTypePath + Reflect + FromReflect + GetTypeRegistration, + >( &mut self, ) { self.server.sync_component::(); From d6e16dcb1d026cd1eaa5231e3e536adf900b521f Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Fri, 13 Oct 2023 03:27:16 +0200 Subject: [PATCH 11/26] using fixed branch --- Cargo.toml | 3 +- src/client/track.rs | 2 +- src/lib_priv.rs | 71 +++++++++++++++++---------------- src/proto.rs | 2 +- src/proto_serde.rs | 8 ++-- src/server/initial_sync.rs | 81 +++++++++++++++++++++++++++----------- src/server/track.rs | 2 +- 7 files changed, 104 insertions(+), 65 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9fa5f9f..37c54e3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,8 @@ include = ["/src", "/LICENSE-MIT", "/LICENSE-APACHE"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bevy = { git = "https://github.com/bevyengine/bevy.git" } +#bevy = { git = "https://github.com/bevyengine/bevy.git" } +bevy = { git = "https://github.com/MrGVSV/bevy.git", branch = "reflect-serialize-dynamics" } bevy_renet = { path = "../renet/bevy_renet" } bincode = "1.3.3" serde = { version = "1.0.160", features = ["derive"] } diff --git a/src/client/track.rs b/src/client/track.rs index 18b6fa3..79693e7 100644 --- a/src/client/track.rs +++ b/src/client/track.rs @@ -79,7 +79,7 @@ pub(crate) fn react_on_changed_components( mut track: ResMut, ) { let registry = registry.read(); - while let Some(change) = track.changed_components.pop_front() { + while let Some(change) = track.changed_components_to_send.pop_front() { debug!( "Component was changed on client: {}", change.data.reflect_type_path() diff --git a/src/lib_priv.rs b/src/lib_priv.rs index 0ac7b63..f88783e 100644 --- a/src/lib_priv.rs +++ b/src/lib_priv.rs @@ -25,20 +25,31 @@ pub(crate) struct ComponentChange { pub(crate) data: Box, } -// Keeps mapping of server entity ids to client entity ids. -// Key: server entity id. -// Value: client entity id. -// For servers, the map contains same key & value. #[derive(Resource, Default)] pub(crate) struct SyncTrackerRes { + /// Mapping of entity ids between server and clients. key: server, value: client pub(crate) server_to_client_entities: HashMap, - pub(crate) sync_components: HashSet, - pub(crate) exclude_components: HashMap, - pub(crate) changed_components: VecDeque, - pushed_component_from_network: HashSet, - pushed_handles_from_network: HashSet, - sync_materials: bool, - sync_meshes: bool, + + pub(crate) registered_componets_for_sync: HashSet, + /// Tracks SyncExcludes for component T. key: component id of T, value: component id of SyncExcdlude + pub(crate) sync_exclude_cid_of_component_cid: HashMap, + /// Queue of component changes to be sent over network + pub(crate) changed_components_to_send: VecDeque, + /// Pushed references (component and handle) that came from network and were applied in world, + /// so that in the next detect step they will be skipped and avoid ensless loop. + pub(crate) pushed_component_from_network: HashSet, + pub(crate) pushed_handles_from_network: HashSet, + + pub(crate) sync_materials: bool, + pub(crate) sync_meshes: bool, +} + +pub(crate) fn sync_material_enabled(tracker: Res) -> bool { + tracker.sync_materials +} + +pub(crate) fn sync_mesh_enabled(tracker: Res) -> bool { + tracker.sync_meshes } impl SyncTrackerRes { @@ -49,7 +60,7 @@ impl SyncTrackerRes { self.pushed_component_from_network.remove(&change_id); return; } - self.changed_components + self.changed_components_to_send .push_back(ComponentChange { change_id, data }); } @@ -73,7 +84,7 @@ impl SyncTrackerRes { let registration = registry.get_with_type_path(name.as_str()).unwrap(); let reflect_component = registration.data::().unwrap(); let previous_value = reflect_component.reflect(world.entity(e_id)); - if SyncTrackerRes::needs_to_change(previous_value, &*component_data) { + if equals(previous_value, &*component_data) { debug!( "Changed component from network: {}v{} - {}", e_id.index(), @@ -124,20 +135,16 @@ impl SyncTrackerRes { let mesh = bin_to_mesh(mesh); meshes.insert(id, mesh); } +} - fn needs_to_change(previous_value: Option<&dyn Reflect>, component_data: &dyn Reflect) -> bool { - if previous_value.is_none() { - return true; - } - !previous_value - .unwrap() - .reflect_partial_eq(component_data) - .unwrap_or(true) - } - - pub(crate) fn sync_materials_enabled(&self) -> bool { - self.sync_materials +fn equals(previous_value: Option<&dyn Reflect>, component_data: &dyn Reflect) -> bool { + if previous_value.is_none() { + return true; } + !previous_value + .unwrap() + .reflect_partial_eq(component_data) + .unwrap_or(true) } #[allow(clippy::type_complexity)] @@ -171,8 +178,10 @@ impl SyncComponent for App { let c_id = self.world.init_component::(); let c_exclude_id = self.world.init_component::>(); let mut track = self.world.resource_mut::(); - track.sync_components.insert(c_id); - track.exclude_components.insert(c_id, c_exclude_id); + track.registered_componets_for_sync.insert(c_id); + track + .sync_exclude_cid_of_component_cid + .insert(c_id, c_exclude_id); self.add_systems(Update, sync_detect_server::); self.add_systems(Update, sync_detect_client::); @@ -237,11 +246,3 @@ impl Plugin for ClientPlugin { app.add_plugins(ClientSyncPlugin); } } - -pub(crate) fn sync_material_enabled(tracker: Res) -> bool { - tracker.sync_materials -} - -pub(crate) fn sync_mesh_enabled(tracker: Res) -> bool { - tracker.sync_meshes -} diff --git a/src/proto.rs b/src/proto.rs index e56ee2a..ca58789 100644 --- a/src/proto.rs +++ b/src/proto.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; pub type EntityId = Entity; pub type AssId = Uuid; -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Debug)] #[repr(u8)] pub(crate) enum Message { EntitySpawn { diff --git a/src/proto_serde.rs b/src/proto_serde.rs index d121350..0991838 100644 --- a/src/proto_serde.rs +++ b/src/proto_serde.rs @@ -31,9 +31,8 @@ pub(crate) fn bin_to_compo(data: &[u8], registry: &TypeRegistry) -> Box().unwrap(); - let registration = registry - .get_with_type_path(data.reflect_type_path()) - .unwrap(); + let type_path = data.reflect_type_path(); + let registration = registry.get_with_type_path(type_path).unwrap(); let rfr = registry .get_type_data::(registration.type_id()) .unwrap(); @@ -90,7 +89,7 @@ impl<'a: 'de, 'de> Visitor<'de> for ComponentDataDeserializer<'a> { mod test { use bevy::{ prelude::*, - reflect::{GetTypeRegistration, Reflect, ReflectFromReflect, TypeRegistry}, + reflect::{DynamicStruct, GetTypeRegistration, Reflect, ReflectFromReflect, TypeRegistry}, }; use serde::{Deserialize, Serialize}; @@ -108,6 +107,7 @@ mod test { { let mut registry = TypeRegistry::default(); registry.register::(); + registry.register::(); let data = compo_to_bin(compo_orig.clone_value(), ®istry); diff --git a/src/server/initial_sync.rs b/src/server/initial_sync.rs index 0a3fc51..d8abd86 100644 --- a/src/server/initial_sync.rs +++ b/src/server/initial_sync.rs @@ -1,3 +1,5 @@ +use std::error::Error; + use bevy::{prelude::*, utils::HashSet}; use bevy_renet::renet::{ClientId, DefaultChannel, RenetServer}; @@ -7,29 +9,46 @@ use crate::{ }; pub(crate) fn send_initial_sync(client_id: ClientId, world: &mut World) { - info!("Sending initial sync to client id: {}", client_id); + info!("Sending initial sync to client id {}", client_id); // exclusive access to world while looping through all objects, this can be blocking/freezing for the server - let mut initial_sync = build_initial_sync(world); + let mut initial_sync = match build_initial_sync(world) { + Ok(initial_sync) => initial_sync, + Err(err) => { + warn!( + "Failed initial sync to client id {} because {}", + client_id, err + ); + return; + } + }; let mut server = world.resource_mut::(); debug!("Initial sync size: {}", initial_sync.len()); for msg in initial_sync.drain(..) { - let msg_bin = bincode::serialize(&msg).unwrap(); + let Ok(msg_bin) = bincode::serialize(&msg) else { + warn!("Could not deserialize {:?}", msg); + continue; + }; server.send_message(client_id, DefaultChannel::ReliableOrdered, msg_bin); } } -pub(crate) fn build_initial_sync(world: &World) -> Vec { - let mut entity_ids_sent: HashSet = HashSet::new(); +fn build_initial_sync(world: &World) -> Result, Box> { let mut result: Vec = Vec::new(); + check_entity_components(world, &mut result)?; + check_parents(world, &mut result)?; + check_materials(world, &mut result)?; + check_meshes(world, &mut result)?; + Ok(result) +} + +fn check_entity_components(world: &World, result: &mut Vec) -> Result<(), Box> { + let mut entity_ids_sent: HashSet = HashSet::new(); let track = world.resource::(); let registry = world.resource::(); let registry = registry.read(); let sync_down_id = world .component_id::() - .expect("SyncDown is not registered"); - let parent_component_id = world - .component_id::() - .expect("Parent is not registered"); + .ok_or("SyncDown is not registered")?; for arch in world .archetypes() .iter() @@ -46,30 +65,30 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { for c_id in arch .components() - .filter(|&c_id| track.sync_components.contains(&c_id)) + .filter(|&c_id| track.registered_componets_for_sync.contains(&c_id)) { let c_exclude_id = track - .exclude_components + .sync_exclude_cid_of_component_cid .get(&c_id) - .expect("Sync component not setup correctly, missing SyncExclude"); + .ok_or("Sync component not setup correctly, missing SyncExclude")?; if arch.contains(*c_exclude_id) { continue; } let c_info = world .components() .get_info(c_id) - .expect("component not found"); + .ok_or("component not found")?; let type_name = c_info.name(); let registration = registry - .get(c_info.type_id().expect("not registered")) - .expect("not registered"); + .get(c_info.type_id().ok_or("not registered")?) + .ok_or("not registered")?; let reflect_component = registration .data::() - .expect("missing #[reflect(Component)]"); + .ok_or("missing #[reflect(Component)]")?; for arch_entity in arch.entities() { let entity = world.entity(arch_entity.entity()); let e_id = entity.id(); - let component = reflect_component.reflect(entity).expect("not registered"); + let component = reflect_component.reflect(entity).ok_or("not registered")?; let compo_bin = compo_to_bin(component.clone_value(), ®istry); result.push(Message::ComponentUpdated { id: e_id, @@ -80,7 +99,16 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { } } - // Iterate again after all entities have been sent to find parenting to avoid missed parent ids + Ok(()) +} + +fn check_parents(world: &World, result: &mut Vec) -> Result<(), Box> { + let sync_down_id = world + .component_id::() + .ok_or("SyncDown is not registered")?; + let parent_component_id = world + .component_id::() + .ok_or("Parent is not registered")?; for arch in world .archetypes() .iter() @@ -103,8 +131,14 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { } } } + Ok(()) +} - if track.sync_materials_enabled() { +fn check_materials(world: &World, result: &mut Vec) -> Result<(), Box> { + let track = world.resource::(); + let registry = world.resource::(); + let registry = registry.read(); + if track.sync_materials { let materials = world.resource::>(); for (id, material) in materials.iter() { let AssetId::Uuid { uuid: id } = id else { @@ -116,8 +150,12 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { }); } } + Ok(()) +} - if track.sync_materials_enabled() { +fn check_meshes(world: &World, result: &mut Vec) -> Result<(), Box> { + let track = world.resource::(); + if track.sync_meshes { let meshes = world.resource::>(); for (id, mesh) in meshes.iter() { let AssetId::Uuid { uuid: id } = id else { @@ -129,6 +167,5 @@ pub(crate) fn build_initial_sync(world: &World) -> Vec { }); } } - - result + Ok(()) } diff --git a/src/server/track.rs b/src/server/track.rs index e262290..610c105 100644 --- a/src/server/track.rs +++ b/src/server/track.rs @@ -132,7 +132,7 @@ pub(crate) fn react_on_changed_components( mut track: ResMut, ) { let registry = registry.read(); - while let Some(change) = track.changed_components.pop_front() { + while let Some(change) = track.changed_components_to_send.pop_front() { debug!( "Component was changed on server: {}", change.data.reflect_type_path() From 23c877a766bc8924a4196f1a471c8cd6ab4fe270 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Fri, 13 Oct 2023 03:37:15 +0200 Subject: [PATCH 12/26] using temp renet --- Cargo.toml | 2 +- src/proto_serde.rs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 37c54e3..89fe0dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ include = ["/src", "/LICENSE-MIT", "/LICENSE-APACHE"] [dependencies] #bevy = { git = "https://github.com/bevyengine/bevy.git" } bevy = { git = "https://github.com/MrGVSV/bevy.git", branch = "reflect-serialize-dynamics" } -bevy_renet = { path = "../renet/bevy_renet" } +bevy_renet = { git = "https://github.com/raffaeleragni/renet.git", branch = "bevy_0_12" } bincode = "1.3.3" serde = { version = "1.0.160", features = ["derive"] } diff --git a/src/proto_serde.rs b/src/proto_serde.rs index 0991838..2522427 100644 --- a/src/proto_serde.rs +++ b/src/proto_serde.rs @@ -89,7 +89,7 @@ impl<'a: 'de, 'de> Visitor<'de> for ComponentDataDeserializer<'a> { mod test { use bevy::{ prelude::*, - reflect::{DynamicStruct, GetTypeRegistration, Reflect, ReflectFromReflect, TypeRegistry}, + reflect::{GetTypeRegistration, Reflect, ReflectFromReflect, TypeRegistry}, }; use serde::{Deserialize, Serialize}; @@ -107,7 +107,6 @@ mod test { { let mut registry = TypeRegistry::default(); registry.register::(); - registry.register::(); let data = compo_to_bin(compo_orig.clone_value(), ®istry); From d601c391694fddcbcac74d5cd95e23f12e6d78a3 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Fri, 13 Oct 2023 03:42:58 +0200 Subject: [PATCH 13/26] fixing new method --- src/proto_serde.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/proto_serde.rs b/src/proto_serde.rs index 2522427..0a587af 100644 --- a/src/proto_serde.rs +++ b/src/proto_serde.rs @@ -2,7 +2,7 @@ use std::any::type_name; use bevy::reflect::{ serde::{ReflectSerializer, UntypedReflectDeserializer}, - DynamicStruct, DynamicTypePath, Reflect, ReflectFromReflect, TypeRegistry, + DynamicStruct, Reflect, ReflectFromReflect, TypeRegistry, }; use bincode::{DefaultOptions, Options}; @@ -31,7 +31,7 @@ pub(crate) fn bin_to_compo(data: &[u8], registry: &TypeRegistry) -> Box().unwrap(); - let type_path = data.reflect_type_path(); + let type_path = data.get_represented_type_info().unwrap().type_path(); let registration = registry.get_with_type_path(type_path).unwrap(); let rfr = registry .get_type_data::(registration.type_id()) From 59fc348723b4fff261e48f8a1a3814e0ef18f762 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Fri, 13 Oct 2023 03:46:45 +0200 Subject: [PATCH 14/26] convert other methods --- src/client/track.rs | 2 +- src/lib_priv.rs | 2 +- src/server/track.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/track.rs b/src/client/track.rs index 79693e7..09cb036 100644 --- a/src/client/track.rs +++ b/src/client/track.rs @@ -82,7 +82,7 @@ pub(crate) fn react_on_changed_components( while let Some(change) = track.changed_components_to_send.pop_front() { debug!( "Component was changed on client: {}", - change.data.reflect_type_path() + change.data.get_represented_type_info().unwrap().type_path() ); client.send_message( DefaultChannel::ReliableOrdered, diff --git a/src/lib_priv.rs b/src/lib_priv.rs index f88783e..548efd7 100644 --- a/src/lib_priv.rs +++ b/src/lib_priv.rs @@ -54,7 +54,7 @@ pub(crate) fn sync_mesh_enabled(tracker: Res) -> bool { impl SyncTrackerRes { pub(crate) fn signal_component_changed(&mut self, id: Entity, data: Box) { - let name = data.reflect_type_path().into(); + let name = data.get_represented_type_info().unwrap().type_path().into(); let change_id = ComponentChangeId { id, name }; if self.pushed_component_from_network.contains(&change_id) { self.pushed_component_from_network.remove(&change_id); diff --git a/src/server/track.rs b/src/server/track.rs index 610c105..30ae16e 100644 --- a/src/server/track.rs +++ b/src/server/track.rs @@ -135,7 +135,7 @@ pub(crate) fn react_on_changed_components( while let Some(change) = track.changed_components_to_send.pop_front() { debug!( "Component was changed on server: {}", - change.data.reflect_type_path() + change.data.get_represented_type_info().unwrap().type_path() ); for cid in server.clients_id().into_iter() { server.send_message( From 3c8852815acacfbfed0acf3a9cf1b24d07410972 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Fri, 13 Oct 2023 04:14:19 +0200 Subject: [PATCH 15/26] unit test serde for material --- src/proto_serde.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/proto_serde.rs b/src/proto_serde.rs index 0a587af..09d5d4d 100644 --- a/src/proto_serde.rs +++ b/src/proto_serde.rs @@ -143,4 +143,29 @@ mod test { assert_eq!(*compo_result, compo_orig); } + + #[test] + fn material_serde() { + let material_orig = StandardMaterial { + base_color: Color::RED, + ..StandardMaterial::default() + }; + + let mut registry = TypeRegistry::default(); + registry.register::(); + registry.register::(); + registry.register::(); + registry.register::>(); + registry.register::>>(); + registry.register::(); + registry.register::(); + registry.register_type_data::(); + + let data = compo_to_bin(material_orig.clone_value(), ®istry); + + let result = bin_to_compo(&data, ®istry); + let result = result.downcast::().unwrap(); + + assert_eq!(result.base_color, material_orig.base_color); + } } From c3cf9a2136b2f78915f385399c5c6c65819a7726 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Thu, 19 Oct 2023 09:01:45 +0200 Subject: [PATCH 16/26] avoid cloning --- Cargo.toml | 4 +- src/client/track.rs | 4 +- src/proto_serde.rs | 117 ++++++++++++++++--------------------- src/server/initial_sync.rs | 4 +- src/server/track.rs | 4 +- 5 files changed, 58 insertions(+), 75 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 89fe0dc..6787ebd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,8 +16,8 @@ include = ["/src", "/LICENSE-MIT", "/LICENSE-APACHE"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -#bevy = { git = "https://github.com/bevyengine/bevy.git" } -bevy = { git = "https://github.com/MrGVSV/bevy.git", branch = "reflect-serialize-dynamics" } +bevy = { git = "https://github.com/bevyengine/bevy.git" } +#bevy = { path = "../bevy" } bevy_renet = { git = "https://github.com/raffaeleragni/renet.git", branch = "bevy_0_12" } bincode = "1.3.3" serde = { version = "1.0.160", features = ["derive"] } diff --git a/src/client/track.rs b/src/client/track.rs index 09cb036..22f2e0c 100644 --- a/src/client/track.rs +++ b/src/client/track.rs @@ -89,7 +89,7 @@ pub(crate) fn react_on_changed_components( bincode::serialize(&Message::ComponentUpdated { id: change.change_id.id, name: change.change_id.name, - data: compo_to_bin(change.data.clone_value(), ®istry), + data: compo_to_bin(change.data.as_reflect(), ®istry), }) .unwrap(), ); @@ -120,7 +120,7 @@ pub(crate) fn react_on_changed_materials( DefaultChannel::ReliableOrdered, bincode::serialize(&Message::StandardMaterialUpdated { id: *id, - material: compo_to_bin(material.clone_value(), ®istry), + material: compo_to_bin(material.as_reflect(), ®istry), }) .unwrap(), ); diff --git a/src/proto_serde.rs b/src/proto_serde.rs index 09d5d4d..9298362 100644 --- a/src/proto_serde.rs +++ b/src/proto_serde.rs @@ -1,36 +1,31 @@ -use std::any::type_name; - use bevy::reflect::{ serde::{ReflectSerializer, UntypedReflectDeserializer}, DynamicStruct, Reflect, ReflectFromReflect, TypeRegistry, }; use bincode::{DefaultOptions, Options}; -use serde::{ - de::{self, DeserializeSeed, Visitor}, - ser::{SerializeStruct, Serializer}, - Deserializer, Serialize, -}; +use serde::de::DeserializeSeed; -pub(crate) fn compo_to_bin(compo: Box, registry: &TypeRegistry) -> Vec { - let serializer = ComponentData { - data: compo.clone_value(), - registry, - }; - bincode::serialize(&serializer).unwrap() +pub(crate) fn compo_to_bin(compo: &dyn Reflect, registry: &TypeRegistry) -> Vec { + let serializer = ReflectSerializer::new(compo, registry); + DefaultOptions::new() + .with_fixint_encoding() + .allow_trailing_bytes() + .serialize(&serializer) + .unwrap() } pub(crate) fn bin_to_compo(data: &[u8], registry: &TypeRegistry) -> Box { + let reflect_deserializer = UntypedReflectDeserializer::new(registry); let binoptions = DefaultOptions::new() .with_fixint_encoding() .allow_trailing_bytes(); let mut bin_deser = bincode::Deserializer::from_slice(data, binoptions); - let deserializer = ComponentDataDeserializer { registry }; - let data = deserializer.deserialize(&mut bin_deser).unwrap(); - if !data.data.is::() { - return data.data; + let data = reflect_deserializer.deserialize(&mut bin_deser).unwrap(); + if !data.is::() { + return data; } - let data = data.data.downcast::().unwrap(); + let data = data.downcast::().unwrap(); let type_path = data.get_represented_type_info().unwrap().type_path(); let registration = registry.get_with_type_path(type_path).unwrap(); let rfr = registry @@ -39,55 +34,11 @@ pub(crate) fn bin_to_compo(data: &[u8], registry: &TypeRegistry) -> Box { - data: Box, - registry: &'a TypeRegistry, -} - -impl<'a> Serialize for ComponentData<'a> { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let mut state = serializer.serialize_struct(type_name::(), 1)?; - state.serialize_field( - "data", - &ReflectSerializer::new(self.data.as_reflect(), self.registry), - )?; - state.end() - } -} - -struct ComponentDataDeserializer<'a> { - registry: &'a TypeRegistry, -} - -impl<'a: 'de, 'de: 'a> DeserializeSeed<'de> for ComponentDataDeserializer<'a> { - type Value = ComponentData<'a>; - - fn deserialize>(self, deserializer: D) -> Result { - let registry = self.registry; - let data = deserializer.deserialize_struct(type_name::(), &["data"], self)?; - Ok(ComponentData { data, registry }) - } -} - -impl<'a: 'de, 'de> Visitor<'de> for ComponentDataDeserializer<'a> { - type Value = Box; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str(type_name::()) - } - - fn visit_seq>(self, mut seq: A) -> Result { - seq.next_element_seed(UntypedReflectDeserializer::new(self.registry))? - .ok_or_else(|| de::Error::invalid_type(de::Unexpected::NewtypeVariant, &self)) - } -} - #[cfg(test)] mod test { + use super::*; use bevy::{ + pbr::OpaqueRendererMethod, prelude::*, reflect::{GetTypeRegistration, Reflect, ReflectFromReflect, TypeRegistry}, }; @@ -108,7 +59,7 @@ mod test { let mut registry = TypeRegistry::default(); registry.register::(); - let data = compo_to_bin(compo_orig.clone_value(), ®istry); + let data = compo_to_bin(compo_orig.as_reflect(), ®istry); let compo_result = bin_to_compo(&data, ®istry); let compo_result = compo_result.downcast::().unwrap(); @@ -136,7 +87,7 @@ mod test { registry.register_type_data::(); registry.register_type_data::(); - let data = compo_to_bin(compo_orig.clone_value(), ®istry); + let data = compo_to_bin(compo_orig.as_reflect(), ®istry); let compo_result = bin_to_compo(&data, ®istry); let compo_result = compo_result.downcast::().unwrap(); @@ -159,13 +110,45 @@ mod test { registry.register::>>(); registry.register::(); registry.register::(); + registry.register::(); registry.register_type_data::(); - let data = compo_to_bin(material_orig.clone_value(), ®istry); + let data = compo_to_bin(material_orig.as_reflect(), ®istry); let result = bin_to_compo(&data, ®istry); let result = result.downcast::().unwrap(); assert_eq!(result.base_color, material_orig.base_color); } + + #[test] + fn reflect_material_no_dependencies() { + let compo = StandardMaterial { + base_color: Color::RED, + ..StandardMaterial::default() + }; + + let mut registry = TypeRegistry::default(); + registry.register::(); + registry.register::(); + registry.register::(); + registry.register::>(); + registry.register::>>(); + registry.register::(); + registry.register::(); + registry.register::(); + + // compo_to_bin inlined + let cloned = compo.clone_value(); + let serializer = ReflectSerializer::new(cloned.as_reflect(), ®istry); + let result = DefaultOptions::new() + .with_fixint_encoding() + .allow_trailing_bytes() + .serialize(&serializer) + .unwrap(); + + let result = bin_to_compo(&result, ®istry); + let result = result.downcast::().unwrap(); + assert_eq!(compo.base_color, result.base_color); + } } diff --git a/src/server/initial_sync.rs b/src/server/initial_sync.rs index d8abd86..53e1977 100644 --- a/src/server/initial_sync.rs +++ b/src/server/initial_sync.rs @@ -89,7 +89,7 @@ fn check_entity_components(world: &World, result: &mut Vec) -> Result<( let entity = world.entity(arch_entity.entity()); let e_id = entity.id(); let component = reflect_component.reflect(entity).ok_or("not registered")?; - let compo_bin = compo_to_bin(component.clone_value(), ®istry); + let compo_bin = compo_to_bin(component.as_reflect(), ®istry); result.push(Message::ComponentUpdated { id: e_id, name: type_name.into(), @@ -146,7 +146,7 @@ fn check_materials(world: &World, result: &mut Vec) -> Result<(), Box Date: Thu, 19 Oct 2023 14:29:28 +0200 Subject: [PATCH 17/26] fix last test --- src/lib_priv.rs | 3 ++- src/proto_serde.rs | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib_priv.rs b/src/lib_priv.rs index 548efd7..98e2512 100644 --- a/src/lib_priv.rs +++ b/src/lib_priv.rs @@ -4,7 +4,7 @@ use bevy::{ ecs::component::ComponentId, prelude::*, reflect::{DynamicTypePath, FromReflect, GetTypeRegistration, Reflect, ReflectFromReflect}, - utils::{HashMap, HashSet}, + utils::{HashMap, HashSet}, pbr::OpaqueRendererMethod, }; use bevy_renet::renet::ClientId; @@ -212,6 +212,7 @@ fn setup_cascade_registrations>>(); app.register_type::(); app.register_type::(); + app.register_type::(); } if TypeId::of::() == TypeId::of::() { diff --git a/src/proto_serde.rs b/src/proto_serde.rs index 9298362..eea1dd9 100644 --- a/src/proto_serde.rs +++ b/src/proto_serde.rs @@ -139,8 +139,7 @@ mod test { registry.register::(); // compo_to_bin inlined - let cloned = compo.clone_value(); - let serializer = ReflectSerializer::new(cloned.as_reflect(), ®istry); + let serializer = ReflectSerializer::new(compo.as_reflect(), ®istry); let result = DefaultOptions::new() .with_fixint_encoding() .allow_trailing_bytes() From b4b3575aa22ee6b454d3d440d73ea6c190f8ead5 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Thu, 19 Oct 2023 15:20:03 +0200 Subject: [PATCH 18/26] use uuids only --- Cargo.toml | 1 + examples/host.rs | 24 +++++++++++++++++------- src/proto_serde.rs | 15 +++++++++++++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6787ebd..028cefa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,3 +26,4 @@ serde = { version = "1.0.160", features = ["derive"] } portpicker = "0.1.1" serial_test = "2.0.0" bevy_editor_pls = { git = "https://github.com/jakobhellermann/bevy_editor_pls.git", branch = "main" } +uuid = "1.5.0" diff --git a/examples/host.rs b/examples/host.rs index d4db975..63f5301 100644 --- a/examples/host.rs +++ b/examples/host.rs @@ -3,8 +3,9 @@ use std::{ net::{IpAddr, Ipv4Addr}, }; -use bevy::{pbr::wireframe::Wireframe, prelude::*, render::primitives::Aabb}; +use bevy::{prelude::*, render::primitives::Aabb}; use bevy_sync::{ServerPlugin, SyncComponent, SyncExclude, SyncMark, SyncPlugin}; +use uuid::Uuid; fn main() { if env::var("RUST_LOG").is_err() { @@ -23,7 +24,6 @@ fn main() { host.sync_component::(); host.sync_component::(); host.sync_component::(); - host.sync_component::(); host.sync_component::(); host.sync_component::>(); host.sync_component::>(); @@ -34,6 +34,17 @@ fn main() { host.run(); } +trait AddByUuid { + fn addu(&mut self, asset: A) -> Handle; +} +impl AddByUuid for Assets { + fn addu(&mut self, asset: A) -> Handle { + let id = AssetId::Uuid{ uuid: Uuid::new_v4() }; + self.insert(id, asset); + Handle::::Weak(id) + } +} + fn load_world( mut commands: Commands, mut meshes: ResMut>, @@ -41,8 +52,8 @@ fn load_world( ) { commands.spawn(( PbrBundle { - mesh: meshes.add(shape::Plane::from_size(5.0).into()), - material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()), + mesh: meshes.addu(shape::Plane::from_size(5.0).into()), + material: materials.addu(Color::rgb(0.3, 0.5, 0.3).into()), ..default() }, SyncMark, @@ -51,12 +62,11 @@ fn load_world( )); commands.spawn(( PbrBundle { - mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })), - material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), + mesh: meshes.addu(Mesh::from(shape::Cube { size: 1.0 })), + material: materials.addu(Color::rgb(0.8, 0.7, 0.6).into()), transform: Transform::from_xyz(0.0, 0.5, 0.0), ..default() }, - Wireframe, SyncMark, Name::new("Cube"), )); diff --git a/src/proto_serde.rs b/src/proto_serde.rs index eea1dd9..bd972b2 100644 --- a/src/proto_serde.rs +++ b/src/proto_serde.rs @@ -150,4 +150,19 @@ mod test { let result = result.downcast::().unwrap(); assert_eq!(compo.base_color, result.base_color); } + + #[derive(Asset, Default, PartialEq, Serialize, Deserialize, Debug, Reflect)] + struct MyAsset {} + + #[derive(Component, Default, PartialEq, Debug, Reflect)] + struct CompoHandle { + handle: Handle + } + + #[test] + fn serde_component_with_handle() { + let value = MyAsset{}; + let orig = CompoHandle { handle: Handle::from(value) }; + check_serialize_and_back::(orig); + } } From b60680f2899fa408526bee36dd816efa36ec6db6 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Thu, 19 Oct 2023 15:20:43 +0200 Subject: [PATCH 19/26] fix --- src/proto_serde.rs | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/proto_serde.rs b/src/proto_serde.rs index bd972b2..9d8fc12 100644 --- a/src/proto_serde.rs +++ b/src/proto_serde.rs @@ -151,18 +151,4 @@ mod test { assert_eq!(compo.base_color, result.base_color); } - #[derive(Asset, Default, PartialEq, Serialize, Deserialize, Debug, Reflect)] - struct MyAsset {} - - #[derive(Component, Default, PartialEq, Debug, Reflect)] - struct CompoHandle { - handle: Handle - } - - #[test] - fn serde_component_with_handle() { - let value = MyAsset{}; - let orig = CompoHandle { handle: Handle::from(value) }; - check_serialize_and_back::(orig); - } } From e03ac3315c9ae47772ba350dcc1ab4b0efca4d0a Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Sat, 21 Oct 2023 12:36:43 +0200 Subject: [PATCH 20/26] logging reworked --- src/client/receiver.rs | 18 ++---------- src/client/track.rs | 6 +--- src/lib.rs | 1 + src/lib_priv.rs | 8 +---- src/logging.rs | 66 ++++++++++++++++++++++++++++++++++++++++++ src/server/receiver.rs | 13 ++------- src/server/track.rs | 23 ++------------- 7 files changed, 77 insertions(+), 58 deletions(-) create mode 100644 src/logging.rs diff --git a/src/client/receiver.rs b/src/client/receiver.rs index 6515b48..06df62f 100644 --- a/src/client/receiver.rs +++ b/src/client/receiver.rs @@ -1,3 +1,5 @@ +use crate::logging::{log_message_received, Who}; + use super::*; pub(crate) fn poll_for_messages( @@ -22,13 +24,9 @@ fn receive_as_client( } fn client_received_a_message(msg: Message, track: &mut ResMut, cmd: &mut Commands) { + log_message_received(Who::Client, &msg); match msg { Message::EntitySpawn { id } => { - debug!( - "Client received of type EntitySpawn for server entity {}v{}", - id.index(), - id.generation() - ); if let Some(e_id) = track.server_to_client_entities.get(&id) { if cmd.get_entity(*e_id).is_some() { return; @@ -46,11 +44,6 @@ fn client_received_a_message(msg: Message, track: &mut ResMut, c server_entity_id: id, client_entity_id: back_id, } => { - debug!( - "Client received of type EntitySpawnBack for server entity {}v{}", - id.index(), - id.generation() - ); if let Some(mut e) = cmd.get_entity(back_id) { e.remove::().insert(SyncUp { server_entity_id: id, @@ -77,11 +70,6 @@ fn client_received_a_message(msg: Message, track: &mut ResMut, c }); } Message::EntityDelete { id } => { - debug!( - "Client received of type EntityDelete for server entity {}v{}", - id.index(), - id.generation() - ); let Some(&e_id) = track.server_to_client_entities.get(&id) else { return; }; diff --git a/src/client/track.rs b/src/client/track.rs index 22f2e0c..92d63ce 100644 --- a/src/client/track.rs +++ b/src/client/track.rs @@ -80,11 +80,7 @@ pub(crate) fn react_on_changed_components( ) { let registry = registry.read(); while let Some(change) = track.changed_components_to_send.pop_front() { - debug!( - "Component was changed on client: {}", - change.data.get_represented_type_info().unwrap().type_path() - ); - client.send_message( + client.send_message( DefaultChannel::ReliableOrdered, bincode::serialize(&Message::ComponentUpdated { id: change.change_id.id, diff --git a/src/lib.rs b/src/lib.rs index 216955c..0b19b16 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,6 +45,7 @@ mod networking; mod proto; mod proto_serde; mod server; +mod logging; pub mod prelude { pub use super::{ diff --git a/src/lib_priv.rs b/src/lib_priv.rs index 98e2512..ea934ab 100644 --- a/src/lib_priv.rs +++ b/src/lib_priv.rs @@ -85,13 +85,7 @@ impl SyncTrackerRes { let reflect_component = registration.data::().unwrap(); let previous_value = reflect_component.reflect(world.entity(e_id)); if equals(previous_value, &*component_data) { - debug!( - "Changed component from network: {}v{} - {}", - e_id.index(), - e_id.generation(), - &name - ); - world + world .resource_mut::() .pushed_component_from_network .insert(ComponentChangeId { id: e_id, name }); diff --git a/src/logging.rs b/src/logging.rs new file mode 100644 index 0000000..04173ef --- /dev/null +++ b/src/logging.rs @@ -0,0 +1,66 @@ +use bevy::prelude::*; + +use crate::proto::Message; + +#[derive(Debug)] +pub(crate) enum Who { + Server, + Client, +} + +pub(crate) fn log_message_received(from: Who, message: &Message) { + match message { + Message::EntitySpawn { id } => debug!( + "{:?} received EntitySpawn {{ id: {}v{} }}", + from, + id.index(), + id.generation() + ), + Message::EntityParented { + server_entity_id: eid, + server_parent_id: pid, + } => debug!( + "{:?} received EntityParented {{ eid: {}v{}, pid: {}v{} }}", + from, + eid.index(), + eid.generation(), + pid.index(), + pid.generation() + ), + Message::EntitySpawnBack { + server_entity_id: sid, + client_entity_id: cid, + } => debug!( + "{:?} received EntitySpawnBack {{sid: {}v{}, cid: {}v{}", + from, + sid.index(), + sid.generation(), + cid.index(), + cid.generation() + ), + Message::EntityDelete { id } => debug!( + "{:?} received EntityDelete {{ id: {}v{} }}", + from, + id.index(), + id.generation() + ), + Message::ComponentUpdated { id, name, data: _ } => { + debug!( + "{:?} received ComponentUpdated {{ id: {}v{}, name: {} }}", + from, + id.index(), + id.generation(), + name + ) + } + Message::StandardMaterialUpdated { id, material: _ } => { + debug!( + "{:?} received StandardMaterialUpdated {{ uuid: {} }}", + from, id + ) + } + Message::MeshUpdated { id, mesh: _ } => { + debug!("{:?} received MeshUpdated {{ uuid: {} }}", from, id) + } + } +} diff --git a/src/server/receiver.rs b/src/server/receiver.rs index 411b572..6282534 100644 --- a/src/server/receiver.rs +++ b/src/server/receiver.rs @@ -1,5 +1,7 @@ use bevy_renet::renet::ClientId; +use crate::logging::{log_message_received, Who}; + use super::*; pub(crate) fn poll_for_messages( @@ -32,13 +34,9 @@ fn server_received_a_message( track: &mut ResMut, cmd: &mut Commands, ) { + log_message_received(Who::Server, &msg); match msg { Message::EntitySpawn { id } => { - debug!( - "Server received message of type EntitySpawn for entity {}v{}", - id.index(), - id.generation() - ); let e_id = cmd .spawn(SyncClientGeneratedEntity { client_id, @@ -72,11 +70,6 @@ fn server_received_a_message( }); } Message::EntityDelete { id } => { - debug!( - "Server received message of type EntityDelete for entity {}v{}", - id.index(), - id.generation() - ); if let Some(mut e) = cmd.get_entity(id) { e.despawn(); } diff --git a/src/server/track.rs b/src/server/track.rs index db6ca18..6bd1964 100644 --- a/src/server/track.rs +++ b/src/server/track.rs @@ -24,12 +24,7 @@ pub(crate) fn entity_created_on_server( mut query: Query>, ) { for id in query.iter_mut() { - debug!( - "New entity created on server: {}v{}", - id.index(), - id.generation() - ); - for client_id in server.clients_id().into_iter() { + for client_id in server.clients_id().into_iter() { server.send_message( client_id, DefaultChannel::ReliableOrdered, @@ -66,12 +61,7 @@ pub(crate) fn reply_back_to_client_generated_entity( mut query: Query<(Entity, &SyncClientGeneratedEntity), Added>, ) { for (entity_id, marker_component) in query.iter_mut() { - debug!( - "Replying to client generated entity for: {}v{}", - entity_id.index(), - entity_id.generation() - ); - server.send_message( + server.send_message( marker_component.client_id, DefaultChannel::ReliableOrdered, bincode::serialize(&Message::EntitySpawnBack { @@ -111,11 +101,6 @@ pub(crate) fn entity_removed_from_server( } }); for &id in despawned_entities.iter() { - debug!( - "Entity was removed from server: {}v{}", - id.index(), - id.generation() - ); for cid in server.clients_id().into_iter() { server.send_message( cid, @@ -133,10 +118,6 @@ pub(crate) fn react_on_changed_components( ) { let registry = registry.read(); while let Some(change) = track.changed_components_to_send.pop_front() { - debug!( - "Component was changed on server: {}", - change.data.get_represented_type_info().unwrap().type_path() - ); for cid in server.clients_id().into_iter() { server.send_message( cid, From 1ac838c174f14bd9f1dbdf2711ae61747ee3660f Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Mon, 30 Oct 2023 20:18:02 +0100 Subject: [PATCH 21/26] also test meshes --- Cargo.toml | 2 +- examples/client.rs | 2 +- examples/host.rs | 8 +++++--- tests/assert/mod.rs | 16 +++++++++++++--- tests/asset_sync.rs | 6 +++--- tests/initial_sync.rs | 6 +++--- 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 028cefa..4e0d8a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,5 +25,5 @@ serde = { version = "1.0.160", features = ["derive"] } [dev-dependencies] portpicker = "0.1.1" serial_test = "2.0.0" -bevy_editor_pls = { git = "https://github.com/jakobhellermann/bevy_editor_pls.git", branch = "main" } +bevy_editor_pls = { git = "https://github.com/raffaeleragni/bevy_editor_pls", branch = "bevy_0_12" } uuid = "1.5.0" diff --git a/examples/client.rs b/examples/client.rs index 9f2710f..cbb0147 100644 --- a/examples/client.rs +++ b/examples/client.rs @@ -16,7 +16,7 @@ fn main() { let mut client = App::new(); client.add_plugins(DefaultPlugins); - //client.add_plugins(bevy_editor_pls::EditorPlugin::default()); + client.add_plugins(bevy_editor_pls::EditorPlugin::default()); client.add_plugins(SyncPlugin); client.add_plugins(ClientPlugin { ip, port }); diff --git a/examples/host.rs b/examples/host.rs index 63f5301..d4dd0a3 100644 --- a/examples/host.rs +++ b/examples/host.rs @@ -16,7 +16,7 @@ fn main() { let port = 4000; let mut host = App::new(); host.add_plugins(DefaultPlugins); - //host.add_plugins(bevy_editor_pls::EditorPlugin::default()); + host.add_plugins(bevy_editor_pls::EditorPlugin::default()); host.add_plugins(SyncPlugin); host.add_plugins(ServerPlugin { ip, port }); @@ -35,11 +35,13 @@ fn main() { } trait AddByUuid { - fn addu(&mut self, asset: A) -> Handle; + fn addu(&mut self, asset: A) -> Handle; } impl AddByUuid for Assets { fn addu(&mut self, asset: A) -> Handle { - let id = AssetId::Uuid{ uuid: Uuid::new_v4() }; + let id = AssetId::Uuid { + uuid: Uuid::new_v4(), + }; self.insert(id, asset); Handle::::Weak(id) } diff --git a/tests/assert/mod.rs b/tests/assert/mod.rs index 01f9914..0ea1c23 100644 --- a/tests/assert/mod.rs +++ b/tests/assert/mod.rs @@ -2,7 +2,7 @@ use bevy::prelude::*; use bevy_renet::renet::{DefaultChannel, RenetClient, RenetServer}; use bevy_sync::{SyncDown, SyncUp}; -use crate::setup::{MySynched, TestEnv}; +use crate::setup::{sample_mesh, MySynched, TestEnv}; #[allow(dead_code)] pub(crate) fn entities_in_sync(env: &mut TestEnv, _: T, entity_count: u32) { @@ -96,9 +96,19 @@ pub(crate) fn material_has_color(app: &mut App, id: AssetId, c } #[allow(dead_code)] -pub(crate) fn assets_has_mesh(app: &mut App, id: AssetId) { +pub(crate) fn assets_has_sample_mesh(app: &mut App, id: AssetId) { let meshes = app.world.resource_mut::>(); - let _ = meshes.get(id).unwrap(); + let mesh = meshes.get(id).unwrap(); + let sample = sample_mesh(); + assert_eq!( + mesh.attribute(Mesh::ATTRIBUTE_POSITION) + .unwrap() + .get_bytes(), + sample + .attribute(Mesh::ATTRIBUTE_POSITION) + .unwrap() + .get_bytes() + ); } #[allow(dead_code)] diff --git a/tests/asset_sync.rs b/tests/asset_sync.rs index 65c5469..da6556b 100644 --- a/tests/asset_sync.rs +++ b/tests/asset_sync.rs @@ -1,7 +1,7 @@ mod assert; mod setup; -use assert::{assets_has_mesh, material_has_color}; +use assert::{material_has_color, assets_has_sample_mesh}; use bevy::prelude::*; use bevy_sync::SyncComponent; use serial_test::serial; @@ -81,7 +81,7 @@ fn test_mesh_transferred_from_server() { spawn_new_mesh(app) }, |env, _, id| { - assets_has_mesh(&mut env.clients[0], id); + assets_has_sample_mesh(&mut env.clients[0], id); }, ); } @@ -101,7 +101,7 @@ fn test_mesh_transferred_from_client() { spawn_new_mesh(app) }, |env, _, id| { - assets_has_mesh(&mut env.server, id); + assets_has_sample_mesh(&mut env.server, id); }, ); } diff --git a/tests/initial_sync.rs b/tests/initial_sync.rs index 4e69bc6..8d1a79a 100644 --- a/tests/initial_sync.rs +++ b/tests/initial_sync.rs @@ -1,7 +1,7 @@ mod assert; mod setup; -use assert::{assets_has_mesh, material_has_color}; +use assert::{assets_has_sample_mesh, material_has_color}; use bevy::prelude::*; use bevy_sync::{SyncComponent, SyncExclude, SyncMark}; use serial_test::serial; @@ -41,7 +41,7 @@ fn test_initial_world_sync_sent_from_server() { assert::no_messages_left_for_client(&mut env.clients[0]); material_has_color(&mut env.clients[0], id, Color::RED); - assets_has_mesh(&mut env.clients[0], m_id); + assets_has_sample_mesh(&mut env.clients[0], m_id); }, ); } @@ -73,7 +73,7 @@ fn test_init_sync_multiple_clients() { for capp in &mut env.clients { assert::initial_sync_for_client_happened(&mut env.server, capp, entity_count); material_has_color(capp, id, Color::RED); - assets_has_mesh(capp, m_id); + assets_has_sample_mesh(capp, m_id); } assert::no_messages_left_for_server(&mut env.server); From 317e195fcef04f035af4f2081704c14b6bb0af4d Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Sat, 4 Nov 2023 21:11:29 +0100 Subject: [PATCH 22/26] use added --- src/bundle_fix.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bundle_fix.rs b/src/bundle_fix.rs index 96b69c5..23f4b76 100644 --- a/src/bundle_fix.rs +++ b/src/bundle_fix.rs @@ -20,7 +20,7 @@ impl Plugin for BundleFixPlugin { fn fix_computed_visibility( mut cmd: Commands, - query: Query, Without)>, + query: Query, Without)>, ) { for e in query.iter() { cmd.entity(e).insert(ViewVisibility::default()); @@ -29,7 +29,7 @@ fn fix_computed_visibility( fn fix_missing_global_transforms( mut cmd: Commands, - query: Query<(Entity, &Transform), Without>, + query: Query<(Entity, &Transform), (Added, Without)>, ) { for (e, &t) in query.iter() { cmd.entity(e).insert(GlobalTransform::from(t)); @@ -38,7 +38,7 @@ fn fix_missing_global_transforms( fn fix_missing_cubemap_frusta( mut cmd: Commands, - query: Query, Without)>, + query: Query, Without)>, ) { for e in query.iter() { cmd.entity(e).insert(CubemapFrusta::default()); @@ -47,7 +47,7 @@ fn fix_missing_cubemap_frusta( fn fix_missing_cubemap_visible_entities( mut cmd: Commands, - query: Query, Without)>, + query: Query, Without)>, ) { for e in query.iter() { cmd.entity(e).insert(CubemapVisibleEntities::default()); From 2501e83f2bcb2239a3c2d989d037bf0f619c5c4b Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Sat, 4 Nov 2023 21:32:19 +0100 Subject: [PATCH 23/26] bevy upgrade --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 4e0d8a8..971b3dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ include = ["/src", "/LICENSE-MIT", "/LICENSE-APACHE"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bevy = { git = "https://github.com/bevyengine/bevy.git" } +bevy = { version = "0.12" } #bevy = { path = "../bevy" } bevy_renet = { git = "https://github.com/raffaeleragni/renet.git", branch = "bevy_0_12" } bincode = "1.3.3" From b1a0f08c8f9ad76c124a5ac35b5ed6ca1235245d Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Tue, 7 Nov 2023 10:30:23 +0100 Subject: [PATCH 24/26] point to main --- Cargo.toml | 5 ++--- src/client/mod.rs | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 971b3dd..9776ea0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,13 +17,12 @@ include = ["/src", "/LICENSE-MIT", "/LICENSE-APACHE"] [dependencies] bevy = { version = "0.12" } -#bevy = { path = "../bevy" } -bevy_renet = { git = "https://github.com/raffaeleragni/renet.git", branch = "bevy_0_12" } +bevy_renet = { git = "https://github.com/lucaspoffo/renet.git" } bincode = "1.3.3" serde = { version = "1.0.160", features = ["derive"] } [dev-dependencies] portpicker = "0.1.1" serial_test = "2.0.0" -bevy_editor_pls = { git = "https://github.com/raffaeleragni/bevy_editor_pls", branch = "bevy_0_12" } +bevy_editor_pls = { git = "https://github.com/jakobhellermann/bevy_editor_pls" } uuid = "1.5.0" diff --git a/src/client/mod.rs b/src/client/mod.rs index f0c0221..d47b5b1 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -27,13 +27,13 @@ impl Plugin for ClientSyncPlugin { Update, client_connected .run_if(state_exists_and_equals(ClientState::Connecting)) - .run_if(bevy_renet::transport::client_connected()), + .run_if(bevy_renet::client_connected()), ); app.add_systems( Update, client_connecting .run_if(state_exists_and_equals(ClientState::Disconnected)) - .run_if(bevy_renet::transport::client_connecting()), + .run_if(bevy_renet::client_connecting()), ); app.add_systems( Update, From 5cc433b3d35cf3fa57015955695b65143f73d999 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Tue, 7 Nov 2023 10:58:42 +0100 Subject: [PATCH 25/26] remove moved methods --- src/client/mod.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index d47b5b1..ed2aceb 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -27,13 +27,11 @@ impl Plugin for ClientSyncPlugin { Update, client_connected .run_if(state_exists_and_equals(ClientState::Connecting)) - .run_if(bevy_renet::client_connected()), ); app.add_systems( Update, client_connecting .run_if(state_exists_and_equals(ClientState::Disconnected)) - .run_if(bevy_renet::client_connecting()), ); app.add_systems( Update, From 9315555331b969ab89da46f64c348e438f6d87f9 Mon Sep 17 00:00:00 2001 From: Raffaele Ragni Date: Tue, 7 Nov 2023 11:03:10 +0100 Subject: [PATCH 26/26] complex allowed --- src/bundle_fix.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bundle_fix.rs b/src/bundle_fix.rs index 23f4b76..dcd0949 100644 --- a/src/bundle_fix.rs +++ b/src/bundle_fix.rs @@ -27,6 +27,7 @@ fn fix_computed_visibility( } } +#[allow(clippy::type_complexity)] fn fix_missing_global_transforms( mut cmd: Commands, query: Query<(Entity, &Transform), (Added, Without)>,