use crate::*;
impl RenderEffect {
pub fn create<F>(effect_fn: F) -> Self
where
F: FnMut() + 'static,
{
let effect_inner: Rc<RefCell<RenderEffectInner>> = Rc::new(RefCell::new(
RenderEffectInner::new(Box::new(effect_fn), Vec::new(), false, false),
));
let effect: RenderEffect = RenderEffect::new(effect_inner.clone());
let addr: usize = effect.get_inner_addr();
render_effect_registry_mut().insert(addr, effect_inner);
effect.run_once();
effect
}
pub(crate) fn get_inner_addr(&self) -> usize {
Rc::as_ptr(self.get_inner()) as usize
}
pub(crate) fn run_once(&self) {
let effect_addr: usize = self.get_inner_addr();
{
let mut inner: RefMut<RenderEffectInner> = self.get_inner().borrow_mut();
if inner.get_disposed() {
return;
}
if inner.get_running() {
return;
}
inner.set_running(true);
cleanup_effect_dependencies(effect_addr, inner.get_mut_dependencies());
}
let prev: Option<usize> = swap_current_effect(Some(effect_addr));
{
let mut inner: RefMut<RenderEffectInner> = self.get_inner().borrow_mut();
(inner.get_mut_effect_fn())();
}
set_current_effect(prev);
{
let mut inner: RefMut<RenderEffectInner> = self.get_inner().borrow_mut();
inner.set_running(false);
}
}
pub fn dispose(&self) {
let effect_addr: usize = self.get_inner_addr();
let mut inner: RefMut<RenderEffectInner> = self.get_inner().borrow_mut();
if inner.get_disposed() {
return;
}
inner.set_disposed(true);
cleanup_effect_dependencies(effect_addr, inner.get_mut_dependencies());
}
}
unsafe impl Sync for EffectSubscribersCell {}
unsafe impl Sync for CurrentEffectCell {}
unsafe impl Sync for RenderEffectRegistryCell {}