extern crate nalgebra;
extern crate specs;
use super::MagneticFieldSampler;
use crate::ramp::Lerp;
use nalgebra::Vector3;
use specs::{Component, HashMapStorage, Join, ReadStorage, System, WriteStorage};
#[derive(Clone, Lerp)]
pub struct UniformMagneticField {
pub field: Vector3<f64>,
}
impl Component for UniformMagneticField {
type Storage = HashMapStorage<Self>;
}
impl UniformMagneticField {
pub fn gauss(components: Vector3<f64>) -> UniformMagneticField {
UniformMagneticField {
field: components * 1.0e-4,
}
}
pub fn tesla(components: Vector3<f64>) -> UniformMagneticField {
UniformMagneticField { field: components }
}
}
pub struct UniformMagneticFieldSystem;
impl<'a> System<'a> for UniformMagneticFieldSystem {
type SystemData = (
WriteStorage<'a, MagneticFieldSampler>,
ReadStorage<'a, UniformMagneticField>,
);
fn run(&mut self, (mut samplers, fields): Self::SystemData) {
use rayon::prelude::*;
use specs::ParJoin;
for field in (&fields).join() {
(&mut samplers).par_join().for_each(|sampler| {
sampler.field += field.field;
});
}
}
}