From 7e8e500ddfd29d6b7102309becba48aaca52fd74 Mon Sep 17 00:00:00 2001 From: ghostlyzsh Date: Sun, 26 Nov 2023 20:45:44 -0600 Subject: [PATCH] added gravity --- server/src/main.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/server/src/main.rs b/server/src/main.rs index f2437696f1615b9205464a563f169a6f2028623e..c01e16b8023f465e82e891c4a40ab31b7019d77d 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -14,6 +14,7 @@ pub mod macros; const SCALE: f32 = 10.0; const EARTH_SIZE: f32 = 1000.0; +const GRAVITY: f32 = 0.02; fn main() { let subscriber = tracing_subscriber::FmtSubscriber::new(); @@ -33,10 +34,10 @@ fn main() { .add_plugins(RapierPhysicsPlugin::::pixels_per_meter(SCALE)) .add_plugins(TwiteServerPlugin) .add_systems(Startup, spawn_planets) - //.add_systems(Update, on_connection) .add_systems(Update, on_message) .add_systems(Update, on_close) .add_systems(FixedUpdate, on_position_change) + .add_systems(FixedUpdate, do_gravity) .run(); info!("Goodbye!"); @@ -51,6 +52,8 @@ fn spawn_planets(mut commands: Commands) { transform: TransformBundle::from(earth_pos), }) .insert(Collider::ball(EARTH_SIZE / SCALE)) + .insert(AdditionalMassProperties::Mass(10000.0)) + .insert(ReadMassProperties::default()) .insert(RigidBody::Fixed); } @@ -91,6 +94,9 @@ fn on_message( player: Player { addr: *addr, username: username.to_string() }, }) .insert(Collider::cuboid(25.0 / SCALE, 25.0 / SCALE)) + .insert(AdditionalMassProperties::Mass(10.0)) + .insert(ExternalImpulse { impulse: Vec2::ZERO, torque_impulse: 0. }) + .insert(ReadMassProperties::default()) .insert(RigidBody::Dynamic) .id().index(); @@ -228,3 +234,24 @@ fn on_position_change( packet_send.send(ServerEvent::Broadcast(MessageType::Text, buf)); } } + +fn do_gravity( + mut part_query: Query<(&Transform, &ReadMassProperties, &mut ExternalImpulse), With>, + planet_query: Query<(&Transform, &ReadMassProperties), With>, +) { + for (part_transform, part_mp, mut impulses) in &mut part_query { + impulses.impulse = Vec2::ZERO; + let part_mp = part_mp.get(); + let part_mass = part_mp.mass; + let part_translate = part_transform.translation; + for (planet_transform, planet_mp) in &planet_query { + let planet_mp = planet_mp.get(); + let planet_mass = planet_mp.mass; + let planet_translate = planet_transform.translation; + let distance = planet_translate.distance(part_translate); + let force = GRAVITY * ((part_mass * planet_mass) / (distance * distance)); + let direction = (planet_translate - part_translate).normalize() * force; + impulses.impulse += direction.xy(); + } + } +}