Galactica/src/game/system.rs
2023-12-27 19:51:58 -08:00

66 lines
1.5 KiB
Rust

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<f32>,
/// 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<f32>,
}
pub struct System {
pub name: String,
bodies: Vec<SystemObject>,
pub starfield: Vec<StarfieldStar>,
}
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<Sprite> {
return self.bodies.iter().map(|x| x.get_sprite()).collect();
}
}