diff --git a/crates/tek_core/src/color.rs b/crates/tek_core/src/color.rs index 5455babb..d08d8fcc 100644 --- a/crates/tek_core/src/color.rs +++ b/crates/tek_core/src/color.rs @@ -24,16 +24,24 @@ impl From for ItemColor { fn from (rgb: Color) -> Self { Self { rgb, okhsl: rgb_to_okhsl(rgb) } } } impl ItemColor { - pub fn random () -> Self { random_okhsl().into() } + pub fn random () -> Self { + let mut rng = thread_rng(); + let lo = Okhsl::new(-180.0, 0.01, 0.2); + let hi = Okhsl::new( 180.0, 0.9, 0.5); + UniformOkhsl::new(lo, hi).sample(&mut rng).into() + } pub fn random_dark () -> Self { let mut rng = thread_rng(); let lo = Okhsl::new(-180.0, 0.01, 0.05); let hi = Okhsl::new( 180.0, 0.5, 0.2); UniformOkhsl::new(lo, hi).sample(&mut rng).into() } - pub fn random_near (other: Self, distance: f32) -> Self { - if distance > 1.0 { panic!("ItemColor::random_near takes distance between 0.0 and 1.0"); } - other.okhsl.mix(random_okhsl(), distance).into() + pub fn random_near (base: Self, distance: f32) -> Self { + base.mix(Self::random(), distance) + } + pub fn mix (&self, other: Self, distance: f32) -> Self { + if distance > 1.0 { panic!("color mixing takes distance between 0.0 and 1.0"); } + self.okhsl.mix(other.okhsl, distance).into() } } impl From for ItemColorTriplet { @@ -47,19 +55,10 @@ impl From for ItemColorTriplet { Self { base, light: light.into(), dark: dark.into() } } } - -pub fn random_okhsl () -> Okhsl { - let mut rng = thread_rng(); - let lo = Okhsl::new(-180.0, 0.01, 0.2); - let hi = Okhsl::new( 180.0, 0.9, 0.5); - UniformOkhsl::new(lo, hi).sample(&mut rng) -} - pub fn okhsl_to_rgb (color: Okhsl) -> Color { let Srgb { red, green, blue, .. }: Srgb = Srgb::from_color_unclamped(color); Color::Rgb((red * 255.0) as u8, (green * 255.0) as u8, (blue * 255.0) as u8,) } - pub fn rgb_to_okhsl (color: Color) -> Okhsl { if let Color::Rgb(r, g, b) = color { Okhsl::from_color(Srgb::new( diff --git a/crates/tek_sequencer/src/arranger_cli.rs b/crates/tek_sequencer/src/arranger_cli.rs index d775fa57..c5980da4 100644 --- a/crates/tek_sequencer/src/arranger_cli.rs +++ b/crates/tek_sequencer/src/arranger_cli.rs @@ -28,20 +28,20 @@ impl ArrangerCli { if let Some(name) = self.name.as_ref() { *arrangement.name.write().unwrap() = name.clone(); } - let track_color_1 = random_okhsl(); - let track_color_2 = random_okhsl(); + let track_color_1 = ItemColor::random(); + let track_color_2 = ItemColor::random(); for i in 0..self.tracks { let _track = arrangement.track_add( None, - Some(track_color_1.mix(track_color_2, i as f32 / self.tracks as f32).into()) + Some(track_color_1.mix(track_color_2, i as f32 / self.tracks as f32)) )?; } - let scene_color_1 = random_okhsl(); - let scene_color_2 = random_okhsl(); + let scene_color_1 = ItemColor::random(); + let scene_color_2 = ItemColor::random(); for i in 0..self.scenes { let _scene = arrangement.scene_add( None, - Some(scene_color_1.mix(scene_color_2, i as f32 / self.scenes as f32).into()) + Some(scene_color_1.mix(scene_color_2, i as f32 / self.scenes as f32)) )?; } let arranger = Arc::new(RwLock::new(Arranger::new(