use yog_data::kinds::Texture;
use yog_data::with::{List, RefTo};
mod game {
pub const FRICTION: f32 = 0.98;
pub const LIFETIME: u32 = 20;
}
#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
pub struct ParticleDef {
pub id: String,
pub look: Particle,
}
#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
pub struct Particle {
#[data(with = "List<RefTo<Texture>>")]
pub textures: Vec<String>,
#[data(default)]
pub frames: Frames,
#[data(default = "one")]
pub frame_speed: f32,
#[data(default)]
pub frame_settle: bool,
#[data(default = "lifetime")]
pub lifetime: Lifetime,
#[data(default = "one")]
pub size: f32,
#[data(default = "one")]
pub size_per_tick: f32,
#[data(default = "one", range = "0..=1")]
pub alpha: f32,
#[data(default)]
pub fade: bool,
#[data(default = "friction")]
pub friction: f32,
#[data(default)]
pub gravity: f32,
#[data(default)]
pub gravity_needs_motion: bool,
#[data(default)]
pub physics: bool,
#[data(default)]
pub slide_when_blocked: bool,
#[data(default)]
pub random_roll: bool,
#[data(default)]
pub render: ParticleRender,
}
#[derive(yog_data::Schema, Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Frames {
Random,
#[default]
Age,
}
#[derive(yog_data::Schema, Debug, Clone, Copy, PartialEq, Eq)]
pub struct Lifetime {
pub min: u32,
pub max: u32,
}
#[derive(yog_data::Schema, Debug, Clone, Copy, PartialEq, Eq)]
pub struct ParticleRender {
#[data(default)]
pub blend: Blend,
#[data(default = "yes")]
pub depth_write: bool,
#[data(default)]
pub glow: bool,
}
impl Default for ParticleRender {
fn default() -> Self {
ParticleRender {
blend: Blend::default(),
depth_write: true,
glow: false,
}
}
}
#[derive(yog_data::Schema, Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Blend {
Opaque,
#[default]
Translucent,
Additive,
}
fn one() -> f32 {
1.0
}
fn yes() -> bool {
true
}
fn friction() -> f32 {
game::FRICTION
}
fn lifetime() -> Lifetime {
Lifetime {
min: game::LIFETIME,
max: game::LIFETIME,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_particle_says_only_what_isnt_the_games() {
let p = yog_data::from_text::<Particle>(
r#"{ textures: ["@texture:m:particle/cloud"], render: { blend: "additive" } }"#,
)
.unwrap()
.value;
assert_eq!(p.friction, game::FRICTION);
assert_eq!(p.lifetime, lifetime());
assert_eq!(p.frames, Frames::Age);
assert_eq!(p.render.blend, Blend::Additive);
assert!(p.render.depth_write && !p.render.glow);
}
}