use crate::particle_emitter3::*;
use crate::particle_system_data3::ParticleSystemData3Ptr;
use std::sync::{RwLock, Arc};
pub type OnBeginUpdateCallback = fn(&mut ParticleEmitterSet3, f64, f64);
pub struct ParticleEmitterSet3 {
_emitters: Vec<ParticleEmitter3Ptr>,
_emitter_data: ParticleEmitter3Data,
_on_begin_update_callback: Option<OnBeginUpdateCallback>,
}
impl ParticleEmitterSet3 {
pub fn new_default() -> ParticleEmitterSet3 {
return ParticleEmitterSet3 {
_emitters: vec![],
_emitter_data: ParticleEmitter3Data::new(),
_on_begin_update_callback: None,
};
}
pub fn new(emitters: Vec<ParticleEmitter3Ptr>) -> ParticleEmitterSet3 {
return ParticleEmitterSet3 {
_emitters: emitters,
_emitter_data: ParticleEmitter3Data::new(),
_on_begin_update_callback: None,
};
}
pub fn add_emitter(&mut self, emitter: ParticleEmitter3Ptr) {
self._emitters.push(emitter);
}
pub fn set_on_begin_update_callback(&mut self, callback: OnBeginUpdateCallback) {
self._on_begin_update_callback = Some(callback);
}
}
impl ParticleEmitter3 for ParticleEmitterSet3 {
fn update(&mut self, current_time_in_seconds: f64, time_interval_in_seconds: f64) {
match self._on_begin_update_callback {
None => {}
Some(callback) => {
callback(self, current_time_in_seconds,
time_interval_in_seconds);
}
}
self.on_update(current_time_in_seconds, time_interval_in_seconds);
}
fn on_set_target(&self, particles: ParticleSystemData3Ptr) {
for emitter in &self._emitters {
emitter.write().unwrap().set_target(particles.clone());
}
}
fn on_update(&mut self, current_time_in_seconds: f64, time_interval_in_seconds: f64) {
if !self.is_enabled() {
return;
}
for emitter in &self._emitters {
emitter.write().unwrap().update(current_time_in_seconds, time_interval_in_seconds);
}
}
fn view(&self) -> &ParticleEmitter3Data {
return &self._emitter_data;
}
fn view_mut(&mut self) -> &mut ParticleEmitter3Data {
return &mut self._emitter_data;
}
}
pub type ParticleEmitterSet3Ptr = Arc<RwLock<ParticleEmitterSet3>>;
pub struct Builder {
_emitters: Vec<ParticleEmitter3Ptr>,
}
impl Builder {
pub fn with_emitters(&mut self, emitters: Vec<ParticleEmitter3Ptr>) -> &mut Self {
self._emitters = emitters;
return self;
}
pub fn build(&mut self) -> ParticleEmitterSet3 {
return ParticleEmitterSet3::new(self._emitters.clone());
}
pub fn make_shared(&mut self) -> ParticleEmitterSet3Ptr {
return ParticleEmitterSet3Ptr::new(RwLock::new(self.build()));
}
pub fn new() -> Builder {
return Builder {
_emitters: vec![]
};
}
}