summaryrefslogtreecommitdiff
path: root/src/lunar/systems.rs
blob: e9aed521c2462bf3e65fa75fc8304839d51a2d7d (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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use core::f32;

use bevy::prelude::*;
use avian2d::prelude::*;
use crate::StartPlanet;
use crate::Stickable;
use crate::TouchdownGoal;

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>,
    goal: Res<TouchdownGoal>,
    mut lunar_query: Query<(
        &DestPlanet, 
        &mut LunarOrbitalData, 
        &mut Transform, 
        &mut LinearVelocity,
        &RigidBody
    ), (With<DestPlanet>, Without<StartPlanet>)>,
    mut solar_query: Query<(
        &Transform
    ), (With<StartPlanet>, Without<DestPlanet>)>,
) {
    if goal.reached {return;}
    let (_moon_planet, mut lod, mut moon_transform, mut moon_vel, _moon_body) = lunar_query.single_mut();
    let (solar_transform) = solar_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};
    moon_vel.0 = (new_transform - moon_transform.translation.xy() + solar_transform.translation.xy()) * 100.0 * dt;
    println!("lunar transform: {}", moon_transform.translation);
    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 = 300.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::Dynamic,
        Transform::from_xyz(initial_transform.x, initial_transform.y, 0.0),
        LockedAxes::ROTATION_LOCKED,
        LinearVelocity::ZERO,
        Stickable {},
        Sprite::from_color(Color::BLACK, Vec2 { x: 30., y: 30. }),
        Collider::rectangle(r, r),
        Mass(m),
    ));
}