From d733c4e3b55f6eaed09948f4309c32ab33f4c02b Mon Sep 17 00:00:00 2001 From: core Date: Mon, 17 Nov 2025 21:19:04 -0500 Subject: [PATCH] feat: avian! --- Cargo.lock | 194 ++++++++++++------ crates/unified/Cargo.toml | 15 +- crates/unified/src/attachment.rs | 10 +- crates/unified/src/client/key_input.rs | 20 +- crates/unified/src/client/mod.rs | 3 +- crates/unified/src/client/net.rs | 2 +- crates/unified/src/client/parts.rs | 13 +- .../src/client/planet/incoming_planets.rs | 9 +- .../unified/src/client/planet/indicators.rs | 2 +- crates/unified/src/client/ui.rs | 2 +- crates/unified/src/client_plugins.rs | 13 +- crates/unified/src/config/part.rs | 2 +- crates/unified/src/config/planet.rs | 12 +- crates/unified/src/config/world.rs | 2 +- crates/unified/src/ecs.rs | 13 +- crates/unified/src/lib.rs | 3 + crates/unified/src/main.rs | 7 +- crates/unified/src/particle_editor/ecs.rs | 3 +- crates/unified/src/particle_editor/hooks.rs | 2 +- crates/unified/src/particle_editor/mod.rs | 6 +- crates/unified/src/particle_editor/spawn.rs | 11 +- crates/unified/src/particles.rs | 2 +- crates/unified/src/physics.rs | 90 ++++++++ crates/unified/src/prelude.rs | 3 + crates/unified/src/server/earth_parts.rs | 3 +- crates/unified/src/server/gravity.rs | 20 +- crates/unified/src/server/mod.rs | 7 +- crates/unified/src/server/part.rs | 14 +- crates/unified/src/server/planets.rs | 20 +- crates/unified/src/server/player.rs | 121 +++++------ crates/unified/src/server/system_sets.rs | 2 +- crates/unified/src/server/world_config.rs | 2 +- crates/unified/src/server_plugins.rs | 5 +- crates/unified/src/shared_plugins.rs | 28 ++- 34 files changed, 415 insertions(+), 246 deletions(-) create mode 100644 crates/unified/src/physics.rs create mode 100644 crates/unified/src/prelude.rs diff --git a/Cargo.lock b/Cargo.lock index fa9ea2448e48141a78eb22e173d8bc1f7cba8010..57c7802ce906493b4829b468b23dc3ccbb33a403 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -724,6 +724,47 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "avian2d" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1527c0529592ee609cdf44cfba8ba5190f0bef5f04ae057b1d1e28d412aee63a" +dependencies = [ + "approx", + "arrayvec", + "avian_derive", + "bevy", + "bevy_heavy", + "bevy_math", + "bevy_transform_interpolation", + "bitflags 2.10.0", + "derive_more", + "disqualified", + "glam_matrix_extras", + "itertools 0.13.0", + "libm", + "nalgebra", + "parry2d", + "parry2d-f64", + "serde", + "slab", + "smallvec", + "thiserror 2.0.17", + "thread_local", +] + +[[package]] +name = "avian_derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b257f601a1535e0d4a7a7796f535e3a13de62fd422b16dff7c14d27f0d4048" +dependencies = [ + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "aws-lc-rs" version = "1.15.0" @@ -1235,6 +1276,18 @@ dependencies = [ "syn", ] +[[package]] +name = "bevy_heavy" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7c0651daa331c326e1460cb19ee5bf497ed2810982dafca8784db44725f5c4b" +dependencies = [ + "bevy_math", + "bevy_reflect", + "glam_matrix_extras", + "serde", +] + [[package]] name = "bevy_image" version = "0.17.2" @@ -1567,19 +1620,6 @@ version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28ab4074e7b781bab84e9b0a41ede245d673d1f75646ce0db27643aedcfb3a85" -[[package]] -name = "bevy_rapier2d" -version = "0.31.0" -source = "git+https://github.com/Deniskore/bevy_rapier?branch=bevy-0.17#47e1fd32c6ea61cfe9a71cb1c42819d7b7fc88ac" -dependencies = [ - "bevy", - "bitflags 2.10.0", - "log", - "nalgebra", - "rapier2d", - "serde", -] - [[package]] name = "bevy_reflect" version = "0.17.2" @@ -1901,6 +1941,16 @@ dependencies = [ "thiserror 2.0.17", ] +[[package]] +name = "bevy_transform_interpolation" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284738382605476667bbe80cf0959f4dffb61adbdb0149e22e67f4dbf97a5bc2" +dependencies = [ + "bevy", + "serde", +] + [[package]] name = "bevy_ui" version = "0.17.2" @@ -2073,9 +2123,6 @@ name = "bit-vec" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" -dependencies = [ - "serde", -] [[package]] name = "bitflags" @@ -4101,12 +4148,25 @@ version = "0.30.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd47b05dddf0005d850e5644cae7f2b14ac3df487979dbfff3b56f20b1a6ae46" dependencies = [ + "approx", "bytemuck", "libm", "rand 0.9.2", "serde_core", ] +[[package]] +name = "glam_matrix_extras" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb141d04d0bbebc52c325352ae0c930a6d42c77ccd02b7c591a73bd7bc1d859" +dependencies = [ + "bevy_reflect", + "glam 0.30.9", + "libm", + "serde", +] + [[package]] name = "glob" version = "0.3.3" @@ -5968,11 +6028,43 @@ dependencies = [ "ena", "foldhash 0.2.0", "hashbrown 0.16.0", + "indexmap", "log", "nalgebra", "num-derive", "num-traits", "ordered-float 5.1.0", + "rayon", + "serde", + "serde_arrays", + "simba", + "slab", + "smallvec", + "spade", + "thiserror 2.0.17", +] + +[[package]] +name = "parry2d-f64" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835d4ca2b68026b04a75ca6196da961d8c0895420eacc9cc2201f7ad54775780" +dependencies = [ + "approx", + "arrayvec", + "bitflags 2.10.0", + "downcast-rs 2.0.2", + "either", + "ena", + "foldhash 0.2.0", + "hashbrown 0.16.0", + "indexmap", + "log", + "nalgebra", + "num-derive", + "num-traits", + "ordered-float 5.1.0", + "rayon", "serde", "serde_arrays", "simba", @@ -6295,33 +6387,42 @@ dependencies = [ ] [[package]] -name = "proc-macro2" -version = "1.0.103" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "unicode-ident", + "proc-macro2", + "quote", ] [[package]] -name = "profiling" -version = "1.0.17" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ - "profiling-procmacros", + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "profiling-procmacros" -version = "1.0.17" +name = "proc-macro2" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ - "quote", - "syn", + "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" + [[package]] name = "pxfm" version = "0.1.25" @@ -6447,32 +6548,6 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbbbbea733ec66275512d0b9694f34102e7d5406fdbe2ad8d21b28dce92887c" -[[package]] -name = "rapier2d" -version = "0.30.1" -source = "git+https://github.com/dimforge/rapier?rev=ef5dcaccaf405da41f6f379bde71f9cf33ffd78b#ef5dcaccaf405da41f6f379bde71f9cf33ffd78b" -dependencies = [ - "approx", - "arrayvec", - "bit-vec", - "bitflags 2.10.0", - "downcast-rs 2.0.2", - "log", - "nalgebra", - "num-derive", - "num-traits", - "ordered-float 5.1.0", - "parry2d", - "profiling", - "rustc-hash 2.1.1", - "serde", - "simba", - "static_assertions", - "thiserror 2.0.17", - "vec_map", - "wide", -] - [[package]] name = "raw-window-handle" version = "0.6.2" @@ -7073,6 +7148,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" dependencies = [ "approx", + "libm", "num-complex", "num-traits", "paste", @@ -7285,11 +7361,11 @@ dependencies = [ "aeronet_replicon", "aeronet_transport", "aeronet_websocket", + "avian2d", "bevy", "bevy-inspector-egui", "bevy_common_assets", "bevy_egui", - "bevy_rapier2d", "bevy_replicon", "clap", "console_error_panic_hook", @@ -8215,12 +8291,6 @@ dependencies = [ "syn", ] -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.9.5" diff --git a/crates/unified/Cargo.toml b/crates/unified/Cargo.toml index 576c457c892cfb0576c95e72eee96e8e2241ae18..edaa53b8109fd0e4919a23c77743534ef9eca9cd 100644 --- a/crates/unified/Cargo.toml +++ b/crates/unified/Cargo.toml @@ -37,7 +37,20 @@ bevy = { version = "0.17", default-features = false, features = [ "bevy_sprite_render", "bevy_ui_render" ] } -bevy_rapier2d = { features = ["serde-serialize", "simd-stable"], git = "https://github.com/Deniskore/bevy_rapier", branch = "bevy-0.17" } +#bevy_rapier2d = { features = ["serde-serialize", "simd-stable"], git = "https://github.com/Deniskore/bevy_rapier", branch = "bevy-0.17" } + +avian2d = { version = "0.4", default-features = false, features = [ + "2d", + "f32", + "default-collider", + "parry-f32", + "xpbd_joints", + "bevy_picking", + "debug-plugin", + "parallel", + "serialize", + "enhanced-determinism" +]} bevy_common_assets = { version = "0.14", features = ["toml"] } bevy_replicon = "0.36" diff --git a/crates/unified/src/attachment.rs b/crates/unified/src/attachment.rs index 333a96f7c218248a3111841a201de165b65a5f37..643f491726a8fd19339b45f5d56db6a5964eb50b 100644 --- a/crates/unified/src/attachment.rs +++ b/crates/unified/src/attachment.rs @@ -1,5 +1,5 @@ use bevy::ecs::entity::MapEntities; -use bevy::prelude::*; +use crate::prelude::*; use serde::{Deserialize, Serialize}; use std::ops::Deref; @@ -22,7 +22,13 @@ pub struct Joint { pub transform: Transform, } #[derive(Component, Serialize, Deserialize, MapEntities)] -pub struct Peer(#[entities] pub Entity, pub bool); +pub struct Peer { + #[entities] + pub peer_joint_entity_id: Entity, + pub processed: bool, + #[entities] + pub physics_joint: Entity +} #[derive(Component, Serialize, Deserialize, MapEntities)] #[relationship(relationship_target = Joints)] diff --git a/crates/unified/src/client/key_input.rs b/crates/unified/src/client/key_input.rs index 6e0c49dcb90901ebd03fb5e90be4654f81b6bc2a..58e5e64bdc0d05bbdd31c40b5f1e65bd06fe7506 100644 --- a/crates/unified/src/client/key_input.rs +++ b/crates/unified/src/client/key_input.rs @@ -4,19 +4,20 @@ use bevy::color::palettes::css::{FUCHSIA, GREEN, ORANGE, WHITE}; use bevy::dev_tools::picking_debug::DebugPickingMode; use bevy::gizmos::gizmos::Gizmos; use bevy::math::{Vec3, Vec3Swizzles}; -use bevy::prelude::{GlobalTransform, Query, ResMut, Resource, Transform, With}; +use crate::prelude::*; use bevy::{ app::{App, Update}, ecs::{message::MessageWriter, system::Res}, input::{ButtonInput, keyboard::KeyCode}, }; -use bevy_rapier2d::render::DebugRenderContext; use std::ops::Deref; +use avian2d::prelude::*; pub fn key_input_plugin(app: &mut App) { app.add_systems(Update, directional_keys) .add_systems(Update, debug_render_keybind) .init_resource::() + .init_resource::() .add_systems(Update, draw_attachment_debug); } @@ -29,16 +30,21 @@ impl Deref for AttachmentDebugRes { &self.0 } } +#[derive(Resource, Default)] +pub struct PhysicsDebugRes(pub bool); +impl Deref for PhysicsDebugRes { + type Target = bool; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} fn debug_render_keybind( keys: Res>, - mut debug_render: ResMut, mut picking_debug_mode: ResMut, mut attachment_debug: ResMut, ) { - if keys.just_pressed(KeyCode::F3) { - debug_render.enabled = !debug_render.enabled; - } if keys.just_pressed(KeyCode::F4) { *picking_debug_mode = DebugPickingMode::Noisy; } @@ -91,7 +97,7 @@ fn draw_attachment_debug( gizmos.cross_2d(joint_target.xy(), 4.0, FUCHSIA); if let Some(peer_id) = peer - && let Ok(peer) = joints.get(peer_id.0) + && let Ok(peer) = joints.get(peer_id.peer_joint_entity_id) { let Ok(peer_parent_pos) = parts.get(peer.1.0) else { continue; diff --git a/crates/unified/src/client/mod.rs b/crates/unified/src/client/mod.rs index 18f873911311ea4d3fa0d53359a6d25fa6223fcd..395de5839eb68849a3aa5bc6c61a930512fd701c 100644 --- a/crates/unified/src/client/mod.rs +++ b/crates/unified/src/client/mod.rs @@ -21,8 +21,7 @@ use bevy::anti_alias::fxaa::Fxaa; use bevy::core_pipeline::tonemapping::DebandDither; use bevy::dev_tools::picking_debug::DebugPickingMode; use bevy::post_process::bloom::Bloom; -use bevy::prelude::*; -use bevy::render::render_phase::DrawFunctions; +use crate::prelude::*; use bevy::window::PrimaryWindow; use planet::incoming_planets::incoming_planets_plugin; diff --git a/crates/unified/src/client/net.rs b/crates/unified/src/client/net.rs index 972c8e8bbfe387fbbd05f99e091e9bacaea5dee1..910923f2cc36233692dfc275fcf3573bdef4d81e 100644 --- a/crates/unified/src/client/net.rs +++ b/crates/unified/src/client/net.rs @@ -2,7 +2,7 @@ use aeronet::io::connection::{DisconnectReason, Disconnected}; use aeronet::io::{Session, SessionEndpoint}; use aeronet_replicon::client::AeronetRepliconClient; use aeronet_transport::TransportConfig; -use bevy::prelude::*; +use crate::prelude::*; pub fn set_config(mut q: Query<&mut TransportConfig, Added>) { for mut q in &mut q { diff --git a/crates/unified/src/client/parts.rs b/crates/unified/src/client/parts.rs index 780ed5701d331d02ad723cd979a8daa26e6c9887..1d1d3a7fe5c7a8299b93277c67b132589434f51b 100644 --- a/crates/unified/src/client/parts.rs +++ b/crates/unified/src/client/parts.rs @@ -4,9 +4,7 @@ use crate::client::colors::GREEN; use crate::client::key_input::AttachmentDebugRes; use crate::ecs::{CursorWorldCoordinates, DragRequestEvent, Part}; use bevy::color::palettes::css::{ORANGE, PURPLE, RED, YELLOW}; -use bevy::prelude::*; -use bevy_rapier2d::dynamics::MassProperties; -use bevy_rapier2d::prelude::AdditionalMassProperties; +use crate::prelude::*; pub fn parts_plugin(app: &mut App) { app.insert_resource(DragResource(None)); @@ -42,11 +40,11 @@ fn handle_incoming_parts( commands .entity(new_entity) .insert(sprite) - .insert(AdditionalMassProperties::MassProperties(MassProperties { + /*.insert(AdditionalMassProperties::MassProperties(MassProperties { local_center_of_mass: Vec2::ZERO, mass: new_part.strong_config.physics.mass, principal_inertia: 7.5, - })) + }))*/ .insert(Pickable::default()) .observe(on_part_click); } @@ -70,13 +68,14 @@ fn handle_updated_parts( commands .entity(updated_entity) .remove::() - .remove::() + //.remove::() .insert(sprite) + /* .insert(AdditionalMassProperties::MassProperties(MassProperties { local_center_of_mass: Vec2::ZERO, mass: updated_part.strong_config.physics.mass, principal_inertia: 7.5, - })); + }))*/; } } diff --git a/crates/unified/src/client/planet/incoming_planets.rs b/crates/unified/src/client/planet/incoming_planets.rs index 52ca80f7a143a22740be009656a15ddffd433e88..cd75f9b32ab315bc57c81f2bdfb501a3403e1f72 100644 --- a/crates/unified/src/client/planet/incoming_planets.rs +++ b/crates/unified/src/client/planet/incoming_planets.rs @@ -1,6 +1,5 @@ use crate::config::planet::{Planet, SpecialSpriteProperties}; -use bevy::prelude::*; -use bevy_rapier2d::prelude::AdditionalMassProperties; +use crate::prelude::*; pub fn incoming_planets_plugin(app: &mut App) { app.add_systems(Update, (handle_incoming_planets, handle_updated_planets)); @@ -22,7 +21,7 @@ fn handle_incoming_planets( let mut commands = commands.entity(new_entity); commands - .insert(AdditionalMassProperties::Mass(new_planet.mass)) + //.insert(AdditionalMassProperties::Mass(new_planet.mass)) .insert(sprite); trace!(?new_planet, "prepared new planet"); @@ -48,8 +47,8 @@ fn handle_updated_planets( let mut commands = commands.entity(updated_entity); commands - .remove::() - .insert(AdditionalMassProperties::Mass(updated_planet.mass)) + //.remove::() + //.insert(AdditionalMassProperties::Mass(updated_planet.mass)) .remove::() .insert(sprite); diff --git a/crates/unified/src/client/planet/indicators.rs b/crates/unified/src/client/planet/indicators.rs index d80ff6d63225e98016807f08ea80a4dfe86c7896..c0f5377e9734bbd14cd3b6662b2d978ea461d9c2 100644 --- a/crates/unified/src/client/planet/indicators.rs +++ b/crates/unified/src/client/planet/indicators.rs @@ -1,7 +1,7 @@ use crate::client::Me; use crate::config::planet::Planet; use crate::ecs::MainCamera; -use bevy::prelude::*; +use crate::prelude::*; use bevy::window::PrimaryWindow; pub fn indicators_plugin(app: &mut App) { diff --git a/crates/unified/src/client/ui.rs b/crates/unified/src/client/ui.rs index 5e875a3d91110e67240593be9336c3abfc5d89e0..141c9d12972e86a1db8cc0b5ec6460b77e76b957 100644 --- a/crates/unified/src/client/ui.rs +++ b/crates/unified/src/client/ui.rs @@ -1,4 +1,4 @@ -use bevy::prelude::*; +use crate::prelude::*; use crate::{ client::colors, diff --git a/crates/unified/src/client_plugins.rs b/crates/unified/src/client_plugins.rs index dadbdfb9d77ad21d2854df2556078c57897177f9..900b16b238e1b31c21acfbc057d9729727c2e239 100644 --- a/crates/unified/src/client_plugins.rs +++ b/crates/unified/src/client_plugins.rs @@ -3,15 +3,12 @@ use aeronet_replicon::client::AeronetRepliconClientPlugin; use aeronet_websocket::client::WebSocketClientPlugin; use bevy::DefaultPlugins; use bevy::app::{PluginGroup, PluginGroupBuilder}; -use bevy::dev_tools::fps_overlay::FpsOverlayPlugin; use bevy::dev_tools::picking_debug::DebugPickingPlugin; +use bevy::ecs::schedule::ScheduleLabel; use bevy::log::LogPlugin; -use bevy::prelude::MeshPickingPlugin; +use crate::prelude::*; use bevy::ui::UiPlugin; -use bevy_egui::EguiPlugin; -use bevy_rapier2d::prelude::RapierDebugRenderPlugin; use bevy_replicon::RepliconPlugins; -use bevy_inspector_egui::quick::WorldInspectorPlugin; pub struct ClientPluginGroup { pub server: String, @@ -29,9 +26,13 @@ impl PluginGroup for ClientPluginGroup { .add(ClientPlugin { server: self.server, }) - .add(RapierDebugRenderPlugin::default().disabled()) + + //.add(PhysicsDebugPlugin) -- debug rendering //.add(FpsOverlayPlugin::default()) //.add(EguiPlugin::default()) //.add(WorldInspectorPlugin::new()) } } + +#[derive(ScheduleLabel, Clone, Eq, Debug, Hash, PartialEq)] +pub struct DontRunSchedule; \ No newline at end of file diff --git a/crates/unified/src/config/part.rs b/crates/unified/src/config/part.rs index 0de920da4cf048f43c24cb0fb1abac7ac73f0eef..f80c4b28cfa470d7b8576c4c0dbcf556ba8e6dfb 100644 --- a/crates/unified/src/config/part.rs +++ b/crates/unified/src/config/part.rs @@ -1,6 +1,6 @@ use bevy::asset::Asset; use bevy::math::{Quat, Vec3}; -use bevy::prelude::{Transform, TypePath}; +use crate::prelude::*; use serde::{Deserialize, Serialize}; #[derive(Deserialize, TypePath, Serialize, Clone, Debug, PartialEq, Asset)] diff --git a/crates/unified/src/config/planet.rs b/crates/unified/src/config/planet.rs index 8899a53eec59c5edc258f618e50a3243af92fa8d..e875de0db50c2a13943de8c3aeaadf58ff2b8d8e 100644 --- a/crates/unified/src/config/planet.rs +++ b/crates/unified/src/config/planet.rs @@ -1,11 +1,14 @@ use bevy::asset::Asset; use bevy::color::Color; -use bevy::prelude::{Bundle, Component, Transform, TypePath}; -use bevy_rapier2d::prelude::{AdditionalMassProperties, Collider, ReadMassProperties, RigidBody}; +use crate::prelude::*; use serde::{Deserialize, Serialize}; + #[derive(Deserialize, Asset, TypePath, Component, Serialize, Clone, Debug)] -#[require(ReadMassProperties, RigidBody::Fixed)] +#[require( + RigidBody::Static, + Replicated, +)] pub struct Planet { pub name: String, pub sprite: String, @@ -26,7 +29,8 @@ pub struct PlanetBundle { pub planet: Planet, pub transform: Transform, pub collider: Collider, - pub additional_mass_properties: AdditionalMassProperties, + pub mass: Mass + //pub additional_mass_properties: AdditionalMassProperties, } #[derive(Deserialize, Asset, TypePath)] diff --git a/crates/unified/src/config/world.rs b/crates/unified/src/config/world.rs index 840c39ea16006731a5267f4e8a74c18d9791b235..498f6794f9858b60eb94a02b0c6e3ce06fe6d8ff 100644 --- a/crates/unified/src/config/world.rs +++ b/crates/unified/src/config/world.rs @@ -1,5 +1,5 @@ use bevy::asset::Asset; -use bevy::prelude::TypePath; +use crate::prelude::*; use serde::Deserialize; #[derive(Deserialize, Asset, TypePath, Clone)] diff --git a/crates/unified/src/ecs.rs b/crates/unified/src/ecs.rs index f541091711c5672efec1e3091c7e9715dc6ff9d0..9a11e98fcf1200fb7f4416df9683a3624829e09e 100644 --- a/crates/unified/src/ecs.rs +++ b/crates/unified/src/ecs.rs @@ -1,11 +1,10 @@ use crate::config::part::PartConfig; use bevy::ecs::entity::MapEntities; use bevy::math::{Quat, Vec2}; -use bevy::prelude::*; -use bevy_rapier2d::dynamics::RigidBody; -use bevy_rapier2d::prelude::*; +use crate::prelude::*; use bevy_replicon::prelude::Replicated; use serde::{Deserialize, Serialize}; +use avian2d::prelude::*; #[derive(Component)] pub struct MainCamera; @@ -34,11 +33,11 @@ pub enum ThrustEvent { #[derive(Component, Serialize, Deserialize, Debug)] #[require( - ReadMassProperties, RigidBody::Dynamic, - ExternalForce, - ExternalImpulse, - Replicated + LinearVelocity, + AngularVelocity, + ConstantForce, + Replicated, )] pub struct Part { pub strong_config: PartConfig, diff --git a/crates/unified/src/lib.rs b/crates/unified/src/lib.rs index f074c7710d4a56dd6d16f7eae23a1639016fafc6..d933b3e33f1052fc156a57b560adbccbc51937d4 100644 --- a/crates/unified/src/lib.rs +++ b/crates/unified/src/lib.rs @@ -38,3 +38,6 @@ pub mod server; #[cfg(all(not(target_arch = "wasm32"), feature = "native"))] pub mod server_plugins; pub mod shared_plugins; + +pub mod physics; +pub mod prelude; \ No newline at end of file diff --git a/crates/unified/src/main.rs b/crates/unified/src/main.rs index 8f272ef97cd6c7375ce20335832d59a9dd39271b..c9fd3144419c44bbedb4ab3d950bcd496a72993f 100644 --- a/crates/unified/src/main.rs +++ b/crates/unified/src/main.rs @@ -1,6 +1,5 @@ -use std::io::Read; use bevy::log::tracing_subscriber; -use bevy::prelude::*; +use starkingdoms::prelude::*; use clap::Parser; use starkingdoms::client_plugins::ClientPluginGroup; #[cfg(not(target_arch = "wasm32"))] @@ -27,7 +26,7 @@ enum Cli { #[arg(short = 'b', long)] bind: SocketAddr, #[arg(short = 'r', long)] - tick_rate: f64, + tick_rate: f32, #[arg(short = 'C', long)] max_clients: usize, #[arg(long, action)] @@ -126,7 +125,7 @@ fn main() -> AppExit { }) .unwrap(); - let mut clt_exit; + let clt_exit; info!("starting client thread..."); diff --git a/crates/unified/src/particle_editor/ecs.rs b/crates/unified/src/particle_editor/ecs.rs index ad4af92f8db3549a7128625b7ed9297eb18d8a34..4987864c5d7a3b2c63db599ffb9c092e2c2a180e 100644 --- a/crates/unified/src/particle_editor/ecs.rs +++ b/crates/unified/src/particle_editor/ecs.rs @@ -1,13 +1,12 @@ use std::time::Duration; use crate::particles::ParticleEffect; -use bevy::prelude::ColorMaterial; use bevy::{ asset::Handle, ecs::component::Component, - prelude::*, time::{Timer, TimerMode}, }; +use crate::prelude::*; #[derive(Component)] pub struct Particle; diff --git a/crates/unified/src/particle_editor/hooks.rs b/crates/unified/src/particle_editor/hooks.rs index f2c7643df5b35ebc38a183225708e2d0463f70b9..ba883e6d32c1e2289df9e0e521be9b78a781117f 100644 --- a/crates/unified/src/particle_editor/hooks.rs +++ b/crates/unified/src/particle_editor/hooks.rs @@ -1,4 +1,4 @@ -use bevy::prelude::*; +use crate::prelude::*; use crate::{particle_editor::ecs::SpawnDelayTimer, particles::ParticleEffect}; diff --git a/crates/unified/src/particle_editor/mod.rs b/crates/unified/src/particle_editor/mod.rs index 91dc2f0dd3681ea2ca827ec620f80ced97cfcb13..0fc892ee8b19b7edc0dac1ccf97028248b7db171 100644 --- a/crates/unified/src/particle_editor/mod.rs +++ b/crates/unified/src/particle_editor/mod.rs @@ -2,9 +2,8 @@ use crate::{ particle_editor::{hooks::hooks_plugin, spawn::spawn_plugin}, particles::{LifetimeCurve, ParticleEffect, RandF32, RandUsize, RandVec2}, }; -use bevy::prelude::*; +use crate::prelude::*; use bevy_egui::{EguiContexts, EguiPlugin, EguiPrimaryContextPass, egui}; -use bevy_rapier2d::plugin::{NoUserData, RapierPhysicsPlugin}; use ordered_float::OrderedFloat; use std::collections::BTreeMap; @@ -14,8 +13,9 @@ mod spawn; pub fn particle_editor_plugin(app: &mut App) { app.add_plugins(DefaultPlugins); + app.insert_resource(Gravity::ZERO); app.add_plugins(EguiPlugin::default()); - app.add_plugins(RapierPhysicsPlugin::::pixels_per_meter(10.0)); + app.add_plugins(PhysicsPlugins::default().with_length_unit(100.0)); app.add_systems(Startup, setup_camera_system); app.add_systems(EguiPrimaryContextPass, editor_ui); app.add_systems(Startup, setup_editor_effect); diff --git a/crates/unified/src/particle_editor/spawn.rs b/crates/unified/src/particle_editor/spawn.rs index ed00eec7ee319134dd3127401560d6f8897367cd..1af3fab6f4ee1d188882052d7f562e6f1eb04bc6 100644 --- a/crates/unified/src/particle_editor/spawn.rs +++ b/crates/unified/src/particle_editor/spawn.rs @@ -1,7 +1,6 @@ use std::time::Duration; - -use bevy::prelude::*; -use bevy_rapier2d::prelude::{RigidBody, Velocity}; +use avian2d::prelude::*; +use crate::prelude::*; use crate::{ particle_editor::ecs::{CircleMesh, LifetimeTimer, ParentEffect, Particle, SpawnDelayTimer}, @@ -44,10 +43,8 @@ fn spawn_particles( )), Mesh2d(circle.0.clone()), MeshMaterial2d(circle.1.clone()), - Velocity { - linvel: effect.initial_linear_velocity.sample(&mut rand::rng()), - angvel: effect.initial_angular_velocity.sample(&mut rand::rng()), - }, + LinearVelocity(effect.initial_linear_velocity.sample(&mut rand::rng())), + AngularVelocity(effect.initial_angular_velocity.sample(&mut rand::rng())), LifetimeTimer(Timer::from_seconds( effect.lifetime_seconds.sample(&mut rand::rng()), TimerMode::Once, diff --git a/crates/unified/src/particles.rs b/crates/unified/src/particles.rs index 569572c046b8cbe146ae128a3c5bbf910211fcb5..a4696506276593b9c30700fa4e6e91eeaab090ca 100644 --- a/crates/unified/src/particles.rs +++ b/crates/unified/src/particles.rs @@ -1,6 +1,6 @@ use bevy::color::{Color, LinearRgba}; use bevy::math::Vec2; -use bevy::prelude::Component; +use crate::prelude::*; use ordered_float::OrderedFloat; use rand::Rng; use serde::{Deserialize, Serialize}; diff --git a/crates/unified/src/physics.rs b/crates/unified/src/physics.rs new file mode 100644 index 0000000000000000000000000000000000000000..7463a24321544223f3273727fbed8203baa83045 --- /dev/null +++ b/crates/unified/src/physics.rs @@ -0,0 +1,90 @@ +use crate::prelude::*; +use bevy_replicon::prelude::*; +use avian2d::prelude::*; + +pub fn register_physics_components_for_replication(app: &mut App) { + app + // Colliders + .replicate::() + .replicate::() + /*.replicate::() + .replicate::() + .replicate::()*/ + + // Dynamics - Rigidbodies + //.replicate::() + .replicate::() + /*.replicate::() + .replicate::() + .replicate::() + .replicate::()*/ + .replicate::() + /* + .replicate::() + .replicate::() + .replicate::() + .replicate::() + .replicate::() + */ + .replicate::() + + // Dynamics - Rigidbodies - Forces + + //.replicate::() + .replicate::() + //.replicate::() + .replicate::() + //.replicate::() + //.replicate::() + + + // Dynamics - Rigidbodies - Mass properties + + //.replicate::() + //.replicate::() + //.replicate::() + //.replicate::() + //.replicate::() + //.replicate::() + //.replicate::() + + + .replicate::() + + /* + .replicate::() + .replicate::() + .replicate::() + + */ + + // Dynamics - Rigidbodies - Sleeping + /* + .replicate::() + .replicate::() + .replicate::() + .replicate::() + + */ + + // Interpolation - TODO + + // Physics transform + .replicate::() + .replicate::() + + // Spatial query + //.replicate::() + + // Joints + + //.replicate::() + .replicate::() + //.replicate::() + //.replicate::() + .replicate::() + //.replicate::() + //.replicate::() + //.replicate::() +; +} \ No newline at end of file diff --git a/crates/unified/src/prelude.rs b/crates/unified/src/prelude.rs new file mode 100644 index 0000000000000000000000000000000000000000..c9e121dd40f20c7611a3c6c0e527fd8b33e5fe1a --- /dev/null +++ b/crates/unified/src/prelude.rs @@ -0,0 +1,3 @@ +pub use bevy::prelude::*; +pub use bevy_replicon::prelude::*; +pub use avian2d::prelude::*; \ No newline at end of file diff --git a/crates/unified/src/server/earth_parts.rs b/crates/unified/src/server/earth_parts.rs index 0deedbbfed578eabea5bca925e2c0c1c8c5c3881..53daa003d6f6c07449582848340340b862bfb2f4 100644 --- a/crates/unified/src/server/earth_parts.rs +++ b/crates/unified/src/server/earth_parts.rs @@ -2,8 +2,7 @@ use crate::config::planet::Planet; use crate::server::part::SpawnPartRequest; use crate::server::world_config::WorldConfigResource; use bevy::app::App; -use bevy::prelude::*; -use bevy::prelude::{Commands, Query, Res, Transform}; +use crate::prelude::*; use bevy::time::Time; #[derive(Resource, Default)] diff --git a/crates/unified/src/server/gravity.rs b/crates/unified/src/server/gravity.rs index 35c1687933fc82070e48b1b5a7bab942c0c847ae..2ffb5f4f4203405ae732c67fd8536c19d0caf7eb 100644 --- a/crates/unified/src/server/gravity.rs +++ b/crates/unified/src/server/gravity.rs @@ -1,18 +1,18 @@ +use bevy::math::FloatPow; use crate::config::planet::Planet; use crate::ecs::Part; +use crate::prelude::*; use crate::server::system_sets::WorldUpdateSet; use crate::server::world_config::WorldConfigResource; -use bevy::math::FloatPow; -use bevy::prelude::*; -use bevy_rapier2d::prelude::*; pub fn newtonian_gravity_plugin(app: &mut App) { app.add_systems(Update, update_gravity.in_set(WorldUpdateSet)); } + fn update_gravity( - mut part_query: Query<(&Transform, &ReadMassProperties, &mut ExternalForce), With>, - planet_query: Query<(&Transform, &ReadMassProperties), With>, + mut part_query: Query<(&Transform, &Mass, &mut ConstantForce), With>, + planet_query: Query<(&Transform, &Mass), With>, world_config: Res, ) { let Some(world_config) = &world_config.config else { @@ -20,14 +20,13 @@ fn update_gravity( }; for (part_transform, part_mass, mut forces) in &mut part_query { - forces.force = Vec2::ZERO; - forces.torque = 0.0; + *forces = ConstantForce::new(0.0, 0.0); - let part_mass = part_mass.mass; + let part_mass = part_mass.0; let part_translation = part_transform.translation; for (planet_transform, planet_mass) in &planet_query { - let planet_mass = planet_mass.mass; + let planet_mass = planet_mass.0; let planet_translation = planet_transform.translation; let distance = planet_translation.distance(part_translation); @@ -35,7 +34,8 @@ fn update_gravity( let force = world_config.world.gravity * ((part_mass * planet_mass) / distance.squared()); let direction = (planet_translation - part_translation).normalize() * force; - forces.force += direction.xy(); + forces.x += direction.x; + forces.y += direction.y; } } } diff --git a/crates/unified/src/server/mod.rs b/crates/unified/src/server/mod.rs index f2be2d35c484d26b03c63a4c8484522a14dc8990..827e622ee6ee3ee68a1d49596caf13a596e430ec 100644 --- a/crates/unified/src/server/mod.rs +++ b/crates/unified/src/server/mod.rs @@ -18,8 +18,7 @@ use aeronet::io::connection::{DisconnectReason, Disconnected, LocalAddr}; use aeronet::io::server::Server; use aeronet_replicon::server::AeronetRepliconServer; use aeronet_websocket::server::WebSocketServer; -use bevy::prelude::*; -use bevy_rapier2d::prelude::PhysicsSet; +use crate::prelude::*; use bevy_replicon::prelude::Replicated; use std::net::SocketAddr; @@ -50,8 +49,8 @@ impl Plugin for ServerPlugin { .add_plugins(player_management_plugin) .add_plugins(spawn_parts_plugin) .add_plugins(part_management_plugin) - .configure_sets(Update, WorldUpdateSet.before(PlayerInputSet)) - .configure_sets(Update, PlayerInputSet.before(PhysicsSet::SyncBackend)); + .configure_sets(Update, WorldUpdateSet.before(PlayerInputSet)); + //.configure_sets(Update, PlayerInputSet.before(PhysicsSet::SyncBackend)); } } impl ServerPlugin { diff --git a/crates/unified/src/server/part.rs b/crates/unified/src/server/part.rs index 519ed090513b12873f1bbd940974f7d4dc96f0a7..1f6077364888957fb68cc11a16268bfb14b75b2e 100644 --- a/crates/unified/src/server/part.rs +++ b/crates/unified/src/server/part.rs @@ -1,9 +1,7 @@ use crate::attachment::{Joint, JointId, JointOf, Joints, Peer, SnapOf, SnapOfJoint}; use crate::config::part::{JointConfig, PartConfig}; use crate::ecs::{Part, PartHandle}; -use bevy::prelude::Component; -use bevy::prelude::*; -use bevy_rapier2d::prelude::{AdditionalMassProperties, Collider, Velocity}; +use crate::prelude::*; use bevy_replicon::prelude::Replicated; pub fn part_management_plugin(app: &mut App) { @@ -65,7 +63,7 @@ fn handle_part_reloading( }); let Some(joint_cfg) = joint_cfg else { if let Some(peer_id) = peer - && let Ok(peer) = joints.get(peer_id.0) { + && let Ok(peer) = joints.get(peer_id.peer_joint_entity_id) { commands.entity(peer.2).remove::(); } commands.entity(*joint_id).despawn(); @@ -111,16 +109,14 @@ fn calculate_bundle(config: &PartConfig, handle: &Handle) -> impl Bu strong_config: config.clone(), }; let part_handle = PartHandle(handle.clone()); - let collider = Collider::cuboid(config.physics.width / 2.0, config.physics.height / 2.0); - let additional_mass_properties = AdditionalMassProperties::Mass(config.physics.mass); + let collider = Collider::rectangle(config.physics.width, config.physics.height); + let mass = Mass(config.physics.mass); ( part, part_handle, collider, - additional_mass_properties, - Velocity::default(), - Replicated, + mass, ) } fn spawn_joint_bundle(joint: &JointConfig, part: &PartConfig, parent: &Entity) -> impl Bundle { diff --git a/crates/unified/src/server/planets.rs b/crates/unified/src/server/planets.rs index ace5bb7b07c70c6e71efd11d13783ba17b03ee01..3cc153a4d32770bcab8deb19f2e871e652e6a983 100644 --- a/crates/unified/src/server/planets.rs +++ b/crates/unified/src/server/planets.rs @@ -1,8 +1,6 @@ use crate::config::planet::{Planet, PlanetBundle, PlanetConfigCollection}; use bevy::asset::Handle; -use bevy::prelude::*; -use bevy_rapier2d::dynamics::AdditionalMassProperties; -use bevy_rapier2d::prelude::Collider; +use crate::prelude::*; use bevy_replicon::prelude::Replicated; pub fn planets_plugin(app: &mut App) { @@ -29,7 +27,7 @@ pub fn update_planets( Entity, &mut Planet, &mut Transform, - &mut AdditionalMassProperties, + &mut Mass, )>, ) { let Some(handle) = planets.handle.as_ref() else { @@ -53,10 +51,8 @@ pub fn update_planets( planet.default_transform[1], planet.default_transform[2], ), - collider: Collider::ball(planet.radius), - additional_mass_properties: AdditionalMassProperties::Mass( - planet.mass, - ), + collider: Collider::circle(planet.radius), + mass: Mass(planet.mass) }) .insert(Replicated); trace!(?planet, "new planet spawned"); @@ -79,14 +75,14 @@ pub fn update_planets( commands .entity(existing) .remove::() - .insert(Collider::ball(planet.radius)); + .insert(Collider::circle(planet.radius)); *e_planet = planet.clone(); e_transform.translation = Vec3::new( planet.default_transform[0], planet.default_transform[1], planet.default_transform[2], ); - *e_mass = AdditionalMassProperties::Mass(planet.mass); + *e_mass = Mass(planet.mass); trace!(?planet, "planet hot-reloaded"); } else { commands @@ -97,8 +93,8 @@ pub fn update_planets( planet.default_transform[1], planet.default_transform[2], ), - collider: Collider::ball(planet.radius), - additional_mass_properties: AdditionalMassProperties::Mass( + collider: Collider::circle(planet.radius), + mass: Mass( planet.mass, ), }) diff --git a/crates/unified/src/server/player.rs b/crates/unified/src/server/player.rs index 1bc4d65c5e51e830a153f7efb55412136572dee0..8fd013b6202ffdb30eb535adb08aa1cd9c53987f 100644 --- a/crates/unified/src/server/player.rs +++ b/crates/unified/src/server/player.rs @@ -5,8 +5,7 @@ use crate::server::part::SpawnPartRequest; use crate::server::system_sets::PlayerInputSet; use crate::server::world_config::WorldConfigResource; use crate::server::{ConnectedGameEntity, ConnectedNetworkEntity}; -use bevy::prelude::*; -use bevy_rapier2d::prelude::{ExternalForce, FixedJointBuilder, ImpulseJoint, Velocity}; +use crate::prelude::*; use bevy_replicon::prelude::{ClientId, FromClient}; use std::f32::consts::PI; @@ -17,34 +16,32 @@ pub fn player_management_plugin(app: &mut App) { handle_new_players, player_thrust, magic_fuel_regen, - (reprocess_reattached_parts, dragging).chain(), + dragging, ) .in_set(PlayerInputSet), ); } -#[derive(Component)] -struct JointNeedsCreation(ImpulseJoint); - fn disconnect_part( entity: Entity, recursed_entity: Entity, joints: &Joints, q_joints: Query<&Joints>, q_peer: Query<(Entity, &Peer, &JointOf)>, - mut processed_peers: &mut Vec, + processed_peers: &mut Vec, mut commands: Commands, ) { trace!(?entity, ?joints, ?processed_peers, "recursive disconnect"); // recursive disconnect part for joint in &**joints { - let Ok((p_e, other_joint_handle, _)) = q_peer.get(*joint) else { + let Ok((p_e, our_peer_object, _)) = q_peer.get(*joint) else { continue; }; - if processed_peers.contains(&p_e) { continue }; - let other_joint = other_joint_handle.0; + if processed_peers.contains(&p_e) { continue } + let other_joint = our_peer_object.peer_joint_entity_id; commands.entity(*joint).remove::(); + commands.entity(our_peer_object.physics_joint).despawn(); processed_peers.push(p_e); let Ok((p_e_2, _, other_joint_of)) = q_peer.get(other_joint) else { @@ -63,8 +60,8 @@ fn disconnect_part( } for ppeer in processed_peers { commands.entity(*ppeer).remove::(); + commands.entity(*ppeer).remove::(); } - commands.entity(entity).remove::(); commands.entity(entity).remove::(); } @@ -75,8 +72,9 @@ fn dragging( &mut Transform, Option<&PartInShip>, Entity, - &mut Velocity, + &mut LinearVelocity, &Joints, + &mut AngularVelocity, ), (With, Without), >, @@ -84,7 +82,7 @@ fn dragging( joints: Query<(&Joint, &JointOf, &Transform, Option<&Peer>, Entity)>, peer: Query<(Entity, &Peer, &JointOf)>, q_joints: Query<&Joints>, - q_joint: Query<&ImpulseJoint>, + q_joint: Query<&FixedJoint>, clients: Query<&ConnectedNetworkEntity>, mut commands: Commands, ) { @@ -105,7 +103,8 @@ fn dragging( let mut teleport_to_translation = Vec2::new(0.0, 0.0); let mut teleport_to_rotation = Quat::from_rotation_z(0.0); - let mut new_vel = None; + let mut new_linvel = None; + let mut new_angvel = None; if let Some(snap_to) = event.snap_target && let Some(peer_snap) = event.peer_snap @@ -192,9 +191,25 @@ fn dragging( commands.reborrow(), ); + // create the joint... + let joint = FixedJoint::new(target_part.2, source_part.2) + .with_local_anchor1(target_joint.2.translation.xy()) + .with_local_basis1(target_joint.0.transform.rotation.to_euler(EulerRot::ZYX).0 + PI + - source_joint.0.transform.rotation.to_euler(EulerRot::ZYX).0); + + let joint_id = commands.spawn(joint).id(); + // create the peering component... - commands.entity(source_joint.4).insert(Peer(target_joint.4, true)); - commands.entity(target_joint.4).insert(Peer(source_joint.4, true)); + commands.entity(source_joint.4).insert(Peer { + peer_joint_entity_id: target_joint.4, + processed: true, + physics_joint: joint_id + }); + commands.entity(target_joint.4).insert(Peer { + peer_joint_entity_id: source_joint.4, + processed: true, + physics_joint: joint_id + }); // propagate PartInShip... @@ -211,44 +226,12 @@ fn dragging( let rotation = event.set_rotation.to_scaled_axis().z; let rotation = Rot2::radians(rotation); - // create the joint... - let joint = FixedJointBuilder::new() - .local_anchor1(target_joint.2.translation.xy()) - .local_basis1( - target_joint.0.transform.rotation.to_euler(EulerRot::ZYX).0 + PI - - source_joint.0.transform.rotation.to_euler(EulerRot::ZYX).0, - ); - - commands.entity(source_part.2).remove::(); - if did_disconnect { - // we disconnected this part this tick, and are performing a "reattachment" - // (dragging an already attached part from peering point A to peering point B) - - // If we're reattaching to a different part, rapier will ignore our new attachment - // as it will be seen as a mutation (removing and adding a component in the - // same tick is considered equivalent to mutation by Bevy). - // As Rapier does not allow you to mutate the source/destination of a joint, - // the change will be outright ignored. - - // Since there is no (easy) way to get the real joint information back out of Rapier, - // or to force it to accept what it sees as invalid mutation, - // we need to delay the creation of the new joint by 1 tick so it's noticed by Rapier - // This component will be swapped out for a real ImpulseJoint on the next tick - // by `reprocess_reattached_parts` (in this file) - commands - .entity(source_part.2) - .insert(JointNeedsCreation(ImpulseJoint::new(target_part.2, joint))); - } else { - commands - .entity(source_part.2) - .insert(ImpulseJoint::new(target_part.2, joint)); - } - teleport_to_translation = target_position.translation.xy(); teleport_to_rotation = target_position.rotation * source_joint.0.transform.rotation.inverse() * Quat::from_rotation_z(PI); - new_vel = Some(*target_part.3); + new_linvel = Some(*target_part.3); + new_angvel = Some(*target_part.5); // and we're done! } else { warn!( @@ -274,26 +257,16 @@ fn dragging( part.0.translation.x = teleport_to_translation.x; part.0.translation.y = teleport_to_translation.y; part.0.rotation = teleport_to_rotation; // client calculates this; no reason to recalculate - if let Some(new_vel) = new_vel { + if let Some(new_vel) = new_linvel { *part.3 = new_vel; } + if let Some(new_vel) = new_angvel { + *part.5 = new_vel; + } // ( the math sucks ) } } -// LOGIC: **MUST** run BEFORE `dragging` -fn reprocess_reattached_parts( - reattached: Query<(Entity, &JointNeedsCreation)>, - mut commands: Commands, -) { - for (e, j) in &reattached { - commands - .entity(e) - .remove::() - .insert(j.0); - } -} - fn handle_new_players( mut commands: Commands, q_new_clients: Query>, @@ -338,7 +311,6 @@ fn handle_new_players( power_capacity: 25.0, power: 25.0, }) - .insert(Velocity::default()) .insert(Player { client: joined_player, }); @@ -355,7 +327,7 @@ fn player_thrust( mut players: Query<( &Transform, &Part, - &mut ExternalForce, + &mut ConstantForce, &mut PlayerThrust, &mut PlayerStorage, )>, @@ -385,13 +357,13 @@ fn player_thrust( ThrustEvent::Right(on) => thrust.right = on, } } - for (transform, part, mut force, thrust, mut storage) in &mut players { + for (transform, part, force, thrust, storage) in &mut players { let Some(world_config) = &world_config.config else { return; }; let forward = (transform.rotation * Vec3::Y).xy(); - let mut external_force = ExternalForce::default(); + let external_force = ConstantForce::default(); // indices are quadrants: // 1 | 0 @@ -430,28 +402,31 @@ fn player_thrust( world_config.part.default_height / 2.0, ) .length(); - external_force += ExternalForce::at_point( + + // TODO: TF does this mess even do? + /* + external_force += ConstantForce::at_point( -forward * thrusters[0] * world_config.hearty.thrust, transform.translation.xy() + half_size * Vec2::new((1.0 * PI / 4.0).cos(), (1.0 * PI / 4.0).sin()).rotate(forward), transform.translation.xy(), ); - external_force += ExternalForce::at_point( + external_force += ConstantForce::at_point( forward * thrusters[1] * world_config.hearty.thrust, transform.translation.xy() + half_size * Vec2::new((3.0 * PI / 4.0).cos(), (3.0 * PI / 4.0).sin()).rotate(forward), transform.translation.xy(), ); - external_force += ExternalForce::at_point( + external_force += ConstantForce::at_point( forward * thrusters[2] * world_config.hearty.thrust, transform.translation.xy() + half_size * Vec2::new((5.0 * PI / 4.0).cos(), (5.0 * PI / 4.0).sin()).rotate(forward), transform.translation.xy(), ); - external_force += ExternalForce::at_point( + external_force += ConstantForce::at_point( -forward * thrusters[3] * world_config.hearty.thrust, transform.translation.xy() + half_size @@ -461,6 +436,6 @@ fn player_thrust( *force += external_force; storage.fuel -= - thrusters.iter().sum::() * part.strong_config.thruster.as_ref().unwrap().flow_rate; + thrusters.iter().sum::() * part.strong_config.thruster.as_ref().unwrap().flow_rate;*/ } } diff --git a/crates/unified/src/server/system_sets.rs b/crates/unified/src/server/system_sets.rs index 5f108dc991e3ff971b2a2cae3854a4490b7c866e..0c404889dc144719b7931b1bf8bb9fc3d1f7cab2 100644 --- a/crates/unified/src/server/system_sets.rs +++ b/crates/unified/src/server/system_sets.rs @@ -1,4 +1,4 @@ -use bevy::prelude::SystemSet; +use crate::prelude::*; #[derive(SystemSet, Clone, PartialEq, Eq, Debug, Hash)] pub struct WorldUpdateSet; diff --git a/crates/unified/src/server/world_config.rs b/crates/unified/src/server/world_config.rs index 83310dc17cd9d8bebdf43660ae052b1187ef694f..721e5dbb314f4ade3885d9e457a1841ab893da67 100644 --- a/crates/unified/src/server/world_config.rs +++ b/crates/unified/src/server/world_config.rs @@ -1,6 +1,6 @@ use crate::config::world::GlobalWorldConfig; use bevy::asset::Handle; -use bevy::prelude::*; +use crate::prelude::*; pub fn world_config_plugin(app: &mut App) { app.init_resource::() diff --git a/crates/unified/src/server_plugins.rs b/crates/unified/src/server_plugins.rs index e2b26e4b524fee9c2b72594e81efcc9da78548d6..38aeb5911bcf7a702aeab42481c20631008da9d9 100644 --- a/crates/unified/src/server_plugins.rs +++ b/crates/unified/src/server_plugins.rs @@ -11,11 +11,12 @@ use bevy_common_assets::toml::TomlAssetPlugin; use bevy_replicon::RepliconPlugins; use std::net::SocketAddr; use std::time::Duration; +use avian2d::PhysicsPlugins; use bevy::state::app::StatesPlugin; pub struct ServerPluginGroup { pub bind: SocketAddr, - pub tick_rate: f64, + pub tick_rate: f32, pub max_clients: usize, } impl PluginGroup for ServerPluginGroup { @@ -25,7 +26,7 @@ impl PluginGroup for ServerPluginGroup { .add(TaskPoolPlugin::default()) .add(FrameCountPlugin) .add(TimePlugin) - .add(ScheduleRunnerPlugin::run_loop(Duration::from_secs_f64( + .add(ScheduleRunnerPlugin::run_loop(Duration::from_secs_f32( 1.0 / self.tick_rate, ))) .add_group(RepliconPlugins) diff --git a/crates/unified/src/shared_plugins.rs b/crates/unified/src/shared_plugins.rs index 919cedff8b4ab423191c44b8e185edd04e16e9ea..babd468211d6dd97f4f75b788acac04efe8d1af2 100644 --- a/crates/unified/src/shared_plugins.rs +++ b/crates/unified/src/shared_plugins.rs @@ -1,20 +1,27 @@ +use avian2d::PhysicsPlugins; use crate::attachment::{Joint, JointOf, PartInShip, Peer, Ship, SnapOf, SnapOfJoint}; use crate::config::planet::Planet; use crate::ecs::{DragRequestEvent, Part, Particles, Player, PlayerStorage, ThrustEvent}; use bevy::app::{App, PluginGroup, PluginGroupBuilder}; -use bevy::prelude::*; -use bevy::state::app::StatesPlugin; -use bevy_rapier2d::prelude::*; +use crate::prelude::*; +//use bevy_rapier2d::prelude::*; use bevy_replicon::prelude::{AppRuleExt, Channel, ClientMessageAppExt}; +use crate::physics::register_physics_components_for_replication; pub struct SharedPluginGroup; impl PluginGroup for SharedPluginGroup { fn build(self) -> PluginGroupBuilder { PluginGroupBuilder::start::() - .add(RapierPhysicsPlugin::::pixels_per_meter(100.0)) + //.add(RapierPhysicsPlugin::::pixels_per_meter(100.0)) + .add_group( + PhysicsPlugins::default() + .with_length_unit(100.0) + .set(PhysicsInterpolationPlugin::interpolate_all()) + ) .add(physics_setup_plugin) .add(register_everything) + .add(register_physics_components_for_replication) } } @@ -23,8 +30,8 @@ pub fn register_everything(app: &mut App) { .add_mapped_client_message::(Channel::Ordered) .replicate::() .replicate::() - .replicate::() - .replicate::() + //.replicate::() + //.replicate::() .replicate::() .replicate::() .replicate::() @@ -41,9 +48,17 @@ pub fn register_everything(app: &mut App) { } fn physics_setup_plugin(app: &mut App) { + app.insert_resource(Gravity::ZERO); app.add_systems(Startup, setup_physics); } +fn setup_physics( + +) { + +} + +/* fn setup_physics( mut rapier_config: Query<&mut RapierConfiguration>, mut rapier_context: Query<&mut RapierContextSimulation>, @@ -54,3 +69,4 @@ fn setup_physics( let mut params = ctx.integration_parameters; params.num_internal_stabilization_iterations = 16; } +*/ \ No newline at end of file