diff --git a/crates/comet_colors/src/hwba.rs b/crates/comet_colors/src/hwba.rs index d662f20..f99692d 100644 --- a/crates/comet_colors/src/hwba.rs +++ b/crates/comet_colors/src/hwba.rs @@ -94,12 +94,12 @@ impl Hwba { let w = self.whiteness.min(1.0 - self.blackness); let c = 1.0 - self.whiteness - self.blackness; - let hue = self.hue % 360.0; + let hue = (self.hue % 360.0 + 360.0) % 360.0; let h_prime = hue / 60.0; let x = c * (1.0 - (h_prime % 2.0 - 1.0).abs()); - let (r1, g1, b1) = match h_prime as u32 { + let (r1, g1, b1) = match h_prime.floor() as u32 { 0 => (c, x, 0.0), 1 => (x, c, 0.0), 2 => (0.0, c, x), @@ -110,20 +110,25 @@ impl Hwba { }; sRgba::::new( - r1 + w, - g1 + w, - b1 + w, + (r1 + w).min(1.0), + (g1 + w).min(1.0), + (b1 + w).min(1.0), self.alpha() ) + } pub fn to_hsva(&self) -> Hsva { + let value = 1.0 - self.blackness; + let saturation = 1.0 - (self.whiteness / value); + Hsva::new( self.hue, - 1.0 - self.hue / (1.0 - self.blackness), - 1.0 - self.blackness, + saturation, + value, self.alpha ) + } pub fn to_hsla(&self) -> Hsla { diff --git a/crates/comet_colors/src/lcha.rs b/crates/comet_colors/src/lcha.rs index 743d5b3..b1e9183 100644 --- a/crates/comet_colors/src/lcha.rs +++ b/crates/comet_colors/src/lcha.rs @@ -48,8 +48,8 @@ impl Lcha { pub fn to_laba(&self) -> Laba { Laba::new( self.lightness, - self.chroma * self.hue.cos().to_radians(), - self.chroma * self.hue.sin().to_radians(), + self.chroma * self.hue.to_radians().cos(), + self.chroma * self.hue.to_radians().sin(), self.alpha ) } diff --git a/crates/comet_colors/src/rgba.rs b/crates/comet_colors/src/rgba.rs index f11a5dc..156a904 100644 --- a/crates/comet_colors/src/rgba.rs +++ b/crates/comet_colors/src/rgba.rs @@ -151,7 +151,7 @@ impl sRgba { impl sRgba { pub fn new(red: f32, green: f32, blue: f32, alpha: f32) -> Self { - assert!((0.0..1.0).contains(&red) && (0.0..1.0).contains(&green) && (0.0..1.0).contains(&blue) && (0.0..1.0).contains(&alpha), "Red needs to be in range 0..1\nGreen needs to be in range 0..1\nBlue needs to be in range 0..1\nAlpha needs to be in range 0..1"); + assert!((0.0..=1.0).contains(&red) && (0.0..=1.0).contains(&green) && (0.0..=1.0).contains(&blue) && (0.0..=1.0).contains(&alpha), "Red needs to be in range 0..=1\nGreen needs to be in range 0..=1\nBlue needs to be in range 0..=1\nAlpha needs to be in range 0..=1"); Self { red, green, @@ -300,43 +300,29 @@ impl sRgba { } pub fn to_hwba(&self) -> Hwba { - let w = self.red.min(self.green).min(self.blue); - let v = self.red.max(self.green).max(self.blue); - let b = 1.0 - v; + let (r,g,b) = (self.red, self.green, self.blue); - if v == w { - return Hwba::new( - 0.0, - w, - b, - self.alpha() - ) - } + let c_max = r.max(g).max(b); + let c_min = r.min(g).min(b); + let delta = c_max - c_min; - let f = if self.red == v { - (self.green - self.blue) / (v - w) - } else if self.green == v { - (self.blue - self.red) / (v - w) + let mut hue = if c_max == self.red { + 60.0 * (((self.green - self.blue) / delta) % 6.0) + } else if c_max == self.green { + 60.0 * (((self.blue - self.red) / delta) + 2.0) + } else if c_max == self.blue { + 60.0 * (((self.red - self.green) / delta) + 4.0) } else { - (self.red - self.green) / (v - w) + 0.0 }; - let h = if self.red == v { - (f / 6.0) % 1.0 - } else if self.green == v { - (f + 2.0) / 6.0 - } else { - (f + 4.0) / 6.0 - }; - - let mut h = if h < 0.0 { h + 1.0 } else { h }; - h *= 360.0; + hue = if hue < 0.0 { hue + 360.0 } else { hue }; Hwba::new( - h, - w, - b, - self.alpha() as f32 / 255.0 + hue, + c_min, + 1.0 - c_max, + self.alpha ) } diff --git a/crates/comet_ecs/src/entity.rs b/crates/comet_ecs/src/entity.rs index f7ecefb..e23d357 100644 --- a/crates/comet_ecs/src/entity.rs +++ b/crates/comet_ecs/src/entity.rs @@ -7,7 +7,7 @@ pub struct Entity { } impl Entity { - pub fn new(id: u32) -> Self { + pub(crate) fn new(id: u32) -> Self { let mut components = BitSet::new(); components.insert(0); Self {