fyrox_impl/scene/particle_system/emitter/
mod.rsuse crate::{
core::{reflect::prelude::*, visitor::prelude::*},
scene::particle_system::{
emitter::{
base::BaseEmitter, cuboid::CuboidEmitter, cylinder::CylinderEmitter,
sphere::SphereEmitter,
},
Particle, ParticleSystemRng,
},
};
use fyrox_core::uuid_provider;
use std::ops::{Deref, DerefMut};
use strum_macros::{AsRefStr, EnumString, VariantNames};
pub mod base;
pub mod cuboid;
pub mod cylinder;
pub mod sphere;
pub trait Emit {
fn emit(&self, particle: &mut Particle, rng: &mut ParticleSystemRng);
}
#[derive(PartialEq, Debug, Reflect, AsRefStr, EnumString, VariantNames)]
pub enum Emitter {
Cuboid(CuboidEmitter),
Sphere(SphereEmitter),
Cylinder(CylinderEmitter),
}
uuid_provider!(Emitter = "4cad87ed-6b2c-411d-8c05-86dc26e463b2");
impl Emitter {
pub fn new(id: i32) -> Result<Self, String> {
match id {
1 => Ok(Self::Cuboid(Default::default())),
2 => Ok(Self::Sphere(Default::default())),
3 => Ok(Self::Cylinder(Default::default())),
_ => Err(format!("Invalid emitter id {}!", id)),
}
}
pub fn id(&self) -> i32 {
match self {
Self::Cuboid(_) => 1,
Self::Sphere(_) => 2,
Self::Cylinder(_) => 3,
}
}
}
macro_rules! static_dispatch {
($self:ident, $func:ident, $($args:expr),*) => {
match $self {
Emitter::Cuboid(v) => v.$func($($args),*),
Emitter::Sphere(v) => v.$func($($args),*),
Emitter::Cylinder(v) => v.$func($($args),*),
}
};
}
impl Visit for Emitter {
fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult {
let mut kind_id: i32 = self.id();
kind_id.visit("KindId", visitor)?;
if visitor.is_reading() {
*self = Emitter::new(kind_id)?;
}
static_dispatch!(self, visit, name, visitor)
}
}
impl Emit for Emitter {
fn emit(&self, particle: &mut Particle, rng: &mut ParticleSystemRng) {
static_dispatch!(self, emit, particle, rng)
}
}
impl Clone for Emitter {
fn clone(&self) -> Self {
match self {
Self::Cuboid(box_emitter) => Self::Cuboid(box_emitter.clone()),
Self::Sphere(sphere_emitter) => Self::Sphere(sphere_emitter.clone()),
Self::Cylinder(cylinder) => Self::Cylinder(cylinder.clone()),
}
}
}
impl Deref for Emitter {
type Target = BaseEmitter;
fn deref(&self) -> &Self::Target {
static_dispatch!(self, deref,)
}
}
impl DerefMut for Emitter {
fn deref_mut(&mut self) -> &mut Self::Target {
static_dispatch!(self, deref_mut,)
}
}
impl Default for Emitter {
fn default() -> Self {
Self::Cuboid(Default::default())
}
}