extern crate serde;
use crate::laser::index::LaserIndex;
use serde::Serialize;
use specs::prelude::*;
extern crate nalgebra;
use crate::laser_cooling::CoolingLight;
#[derive(Clone, Copy, Default, Serialize)]
pub struct LaserSamplerMask {
pub filled: bool,
}
pub struct CoolingLaserSamplerMasks<const N: usize> {
pub contents: [LaserSamplerMask; N],
}
impl<const N: usize> Component for CoolingLaserSamplerMasks<N> {
type Storage = VecStorage<Self>;
}
pub struct InitialiseLaserSamplerMasksSystem<const N: usize>;
impl<'a, const N: usize> System<'a> for InitialiseLaserSamplerMasksSystem<N> {
type SystemData = (WriteStorage<'a, CoolingLaserSamplerMasks<N>>,);
fn run(&mut self, (mut masks,): Self::SystemData) {
use rayon::prelude::*;
(&mut masks).par_join().for_each(|mask| {
mask.contents = [LaserSamplerMask::default(); N];
});
}
}
pub struct FillLaserSamplerMasksSystem<const N: usize>;
impl<'a, const N: usize> System<'a> for FillLaserSamplerMasksSystem<N> {
type SystemData = (
ReadStorage<'a, LaserIndex>,
ReadStorage<'a, CoolingLight>,
WriteStorage<'a, CoolingLaserSamplerMasks<N>>,
);
fn run(&mut self, (light_index, cooling, mut masks): Self::SystemData) {
use rayon::prelude::*;
for (light_index, _) in (&light_index, &cooling).join() {
(&mut masks).par_join().for_each(|masks| {
masks.contents[light_index.index] = LaserSamplerMask { filled: true };
});
}
}
}