use rapier2d_f64::prelude::{RigidBodyHandle, RigidBodySet, ColliderBuilder, RigidBodyBuilder, ColliderSet};
use starkingdoms_protocol::{PlanetType, ProtocolPlanet};
use crate::{SCALE, manager::ClientHandlerMessage};
#[derive(Clone)]
pub struct Planet {
pub planet_type: PlanetType,
pub body_handle: RigidBodyHandle,
pub position: (f64, f64),
pub radius: f64,
pub mass: f64
}
#[derive(Default, Clone)]
pub struct Planets {
pub planets: Vec<Planet>,
}
impl Planets {
pub fn make_planet(planets: &mut Vec<Planet>, planet_type: PlanetType, mass: f64, radius: f64, position: (f64, f64), rigid_body_set: &mut RigidBodySet, collider_set: &mut ColliderSet) {
let collider = ColliderBuilder::ball(1000.0 / SCALE)
.build();
let body = RigidBodyBuilder::fixed()
.additional_mass(0.0);
let body_handle = rigid_body_set.insert(body);
collider_set.insert_with_parent(collider, body_handle, rigid_body_set);
planets.push(Planet {
planet_type,
body_handle,
position,
radius,
mass,
});
}
pub fn new(rigid_body_set: &mut RigidBodySet, collider_set: &mut ColliderSet) -> Planets {
let mut planets = Vec::new();
Planets::make_planet(
&mut planets,
PlanetType::Earth,
2000.0,
1000.0,
(0.0, 0.0),
rigid_body_set,
collider_set,
);
Planets { planets }
}
pub fn to_protocol(&self) -> ClientHandlerMessage {
let mut planets = vec![];
for planet in self.planets.clone() {
planets.push(ProtocolPlanet {
planet_type: planet.planet_type,
x: planet.position.0 * SCALE,
y: planet.position.1 * SCALE,
radius: planet.radius,
});
}
ClientHandlerMessage::PlanetData {
planets
}
}
}