1#![allow(
2 clippy::match_like_matches_macro,
4 clippy::redundant_pattern_matching,
6 clippy::needless_lifetimes,
8 clippy::new_without_default,
10 clippy::single_match,
12 clippy::vec_init_then_push,
14 clippy::missing_safety_doc,
16)]
17#![warn(
18 trivial_numeric_casts,
19 unused_extern_crates,
20 clippy::pattern_type_mismatch,
24)]
25
26mod system;
27
28pub use system::{ParticlePipeline, ParticleSystem, PipelineDesc};
29
30#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
31pub enum EmitterShape {
32 Point,
33 Sphere { radius: f32 },
34}
35
36#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
37pub struct Emitter {
38 pub rate: f32,
40 pub burst_count: u32,
42 pub shape: EmitterShape,
44 #[serde(default = "default_cone_angle")]
47 pub cone_angle: f32,
48}
49
50fn default_cone_angle() -> f32 {
51 std::f32::consts::PI
52}
53
54#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
55pub enum ColorConfig {
56 Solid([u8; 4]),
58 Palette(Vec<[u8; 4]>),
60}
61
62#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
63pub struct ParticleConfig {
64 pub life: [f32; 2],
66 pub speed: [f32; 2],
68 pub scale: [f32; 2],
70 pub color: ColorConfig,
72}
73
74#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
75pub struct ParticleEffect {
76 pub capacity: u32,
78 pub emitter: Emitter,
80 pub particle: ParticleConfig,
82}
83
84impl ParticleEffect {
85 pub fn load(source: &str) -> Result<Self, ron::error::SpannedError> {
86 ron::from_str(source)
87 }
88}
89
90#[repr(C)]
92#[derive(Clone, Copy, bytemuck::Zeroable, bytemuck::Pod)]
93pub struct CameraParams {
94 pub view_proj: [f32; 16],
96 pub camera_right: [f32; 4],
98 pub camera_up: [f32; 4],
100}