summaryrefslogtreecommitdiff
path: root/src/lunar/systems.rs
blob: 81fbbf2c8520ed275b5c453bf0a6c941fe91416d (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
47
48
49
50
use core::f32;

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;
    // println!("lunar transform: {}", new_transform);
    moon_transform.translation = Vec3 {x: new_transform.x, y: new_transform.y, z: 0.0};
    lod.period += dt * lod.orbital_velocity;
    lod.period = if lod.period <= 2. * f32::consts::PI { lod.period } else { 0. }
}
pub fn setup_moon(mut cmd: Commands) {
    let objective_planet = DestPlanet {
        // display_name: String::from("Objective Planet"),
        planet_mass_kg: 50000.0,
        radius: 30.0,
    };
    let lunar_radius = 225.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.0, orbital_radius: lunar_radius},
        RigidBody::Static,
        Transform::from_xyz(initial_transform.x, initial_transform.y, 0.0),
        Sprite::from_color(Color::BLACK, Vec2 { x: 30., y: 30. }),
        Collider::rectangle(r, r),
        Mass(m),
    ));
}