fyrox_impl/scene/particle_system/emitter/
mod.rs1use crate::{
25 core::{reflect::prelude::*, visitor::prelude::*},
26 scene::particle_system::{
27 emitter::{
28 base::BaseEmitter, cuboid::CuboidEmitter, cylinder::CylinderEmitter,
29 sphere::SphereEmitter,
30 },
31 Particle, ParticleSystemRng,
32 },
33};
34use fyrox_core::uuid_provider;
35use std::ops::{Deref, DerefMut};
36use strum_macros::{AsRefStr, EnumString, VariantNames};
37
38pub mod base;
39pub mod cuboid;
40pub mod cylinder;
41pub mod sphere;
42
43pub trait Emit {
45 fn emit(&self, particle: &mut Particle, rng: &mut ParticleSystemRng);
47}
48
49#[derive(PartialEq, Debug, Reflect, AsRefStr, EnumString, VariantNames)]
51pub enum Emitter {
52 Cuboid(CuboidEmitter),
54 Sphere(SphereEmitter),
56 Cylinder(CylinderEmitter),
58}
59
60uuid_provider!(Emitter = "4cad87ed-6b2c-411d-8c05-86dc26e463b2");
61
62impl Emitter {
63 pub fn new(id: i32) -> Result<Self, String> {
65 match id {
66 1 => Ok(Self::Cuboid(Default::default())),
67 2 => Ok(Self::Sphere(Default::default())),
68 3 => Ok(Self::Cylinder(Default::default())),
69 _ => Err(format!("Invalid emitter id {id}!")),
70 }
71 }
72
73 pub fn id(&self) -> i32 {
75 match self {
76 Self::Cuboid(_) => 1,
77 Self::Sphere(_) => 2,
78 Self::Cylinder(_) => 3,
79 }
80 }
81}
82
83macro_rules! static_dispatch {
84 ($self:ident, $func:ident, $($args:expr),*) => {
85 match $self {
86 Emitter::Cuboid(v) => v.$func($($args),*),
87 Emitter::Sphere(v) => v.$func($($args),*),
88 Emitter::Cylinder(v) => v.$func($($args),*),
89 }
90 };
91}
92
93impl Visit for Emitter {
94 fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult {
95 let mut kind_id: i32 = self.id();
96 kind_id.visit("KindId", visitor)?;
97 if visitor.is_reading() {
98 *self = Emitter::new(kind_id)?;
99 }
100
101 static_dispatch!(self, visit, name, visitor)
102 }
103}
104
105impl Emit for Emitter {
106 fn emit(&self, particle: &mut Particle, rng: &mut ParticleSystemRng) {
107 static_dispatch!(self, emit, particle, rng)
108 }
109}
110
111impl Clone for Emitter {
112 fn clone(&self) -> Self {
113 match self {
114 Self::Cuboid(box_emitter) => Self::Cuboid(box_emitter.clone()),
115 Self::Sphere(sphere_emitter) => Self::Sphere(sphere_emitter.clone()),
116 Self::Cylinder(cylinder) => Self::Cylinder(cylinder.clone()),
117 }
118 }
119}
120
121impl Deref for Emitter {
122 type Target = BaseEmitter;
123
124 fn deref(&self) -> &Self::Target {
125 static_dispatch!(self, deref,)
126 }
127}
128
129impl DerefMut for Emitter {
130 fn deref_mut(&mut self) -> &mut Self::Target {
131 static_dispatch!(self, deref_mut,)
132 }
133}
134
135impl Default for Emitter {
136 fn default() -> Self {
137 Self::Cuboid(Default::default())
138 }
139}