@@ 3,7 3,6 @@ use std::net::Ipv4Addr;
use bevy::utils::tracing;
use bevy::{ecs::event::ManualEventReader, prelude::*};
use bevy::math::{vec2, vec3};
-use bevy_rapier2d::na::{Rotation2, SVector};
use bevy_rapier2d::prelude::*;
use bevy_twite::{twite::frame::MessageType, ServerEvent, TwiteServerConfig, TwiteServerPlugin};
use component::*;
@@ 17,8 16,8 @@ pub mod packet;
const SCALE: f32 = 10.0;
const EARTH_SIZE: f32 = 1000.0;
const GRAVITY: f32 = 0.02;
-const PART_HALF_SIZE: f32 = 25.0 / SCALE;
-const THRUSTER_FORCE: f32 = 0.001;
+const PART_HALF_SIZE: f32 = 25.0;
+const THRUSTER_FORCE: f32 = 0.02;
fn main() {
let subscriber = tracing_subscriber::FmtSubscriber::new();
@@ 40,17 39,25 @@ fn main() {
})
.add_plugins(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(SCALE))
.add_plugins(TwiteServerPlugin)
+ .add_systems(Startup, setup_integration_parameters)
.add_systems(Startup, spawn_planets)
.add_systems(Update, on_message)
.add_systems(Update, on_close)
.add_systems(FixedUpdate, on_position_change)
.add_systems(FixedUpdate, gravity_update)
.add_systems(FixedUpdate, player_input_update)
+ //.insert_resource(Time::<Fixed>::from_seconds(1./20.))
.run();
info!("Goodbye!");
}
+fn setup_integration_parameters(mut context: ResMut<RapierContext>) {
+ context.integration_parameters.dt = 1./20.;
+ context.integration_parameters.joint_erp = 0.2;
+ context.integration_parameters.erp = 0.5;
+ context.integration_parameters.max_stabilization_iterations = 16;
+}
fn spawn_planets(mut commands: Commands) {
info!("Spawning planets");
let earth_pos = Transform::from_xyz(0.0, 0.0, 0.0);
@@ 60,7 67,7 @@ fn spawn_planets(mut commands: Commands) {
transform: TransformBundle::from(earth_pos),
})
.insert(Collider::ball(EARTH_SIZE / SCALE))
- .insert(AdditionalMassProperties::Mass(10000.0))
+ .insert(AdditionalMassProperties::Mass(4000.0))
.insert(ReadMassProperties::default())
.insert(RigidBody::Fixed);
}
@@ 106,13 113,14 @@ fn on_message(
.insert(Collider::cuboid(PART_HALF_SIZE / SCALE, PART_HALF_SIZE / SCALE))
.insert(AdditionalMassProperties::MassProperties(MassProperties {
local_center_of_mass: vec2(0., 0.),
- mass: 0.01,
- principal_inertia: 50.0,
+ mass: 0.0001,
+ principal_inertia: 0.005,
}))
.insert(ExternalImpulse {
impulse: Vec2::ZERO,
torque_impulse: 0.,
})
+ .insert(ExternalForce::default())
.insert(ReadMassProperties::default())
.insert(RigidBody::Dynamic)
.id()
@@ 352,15 360,17 @@ fn on_position_change(
}
fn player_input_update(
- mut player_and_body_query: Query<(Entity, &mut Player, &mut ExternalImpulse, &Transform)>,
+ mut player_and_body_query: Query<(Entity, &mut Player, &mut ExternalForce, &Transform)>,
) {
- for (_, player, mut impulses, transform) in &mut player_and_body_query {
+ for (_, player, mut forces, transform) in &mut player_and_body_query {
+ forces.torque = 0.;
+ forces.force = Vec2::ZERO;
if !(player.input.up || player.input.down || player.input.right || player.input.left) { continue; }
- let mut fmul_bottom_left_thruster = 0.0;
- let mut fmul_bottom_right_thruster = 0.0;
- let mut fmul_top_left_thruster = 0.0;
- let mut fmul_top_right_thruster = 0.0;
+ let mut fmul_bottom_left_thruster: f32 = 0.0;
+ let mut fmul_bottom_right_thruster: f32 = 0.0;
+ let mut fmul_top_left_thruster: f32 = 0.0;
+ let mut fmul_top_right_thruster: f32 = 0.0;
if player.input.up {
fmul_bottom_left_thruster -= 1.0;
fmul_bottom_right_thruster -= 1.0;
@@ 377,12 387,16 @@ fn player_input_update(
fmul_top_right_thruster += 1.0;
fmul_bottom_left_thruster -= 1.0;
}
+ fmul_top_left_thruster = fmul_top_left_thruster.clamp(-1.0, 1.0);
+ fmul_top_right_thruster = fmul_top_right_thruster.clamp(-1., 1.);
+ fmul_bottom_left_thruster = fmul_bottom_left_thruster.clamp(-1., 1.);
+ fmul_bottom_right_thruster = fmul_bottom_right_thruster.clamp(-1., 1.);
let rot = transform.rotation.to_euler(EulerRot::ZYX).0;
if fmul_bottom_left_thruster != 0. {
// we are applying a force to the bottom left thruster, so do the math to figure out where it is
- let bl_thruster_uncast = vec3(-PART_HALF_SIZE, -PART_HALF_SIZE, 0.0);
+ let bl_thruster_uncast = vec3(-PART_HALF_SIZE/SCALE, -PART_HALF_SIZE/SCALE, 0.0);
// so it turns out nalgeba is useless. because bevy. bevy makes everything difficult for physics
let bl_thruster_cast = vec2(bl_thruster_uncast.x * rot.cos() - bl_thruster_uncast.y * rot.sin(),
bl_thruster_uncast.x * rot.sin() + bl_thruster_uncast.y * rot.cos());
@@ 390,47 404,47 @@ fn player_input_update(
let bl_thruster_force = fmul_bottom_left_thruster * THRUSTER_FORCE;
- let bl_thruster_vec = vec2(-bl_thruster_force * rot.sin(), bl_thruster_force * rot.cos());
- let bl_impulse = ExternalImpulse::at_point(bl_thruster_vec, bl_thruster_cast, transform.translation.xy());
- impulses.impulse += bl_impulse.impulse;
- impulses.torque_impulse += bl_impulse.torque_impulse;
+ let bl_thruster_vec = vec2(-bl_thruster_force / SCALE * rot.sin(), bl_thruster_force / SCALE * rot.cos());
+ let bl_force = ExternalForce::at_point(bl_thruster_vec, bl_thruster_cast, transform.translation.xy());
+ forces.force += bl_force.force;
+ forces.torque += bl_force.torque;
}
if fmul_bottom_right_thruster != 0. {
- let br_thruster_uncast = vec3(PART_HALF_SIZE, -PART_HALF_SIZE, 0.0);
+ let br_thruster_uncast = vec3(PART_HALF_SIZE/SCALE, -PART_HALF_SIZE/SCALE, 0.0);
let br_thruster_cast = vec2(br_thruster_uncast.x * rot.cos() - br_thruster_uncast.y * rot.sin(),
br_thruster_uncast.x * rot.sin() + br_thruster_uncast.y * rot.cos());
let br_thruster_cast = br_thruster_cast + transform.translation.xy();
let br_thruster_force = fmul_bottom_right_thruster * THRUSTER_FORCE;
- let br_thruster_vec = vec2(-br_thruster_force * rot.sin(), br_thruster_force * rot.cos());
- let br_impulse = ExternalImpulse::at_point(br_thruster_vec, br_thruster_cast, transform.translation.xy());
- impulses.impulse += br_impulse.impulse;
- impulses.torque_impulse += br_impulse.torque_impulse;
+ let br_thruster_vec = vec2(-br_thruster_force / SCALE * rot.sin(), br_thruster_force / SCALE * rot.cos());
+ let br_force = ExternalForce::at_point(br_thruster_vec, br_thruster_cast, transform.translation.xy());
+ forces.force += br_force.force;
+ forces.torque += br_force.torque;
}
if fmul_top_left_thruster != 0. {
- let tl_thruster_uncast = vec3(-PART_HALF_SIZE, PART_HALF_SIZE, 0.0);
+ let tl_thruster_uncast = vec3(-PART_HALF_SIZE/SCALE, PART_HALF_SIZE/SCALE, 0.0);
let tl_thruster_cast = vec2(tl_thruster_uncast.x * rot.cos() - tl_thruster_uncast.y * rot.sin(),
tl_thruster_uncast.x * rot.sin() + tl_thruster_uncast.y * rot.cos());
let tl_thruster_cast = tl_thruster_cast + transform.translation.xy();
let tl_thruster_force = fmul_top_left_thruster * THRUSTER_FORCE;
- let tl_thruster_vec = vec2(-tl_thruster_force * rot.sin(), tl_thruster_force * rot.cos());
- let tl_impulse = ExternalImpulse::at_point(tl_thruster_vec, tl_thruster_cast, transform.translation.xy());
- impulses.impulse += tl_impulse.impulse;
- impulses.torque_impulse += tl_impulse.torque_impulse;
+ let tl_thruster_vec = vec2(-tl_thruster_force / SCALE * rot.sin(), tl_thruster_force / SCALE * rot.cos());
+ let tl_force = ExternalForce::at_point(tl_thruster_vec, tl_thruster_cast, transform.translation.xy());
+ forces.force += tl_force.force;
+ forces.torque += tl_force.torque;
}
if fmul_top_right_thruster != 0. {
- let tr_thruster_uncast = vec3(PART_HALF_SIZE, PART_HALF_SIZE, 0.0);
+ let tr_thruster_uncast = vec3(PART_HALF_SIZE/SCALE, PART_HALF_SIZE/SCALE, 0.0);
let tr_thruster_cast = vec2(tr_thruster_uncast.x * rot.cos() - tr_thruster_uncast.y * rot.sin(),
tr_thruster_uncast.x * rot.sin() + tr_thruster_uncast.y * rot.cos());
let tr_thruster_cast = tr_thruster_cast + transform.translation.xy();
let tr_thruster_force = fmul_top_right_thruster * THRUSTER_FORCE;
- let tr_thruster_vec = vec2(-tr_thruster_force * rot.sin(), tr_thruster_force * rot.cos());
- let tr_impulse = ExternalImpulse::at_point(tr_thruster_vec, tr_thruster_cast, transform.translation.xy());
- impulses.impulse += tr_impulse.impulse;
- impulses.torque_impulse += tr_impulse.torque_impulse;
+ let tr_thruster_vec = vec2(-tr_thruster_force / SCALE * rot.sin(), tr_thruster_force / SCALE * rot.cos());
+ let tr_force = ExternalForce::at_point(tr_thruster_vec, tr_thruster_cast, transform.translation.xy());
+ forces.force += tr_force.force;
+ forces.torque += tr_force.torque;
}
}