use cgmath::{Point3, Vector2}; use rand::{self, Rng}; use super::SystemObject; use crate::{consts, content, render::Sprite, render::SpriteTexture}; pub struct StarfieldStar { /// Star coordinates, in world space. /// These are relative to the center of a starfield tile. pub pos: Point3, /// Height in game units. /// Will be scaled for zoom, but not for distance. pub size: f32, /// Color/brightness variation. Random between 0 and 1. /// Used in starfield shader. pub tint: Vector2, } pub struct System { pub name: String, bodies: Vec, pub starfield: Vec, } impl System { pub fn new(ct: &content::System) -> Self { let mut rng = rand::thread_rng(); let sz = consts::STARFIELD_SIZE as f32 / 2.0; let mut s = System { name: ct.name.clone(), bodies: Vec::new(), starfield: (0..consts::STARFIELD_COUNT) .map(|_| StarfieldStar { pos: Point3 { x: rng.gen_range(-sz..=sz), y: rng.gen_range(-sz..=sz), z: rng.gen_range(consts::STARFIELD_Z_MIN..consts::STARFIELD_Z_MAX), }, size: rng.gen_range(consts::STARFIELD_SIZE_MIN..consts::STARFIELD_SIZE_MAX), tint: Vector2 { x: rng.gen_range(0.0..=1.0), y: rng.gen_range(0.0..=1.0), }, }) .collect(), }; for o in &ct.objects { s.bodies.push(SystemObject { pos: o.position, sprite: SpriteTexture(o.sprite.to_owned()), size: o.size, angle: o.angle, }); } return s; } pub fn get_sprites(&self) -> Vec { return self.bodies.iter().map(|x| x.get_sprite()).collect(); } }