66 lines
1.5 KiB
Rust
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();
|
|
}
|
|
}
|