summaryrefslogtreecommitdiff
path: root/src/lunar/systems.rs
blob: 4cdebdc8caa7723d35cc02d8d000a23fab0e8971 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use bevy::prelude::*;
use avian2d::prelude::*;
use super::DestPlanet;
use super::LunarOrbitalData;
pub fn lunar_period_to_vec(angular_pos: f32, radius: f32) -> Vec2 {
    let x = radius * f32::cos(angular_pos);
    let y = radius * f32::sin(angular_pos);
    Vec2 { x, y }
}
pub fn update_lunar_transform(
    time: Res<Time>,
    mut lunar_query: Query<(
        &DestPlanet, 
        &mut LunarOrbitalData, 
        &mut Transform, 
        &RigidBody
    ), With<DestPlanet>>,
) {
    let (_moon_planet, mut lod, mut moon_transform, _moon_body) = lunar_query.single_mut();
    let dt = time.delta_secs();
    let new_transform = lunar_period_to_vec(
        lod.period, 
        lod.orbital_radius).normalize_or_zero() * lod.orbital_radius;
    moon_transform.translation = Vec3 {x: new_transform.x, y: new_transform.y, z: 0.0};
    lod.period = dt * lod.orbital_velocity;
}
pub fn setup_moon(mut cmd: Commands) {
    let objective_planet = DestPlanet {
        // display_name: String::from("Objective Planet"),
        planet_mass_kg: 50.0,
        radius: 5.0,
    };
    let lunar_radius = 900.0;
    let r = (&objective_planet).radius;
    let m = (&objective_planet).planet_mass_kg;
    let initial_transform = lunar_period_to_vec(0., 100.);
    cmd.spawn((
        objective_planet,
        LunarOrbitalData { period: 0., orbital_velocity: 1., orbital_radius: lunar_radius},
        RigidBody::Dynamic,
        Transform::from_xyz(initial_transform.x, initial_transform.y, 0.0),
        Sprite::from_color(Color::BLACK, Vec2 { x: 30., y: 30. }),
        Collider::circle(r),
        Mass(m),
    ));
}