rust_lum/src/patterns/fill_random.rs

39 lines
1.1 KiB
Rust

use crate::patterns::{Pattern, PixelColor};
use crate::{impl_pattern_none, Strip};
use serde::{Deserialize, Serialize};
/// # FillRandom
///
/// fill strip with color then apply random variation to each pixel
#[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Copy, Clone)]
pub struct FillRandom<const N: usize> {
pub(crate) color: PixelColor,
pub(crate) stability: usize,
pub(crate) max_iteration: Option<usize>,
#[serde(default)]
pub(crate) current_iteration: usize,
}
impl<const N: usize> Pattern for FillRandom<N> {
impl_pattern_none!(FadeRandom, N);
}
impl<const N: usize> Iterator for FillRandom<N> {
type Item = Strip<N>;
fn next(&mut self) -> Option<Self::Item> {
if self.is_last_iteration() {
return None;
}
let mut strip = Strip::<N>::default();
let rng = rand::thread_rng();
for i in 0..N {
let c = self.color.random_delta(self.stability, &mut rng.clone());
strip[i] = Some(c);
}
self.current_iteration += 1;
Some(strip)
}
}