From 54ea9361860611b599b5232c0bd4923af6b2c273 Mon Sep 17 00:00:00 2001 From: Earthmark Date: Sat, 4 May 2024 13:04:53 -0700 Subject: [PATCH 01/11] Added a Grey trait to allow colors to create a generic "grey" color. This currently assumes the color spaces follow the same gradient progressing, which I'm pretty sure isn't true, but it should make a "grey-ish" color relative to the provided intensity. --- crates/bevy_color/src/color_ops.rs | 6 ++++++ crates/bevy_color/src/hsla.rs | 10 ++++++++-- crates/bevy_color/src/hsva.rs | 10 +++++++++- crates/bevy_color/src/hwba.rs | 8 +++++++- crates/bevy_color/src/laba.rs | 10 ++++++++-- crates/bevy_color/src/lcha.rs | 10 +++++++++- crates/bevy_color/src/linear_rgba.rs | 8 +++++++- crates/bevy_color/src/oklaba.rs | 10 ++++++++-- crates/bevy_color/src/oklcha.rs | 10 ++++++++-- crates/bevy_color/src/srgba.rs | 10 ++++++++-- crates/bevy_color/src/xyza.rs | 9 ++++++++- 11 files changed, 86 insertions(+), 15 deletions(-) diff --git a/crates/bevy_color/src/color_ops.rs b/crates/bevy_color/src/color_ops.rs index 1f39f3254c489..9bafbde056966 100644 --- a/crates/bevy_color/src/color_ops.rs +++ b/crates/bevy_color/src/color_ops.rs @@ -80,6 +80,12 @@ pub trait Hue: Sized { } } +/// Trait for returning a grayscale color of a provided intensity. +pub trait Gray: Sized { + /// Returns a grey color with the provided intensity from (0.0 - 1.0). + fn gray(intensity: f32) -> Self; +} + /// Trait with methods for asserting a colorspace is within bounds. /// /// During ordinary usage (e.g. reading images from disk, rendering images, picking colors for UI), colors should always be within their ordinary bounds (such as 0 to 1 for RGB colors). diff --git a/crates/bevy_color/src/hsla.rs b/crates/bevy_color/src/hsla.rs index 3c225b369ddab..e9fc7588f3da6 100644 --- a/crates/bevy_color/src/hsla.rs +++ b/crates/bevy_color/src/hsla.rs @@ -1,6 +1,6 @@ use crate::{ - Alpha, ClampColor, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, - Xyza, + Alpha, ClampColor, Gray, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, + StandardColor, Xyza, }; use bevy_reflect::prelude::*; @@ -195,6 +195,12 @@ impl ClampColor for Hsla { } } +impl Gray for Hsla { + fn gray(intensity: f32) -> Self { + Self::new(0., 0., intensity, 1.) + } +} + impl From for Hsva { fn from( Hsla { diff --git a/crates/bevy_color/src/hsva.rs b/crates/bevy_color/src/hsva.rs index f58cdefac5659..a347d1066ae57 100644 --- a/crates/bevy_color/src/hsva.rs +++ b/crates/bevy_color/src/hsva.rs @@ -1,4 +1,6 @@ -use crate::{Alpha, ClampColor, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza}; +use crate::{ + Alpha, ClampColor, Gray, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza, +}; use bevy_reflect::prelude::*; /// Color in Hue-Saturation-Value (HSV) color space with alpha. @@ -138,6 +140,12 @@ impl ClampColor for Hsva { } } +impl Gray for Hsva { + fn gray(intensity: f32) -> Self { + Self::new(0., 0., intensity, 1.) + } +} + impl From for Hwba { fn from( Hsva { diff --git a/crates/bevy_color/src/hwba.rs b/crates/bevy_color/src/hwba.rs index f5e7cf3a93c38..cdbad8af8ced5 100644 --- a/crates/bevy_color/src/hwba.rs +++ b/crates/bevy_color/src/hwba.rs @@ -2,7 +2,7 @@ //! in [_HWB - A More Intuitive Hue-Based Color Model_] by _Smith et al_. //! //! [_HWB - A More Intuitive Hue-Based Color Model_]: https://web.archive.org/web/20240226005220/http://alvyray.com/Papers/CG/HWB_JGTv208.pdf -use crate::{Alpha, ClampColor, Hue, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza}; +use crate::{Alpha, ClampColor, Gray, Hue, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza}; use bevy_reflect::prelude::*; /// Color in Hue-Whiteness-Blackness (HWB) color space with alpha. @@ -142,6 +142,12 @@ impl ClampColor for Hwba { } } +impl Gray for Hwba { + fn gray(intensity: f32) -> Self { + Self::new(0., intensity, 1. - intensity, 1.) + } +} + impl From for Hwba { fn from( Srgba { diff --git a/crates/bevy_color/src/laba.rs b/crates/bevy_color/src/laba.rs index 2ce9b55b72393..8a900b7346087 100644 --- a/crates/bevy_color/src/laba.rs +++ b/crates/bevy_color/src/laba.rs @@ -1,6 +1,6 @@ use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, Hsla, Hsva, Hwba, LinearRgba, Luminance, - Mix, Oklaba, Srgba, StandardColor, Xyza, + impl_componentwise_vector_space, Alpha, ClampColor, Gray, Hsla, Hsva, Hwba, LinearRgba, + Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza, }; use bevy_reflect::prelude::*; @@ -164,6 +164,12 @@ impl Luminance for Laba { } } +impl Gray for Laba { + fn gray(intensity: f32) -> Self { + Self::new(intensity * 1.5, 0., 0., 1.) + } +} + impl From for Xyza { fn from( Laba { diff --git a/crates/bevy_color/src/lcha.rs b/crates/bevy_color/src/lcha.rs index b33236d6f10ed..040f8f0aef60a 100644 --- a/crates/bevy_color/src/lcha.rs +++ b/crates/bevy_color/src/lcha.rs @@ -1,4 +1,6 @@ -use crate::{Alpha, ClampColor, Hue, Laba, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza}; +use crate::{ + Alpha, ClampColor, Gray, Hue, Laba, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, +}; use bevy_reflect::prelude::*; /// Color in LCH color space, with alpha @@ -200,6 +202,12 @@ impl ClampColor for Lcha { } } +impl Gray for Lcha { + fn gray(intensity: f32) -> Self { + Self::new(intensity * 1.5, 0., 0., 1.) + } +} + impl From for Laba { fn from( Lcha { diff --git a/crates/bevy_color/src/linear_rgba.rs b/crates/bevy_color/src/linear_rgba.rs index 3eb0646ff0979..f63bf22847e25 100644 --- a/crates/bevy_color/src/linear_rgba.rs +++ b/crates/bevy_color/src/linear_rgba.rs @@ -1,5 +1,5 @@ use crate::{ - color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, + color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Gray, Luminance, Mix, StandardColor, }; use bevy_math::Vec4; @@ -281,6 +281,12 @@ impl ClampColor for LinearRgba { } } +impl Gray for LinearRgba { + fn gray(intensity: f32) -> Self { + Self::new(intensity, intensity, intensity, 1.) + } +} + impl From for [f32; 4] { fn from(color: LinearRgba) -> Self { [color.red, color.green, color.blue, color.alpha] diff --git a/crates/bevy_color/src/oklaba.rs b/crates/bevy_color/src/oklaba.rs index 858091a719de6..1db6895e415f2 100644 --- a/crates/bevy_color/src/oklaba.rs +++ b/crates/bevy_color/src/oklaba.rs @@ -1,6 +1,6 @@ use crate::{ - color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Hsla, - Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, + color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Gray, + Hsla, Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, }; use bevy_reflect::prelude::*; @@ -173,6 +173,12 @@ impl ClampColor for Oklaba { } } +impl Gray for Oklaba { + fn gray(intensity: f32) -> Self { + Self::new(intensity, 0., 0., 1.) + } +} + #[allow(clippy::excessive_precision)] impl From for Oklaba { fn from(value: LinearRgba) -> Self { diff --git a/crates/bevy_color/src/oklcha.rs b/crates/bevy_color/src/oklcha.rs index 01b21b6780560..8618028dc3076 100644 --- a/crates/bevy_color/src/oklcha.rs +++ b/crates/bevy_color/src/oklcha.rs @@ -1,6 +1,6 @@ use crate::{ - color_difference::EuclideanDistance, Alpha, ClampColor, Hsla, Hsva, Hue, Hwba, Laba, Lcha, - LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza, + color_difference::EuclideanDistance, Alpha, ClampColor, Gray, Hsla, Hsva, Hue, Hwba, Laba, + Lcha, LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza, }; use bevy_reflect::prelude::*; @@ -181,6 +181,12 @@ impl Luminance for Oklcha { } } +impl Gray for Oklcha { + fn gray(intensity: f32) -> Self { + Self::new(intensity, 0., 0., 1.) + } +} + impl EuclideanDistance for Oklcha { #[inline] fn distance_squared(&self, other: &Self) -> f32 { diff --git a/crates/bevy_color/src/srgba.rs b/crates/bevy_color/src/srgba.rs index 43c82fda25d68..bcd3b879885af 100644 --- a/crates/bevy_color/src/srgba.rs +++ b/crates/bevy_color/src/srgba.rs @@ -1,7 +1,7 @@ use crate::color_difference::EuclideanDistance; use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, LinearRgba, Luminance, Mix, StandardColor, - Xyza, + impl_componentwise_vector_space, Alpha, ClampColor, Gray, LinearRgba, Luminance, Mix, + StandardColor, Xyza, }; use bevy_math::Vec4; use bevy_reflect::prelude::*; @@ -332,6 +332,12 @@ impl ClampColor for Srgba { } } +impl Gray for Srgba { + fn gray(intensity: f32) -> Self { + Self::new(intensity, intensity, intensity, 1.) + } +} + impl From for Srgba { #[inline] fn from(value: LinearRgba) -> Self { diff --git a/crates/bevy_color/src/xyza.rs b/crates/bevy_color/src/xyza.rs index d3baf464f472e..eb3f577cd44a5 100644 --- a/crates/bevy_color/src/xyza.rs +++ b/crates/bevy_color/src/xyza.rs @@ -1,5 +1,6 @@ use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, LinearRgba, Luminance, Mix, StandardColor, + impl_componentwise_vector_space, Alpha, ClampColor, Gray, LinearRgba, Luminance, Mix, + StandardColor, }; use bevy_reflect::prelude::*; @@ -160,6 +161,12 @@ impl ClampColor for Xyza { } } +impl Gray for Xyza { + fn gray(intensity: f32) -> Self { + Self::new(intensity, intensity, intensity, 1.) + } +} + impl From for Xyza { fn from( LinearRgba { From 923c20f9f62e86355bcc45fd6a1c5af8b124ffab Mon Sep 17 00:00:00 2001 From: Earthmark Date: Sat, 4 May 2024 13:21:31 -0700 Subject: [PATCH 02/11] Renamed intensity to lightness to better suggest the relation between the parameter and output color. --- crates/bevy_color/src/color_ops.rs | 6 +++--- crates/bevy_color/src/hsla.rs | 4 ++-- crates/bevy_color/src/hsva.rs | 4 ++-- crates/bevy_color/src/hwba.rs | 4 ++-- crates/bevy_color/src/laba.rs | 4 ++-- crates/bevy_color/src/lcha.rs | 4 ++-- crates/bevy_color/src/linear_rgba.rs | 4 ++-- crates/bevy_color/src/oklaba.rs | 4 ++-- crates/bevy_color/src/oklcha.rs | 4 ++-- crates/bevy_color/src/srgba.rs | 4 ++-- crates/bevy_color/src/xyza.rs | 4 ++-- 11 files changed, 23 insertions(+), 23 deletions(-) diff --git a/crates/bevy_color/src/color_ops.rs b/crates/bevy_color/src/color_ops.rs index 9bafbde056966..5a89c7e085611 100644 --- a/crates/bevy_color/src/color_ops.rs +++ b/crates/bevy_color/src/color_ops.rs @@ -80,10 +80,10 @@ pub trait Hue: Sized { } } -/// Trait for returning a grayscale color of a provided intensity. +/// Trait for returning a grayscale color of a provided lightness. pub trait Gray: Sized { - /// Returns a grey color with the provided intensity from (0.0 - 1.0). - fn gray(intensity: f32) -> Self; + /// Returns a grey color with the provided lightness from (0.0 - 1.0). 0 is black, 1 is white. + fn gray(lightness: f32) -> Self; } /// Trait with methods for asserting a colorspace is within bounds. diff --git a/crates/bevy_color/src/hsla.rs b/crates/bevy_color/src/hsla.rs index e9fc7588f3da6..5f6e4d8b89298 100644 --- a/crates/bevy_color/src/hsla.rs +++ b/crates/bevy_color/src/hsla.rs @@ -196,8 +196,8 @@ impl ClampColor for Hsla { } impl Gray for Hsla { - fn gray(intensity: f32) -> Self { - Self::new(0., 0., intensity, 1.) + fn gray(lightness: f32) -> Self { + Self::new(0., 0., lightness, 1.) } } diff --git a/crates/bevy_color/src/hsva.rs b/crates/bevy_color/src/hsva.rs index a347d1066ae57..3d81d9921b25c 100644 --- a/crates/bevy_color/src/hsva.rs +++ b/crates/bevy_color/src/hsva.rs @@ -141,8 +141,8 @@ impl ClampColor for Hsva { } impl Gray for Hsva { - fn gray(intensity: f32) -> Self { - Self::new(0., 0., intensity, 1.) + fn gray(lightness: f32) -> Self { + Self::new(0., 0., lightness, 1.) } } diff --git a/crates/bevy_color/src/hwba.rs b/crates/bevy_color/src/hwba.rs index cdbad8af8ced5..a4b7e75b90f3c 100644 --- a/crates/bevy_color/src/hwba.rs +++ b/crates/bevy_color/src/hwba.rs @@ -143,8 +143,8 @@ impl ClampColor for Hwba { } impl Gray for Hwba { - fn gray(intensity: f32) -> Self { - Self::new(0., intensity, 1. - intensity, 1.) + fn gray(lightness: f32) -> Self { + Self::new(0., lightness, 1. - lightness, 1.) } } diff --git a/crates/bevy_color/src/laba.rs b/crates/bevy_color/src/laba.rs index 8a900b7346087..700a05d6088a9 100644 --- a/crates/bevy_color/src/laba.rs +++ b/crates/bevy_color/src/laba.rs @@ -165,8 +165,8 @@ impl Luminance for Laba { } impl Gray for Laba { - fn gray(intensity: f32) -> Self { - Self::new(intensity * 1.5, 0., 0., 1.) + fn gray(lightness: f32) -> Self { + Self::new(lightness * 1.5, 0., 0., 1.) } } diff --git a/crates/bevy_color/src/lcha.rs b/crates/bevy_color/src/lcha.rs index 040f8f0aef60a..998eeb0ea0d43 100644 --- a/crates/bevy_color/src/lcha.rs +++ b/crates/bevy_color/src/lcha.rs @@ -203,8 +203,8 @@ impl ClampColor for Lcha { } impl Gray for Lcha { - fn gray(intensity: f32) -> Self { - Self::new(intensity * 1.5, 0., 0., 1.) + fn gray(lightness: f32) -> Self { + Self::new(lightness * 1.5, 0., 0., 1.) } } diff --git a/crates/bevy_color/src/linear_rgba.rs b/crates/bevy_color/src/linear_rgba.rs index f63bf22847e25..024a7378222a7 100644 --- a/crates/bevy_color/src/linear_rgba.rs +++ b/crates/bevy_color/src/linear_rgba.rs @@ -282,8 +282,8 @@ impl ClampColor for LinearRgba { } impl Gray for LinearRgba { - fn gray(intensity: f32) -> Self { - Self::new(intensity, intensity, intensity, 1.) + fn gray(lightness: f32) -> Self { + Self::new(lightness, lightness, lightness, 1.) } } diff --git a/crates/bevy_color/src/oklaba.rs b/crates/bevy_color/src/oklaba.rs index 1db6895e415f2..7b27ddbd31831 100644 --- a/crates/bevy_color/src/oklaba.rs +++ b/crates/bevy_color/src/oklaba.rs @@ -174,8 +174,8 @@ impl ClampColor for Oklaba { } impl Gray for Oklaba { - fn gray(intensity: f32) -> Self { - Self::new(intensity, 0., 0., 1.) + fn gray(lightness: f32) -> Self { + Self::new(lightness, 0., 0., 1.) } } diff --git a/crates/bevy_color/src/oklcha.rs b/crates/bevy_color/src/oklcha.rs index 8618028dc3076..7141ff9924f44 100644 --- a/crates/bevy_color/src/oklcha.rs +++ b/crates/bevy_color/src/oklcha.rs @@ -182,8 +182,8 @@ impl Luminance for Oklcha { } impl Gray for Oklcha { - fn gray(intensity: f32) -> Self { - Self::new(intensity, 0., 0., 1.) + fn gray(lightness: f32) -> Self { + Self::new(lightness, 0., 0., 1.) } } diff --git a/crates/bevy_color/src/srgba.rs b/crates/bevy_color/src/srgba.rs index bcd3b879885af..b9070793be59b 100644 --- a/crates/bevy_color/src/srgba.rs +++ b/crates/bevy_color/src/srgba.rs @@ -333,8 +333,8 @@ impl ClampColor for Srgba { } impl Gray for Srgba { - fn gray(intensity: f32) -> Self { - Self::new(intensity, intensity, intensity, 1.) + fn gray(lightness: f32) -> Self { + Self::new(lightness, lightness, lightness, 1.) } } diff --git a/crates/bevy_color/src/xyza.rs b/crates/bevy_color/src/xyza.rs index eb3f577cd44a5..0bbb67c4674dd 100644 --- a/crates/bevy_color/src/xyza.rs +++ b/crates/bevy_color/src/xyza.rs @@ -162,8 +162,8 @@ impl ClampColor for Xyza { } impl Gray for Xyza { - fn gray(intensity: f32) -> Self { - Self::new(intensity, intensity, intensity, 1.) + fn gray(lightness: f32) -> Self { + Self::new(lightness, lightness, lightness, 1.) } } From 080dcc548b24c8b29ee68719487fa960baff1d6d Mon Sep 17 00:00:00 2001 From: Earthmark Date: Sun, 5 May 2024 21:27:37 -0700 Subject: [PATCH 03/11] Swapped to using Mix, but also routed through SRGB because it had pre-made white and black. --- crates/bevy_color/src/color_ops.rs | 8 ++++++++ crates/bevy_color/src/hsla.rs | 10 ++-------- crates/bevy_color/src/hsva.rs | 10 +--------- crates/bevy_color/src/hwba.rs | 8 +------- crates/bevy_color/src/laba.rs | 10 ++-------- crates/bevy_color/src/lcha.rs | 10 +--------- crates/bevy_color/src/linear_rgba.rs | 8 +------- crates/bevy_color/src/oklaba.rs | 10 ++-------- crates/bevy_color/src/oklcha.rs | 10 ++-------- crates/bevy_color/src/srgba.rs | 10 ++-------- crates/bevy_color/src/xyza.rs | 9 +-------- 11 files changed, 23 insertions(+), 80 deletions(-) diff --git a/crates/bevy_color/src/color_ops.rs b/crates/bevy_color/src/color_ops.rs index 5a89c7e085611..eced050410a86 100644 --- a/crates/bevy_color/src/color_ops.rs +++ b/crates/bevy_color/src/color_ops.rs @@ -1,3 +1,5 @@ +use crate::Srgba; + /// Methods for changing the luminance of a color. Note that these methods are not /// guaranteed to produce consistent results across color spaces, /// but will be within a given space. @@ -86,6 +88,12 @@ pub trait Gray: Sized { fn gray(lightness: f32) -> Self; } +impl> Gray for T { + fn gray(lightness: f32) -> Self { + Into::::into(Srgba::BLACK).mix(&Srgba::WHITE.into(), lightness) + } +} + /// Trait with methods for asserting a colorspace is within bounds. /// /// During ordinary usage (e.g. reading images from disk, rendering images, picking colors for UI), colors should always be within their ordinary bounds (such as 0 to 1 for RGB colors). diff --git a/crates/bevy_color/src/hsla.rs b/crates/bevy_color/src/hsla.rs index 5f6e4d8b89298..3c225b369ddab 100644 --- a/crates/bevy_color/src/hsla.rs +++ b/crates/bevy_color/src/hsla.rs @@ -1,6 +1,6 @@ use crate::{ - Alpha, ClampColor, Gray, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, - StandardColor, Xyza, + Alpha, ClampColor, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, + Xyza, }; use bevy_reflect::prelude::*; @@ -195,12 +195,6 @@ impl ClampColor for Hsla { } } -impl Gray for Hsla { - fn gray(lightness: f32) -> Self { - Self::new(0., 0., lightness, 1.) - } -} - impl From for Hsva { fn from( Hsla { diff --git a/crates/bevy_color/src/hsva.rs b/crates/bevy_color/src/hsva.rs index 3d81d9921b25c..f58cdefac5659 100644 --- a/crates/bevy_color/src/hsva.rs +++ b/crates/bevy_color/src/hsva.rs @@ -1,6 +1,4 @@ -use crate::{ - Alpha, ClampColor, Gray, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza, -}; +use crate::{Alpha, ClampColor, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza}; use bevy_reflect::prelude::*; /// Color in Hue-Saturation-Value (HSV) color space with alpha. @@ -140,12 +138,6 @@ impl ClampColor for Hsva { } } -impl Gray for Hsva { - fn gray(lightness: f32) -> Self { - Self::new(0., 0., lightness, 1.) - } -} - impl From for Hwba { fn from( Hsva { diff --git a/crates/bevy_color/src/hwba.rs b/crates/bevy_color/src/hwba.rs index a4b7e75b90f3c..f5e7cf3a93c38 100644 --- a/crates/bevy_color/src/hwba.rs +++ b/crates/bevy_color/src/hwba.rs @@ -2,7 +2,7 @@ //! in [_HWB - A More Intuitive Hue-Based Color Model_] by _Smith et al_. //! //! [_HWB - A More Intuitive Hue-Based Color Model_]: https://web.archive.org/web/20240226005220/http://alvyray.com/Papers/CG/HWB_JGTv208.pdf -use crate::{Alpha, ClampColor, Gray, Hue, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza}; +use crate::{Alpha, ClampColor, Hue, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza}; use bevy_reflect::prelude::*; /// Color in Hue-Whiteness-Blackness (HWB) color space with alpha. @@ -142,12 +142,6 @@ impl ClampColor for Hwba { } } -impl Gray for Hwba { - fn gray(lightness: f32) -> Self { - Self::new(0., lightness, 1. - lightness, 1.) - } -} - impl From for Hwba { fn from( Srgba { diff --git a/crates/bevy_color/src/laba.rs b/crates/bevy_color/src/laba.rs index 700a05d6088a9..2ce9b55b72393 100644 --- a/crates/bevy_color/src/laba.rs +++ b/crates/bevy_color/src/laba.rs @@ -1,6 +1,6 @@ use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, Gray, Hsla, Hsva, Hwba, LinearRgba, - Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza, + impl_componentwise_vector_space, Alpha, ClampColor, Hsla, Hsva, Hwba, LinearRgba, Luminance, + Mix, Oklaba, Srgba, StandardColor, Xyza, }; use bevy_reflect::prelude::*; @@ -164,12 +164,6 @@ impl Luminance for Laba { } } -impl Gray for Laba { - fn gray(lightness: f32) -> Self { - Self::new(lightness * 1.5, 0., 0., 1.) - } -} - impl From for Xyza { fn from( Laba { diff --git a/crates/bevy_color/src/lcha.rs b/crates/bevy_color/src/lcha.rs index 998eeb0ea0d43..b33236d6f10ed 100644 --- a/crates/bevy_color/src/lcha.rs +++ b/crates/bevy_color/src/lcha.rs @@ -1,6 +1,4 @@ -use crate::{ - Alpha, ClampColor, Gray, Hue, Laba, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, -}; +use crate::{Alpha, ClampColor, Hue, Laba, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza}; use bevy_reflect::prelude::*; /// Color in LCH color space, with alpha @@ -202,12 +200,6 @@ impl ClampColor for Lcha { } } -impl Gray for Lcha { - fn gray(lightness: f32) -> Self { - Self::new(lightness * 1.5, 0., 0., 1.) - } -} - impl From for Laba { fn from( Lcha { diff --git a/crates/bevy_color/src/linear_rgba.rs b/crates/bevy_color/src/linear_rgba.rs index 024a7378222a7..3eb0646ff0979 100644 --- a/crates/bevy_color/src/linear_rgba.rs +++ b/crates/bevy_color/src/linear_rgba.rs @@ -1,5 +1,5 @@ use crate::{ - color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Gray, + color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Luminance, Mix, StandardColor, }; use bevy_math::Vec4; @@ -281,12 +281,6 @@ impl ClampColor for LinearRgba { } } -impl Gray for LinearRgba { - fn gray(lightness: f32) -> Self { - Self::new(lightness, lightness, lightness, 1.) - } -} - impl From for [f32; 4] { fn from(color: LinearRgba) -> Self { [color.red, color.green, color.blue, color.alpha] diff --git a/crates/bevy_color/src/oklaba.rs b/crates/bevy_color/src/oklaba.rs index 7b27ddbd31831..858091a719de6 100644 --- a/crates/bevy_color/src/oklaba.rs +++ b/crates/bevy_color/src/oklaba.rs @@ -1,6 +1,6 @@ use crate::{ - color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Gray, - Hsla, Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, + color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Hsla, + Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, }; use bevy_reflect::prelude::*; @@ -173,12 +173,6 @@ impl ClampColor for Oklaba { } } -impl Gray for Oklaba { - fn gray(lightness: f32) -> Self { - Self::new(lightness, 0., 0., 1.) - } -} - #[allow(clippy::excessive_precision)] impl From for Oklaba { fn from(value: LinearRgba) -> Self { diff --git a/crates/bevy_color/src/oklcha.rs b/crates/bevy_color/src/oklcha.rs index 7141ff9924f44..01b21b6780560 100644 --- a/crates/bevy_color/src/oklcha.rs +++ b/crates/bevy_color/src/oklcha.rs @@ -1,6 +1,6 @@ use crate::{ - color_difference::EuclideanDistance, Alpha, ClampColor, Gray, Hsla, Hsva, Hue, Hwba, Laba, - Lcha, LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza, + color_difference::EuclideanDistance, Alpha, ClampColor, Hsla, Hsva, Hue, Hwba, Laba, Lcha, + LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza, }; use bevy_reflect::prelude::*; @@ -181,12 +181,6 @@ impl Luminance for Oklcha { } } -impl Gray for Oklcha { - fn gray(lightness: f32) -> Self { - Self::new(lightness, 0., 0., 1.) - } -} - impl EuclideanDistance for Oklcha { #[inline] fn distance_squared(&self, other: &Self) -> f32 { diff --git a/crates/bevy_color/src/srgba.rs b/crates/bevy_color/src/srgba.rs index b9070793be59b..43c82fda25d68 100644 --- a/crates/bevy_color/src/srgba.rs +++ b/crates/bevy_color/src/srgba.rs @@ -1,7 +1,7 @@ use crate::color_difference::EuclideanDistance; use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, Gray, LinearRgba, Luminance, Mix, - StandardColor, Xyza, + impl_componentwise_vector_space, Alpha, ClampColor, LinearRgba, Luminance, Mix, StandardColor, + Xyza, }; use bevy_math::Vec4; use bevy_reflect::prelude::*; @@ -332,12 +332,6 @@ impl ClampColor for Srgba { } } -impl Gray for Srgba { - fn gray(lightness: f32) -> Self { - Self::new(lightness, lightness, lightness, 1.) - } -} - impl From for Srgba { #[inline] fn from(value: LinearRgba) -> Self { diff --git a/crates/bevy_color/src/xyza.rs b/crates/bevy_color/src/xyza.rs index 0bbb67c4674dd..d3baf464f472e 100644 --- a/crates/bevy_color/src/xyza.rs +++ b/crates/bevy_color/src/xyza.rs @@ -1,6 +1,5 @@ use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, Gray, LinearRgba, Luminance, Mix, - StandardColor, + impl_componentwise_vector_space, Alpha, ClampColor, LinearRgba, Luminance, Mix, StandardColor, }; use bevy_reflect::prelude::*; @@ -161,12 +160,6 @@ impl ClampColor for Xyza { } } -impl Gray for Xyza { - fn gray(lightness: f32) -> Self { - Self::new(lightness, lightness, lightness, 1.) - } -} - impl From for Xyza { fn from( LinearRgba { From 8537a1226ba50fa801695c79db6d7d120731ee40 Mon Sep 17 00:00:00 2001 From: Earthmark Date: Sun, 5 May 2024 21:31:37 -0700 Subject: [PATCH 04/11] Removed the built-in gray, which does sadly strip the const qualifier. --- crates/bevy_color/src/linear_rgba.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/crates/bevy_color/src/linear_rgba.rs b/crates/bevy_color/src/linear_rgba.rs index 3eb0646ff0979..2a7dfbf67fead 100644 --- a/crates/bevy_color/src/linear_rgba.rs +++ b/crates/bevy_color/src/linear_rgba.rs @@ -121,18 +121,6 @@ impl LinearRgba { } } - /// Construct a new [`LinearRgba`] color with the same value for all channels and an alpha of 1.0. - /// - /// A value of 0.0 is black, and a value of 1.0 is white. - pub const fn gray(value: f32) -> Self { - Self { - red: value, - green: value, - blue: value, - alpha: 1.0, - } - } - /// Return a copy of this color with the red channel set to the given value. pub const fn with_red(self, red: f32) -> Self { Self { red, ..self } From 75b6129bd023005704db923df1996ad8c30d6865 Mon Sep 17 00:00:00 2001 From: Earthmark Date: Sun, 5 May 2024 21:36:38 -0700 Subject: [PATCH 05/11] Fixed a reference in the core pipeline bloom crate, I don't like that this requires including the Gray trait to use a single side method... I think this needs a different implementation strategy. --- crates/bevy_core_pipeline/src/bloom/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_core_pipeline/src/bloom/mod.rs b/crates/bevy_core_pipeline/src/bloom/mod.rs index 419a82ff6013f..0b55c7dfd7c7b 100644 --- a/crates/bevy_core_pipeline/src/bloom/mod.rs +++ b/crates/bevy_core_pipeline/src/bloom/mod.rs @@ -2,7 +2,7 @@ mod downsampling_pipeline; mod settings; mod upsampling_pipeline; -use bevy_color::LinearRgba; +use bevy_color::{Gray, LinearRgba}; pub use settings::{BloomCompositeMode, BloomPrefilterSettings, BloomSettings}; use crate::{ From 77fa5dcb7cd33c2f2bb4a8c97a8852906b96d2cc Mon Sep 17 00:00:00 2001 From: Earthmark Date: Mon, 6 May 2024 17:42:04 -0700 Subject: [PATCH 06/11] Restructured the trait to be a default function implementation, instead of an automatic trait implementation. --- crates/bevy_color/src/color_ops.rs | 27 +++++++++++++-------------- crates/bevy_color/src/hsla.rs | 8 ++++++-- crates/bevy_color/src/hsva.rs | 7 ++++++- crates/bevy_color/src/hwba.rs | 7 ++++++- crates/bevy_color/src/laba.rs | 8 ++++++-- crates/bevy_color/src/lcha.rs | 7 ++++++- crates/bevy_color/src/linear_rgba.rs | 8 ++++++-- crates/bevy_color/src/oklaba.rs | 9 +++++++-- crates/bevy_color/src/oklcha.rs | 8 ++++++-- crates/bevy_color/src/srgba.rs | 8 ++++++-- crates/bevy_color/src/xyza.rs | 8 +++++++- 11 files changed, 75 insertions(+), 30 deletions(-) diff --git a/crates/bevy_color/src/color_ops.rs b/crates/bevy_color/src/color_ops.rs index eced050410a86..850306dbcc8f3 100644 --- a/crates/bevy_color/src/color_ops.rs +++ b/crates/bevy_color/src/color_ops.rs @@ -1,5 +1,3 @@ -use crate::Srgba; - /// Methods for changing the luminance of a color. Note that these methods are not /// guaranteed to produce consistent results across color spaces, /// but will be within a given space. @@ -42,6 +40,19 @@ pub trait Mix: Sized { } } +/// Trait for returning a grayscale color of a provided lightness. +pub trait Gray: Mix + Sized { + /// A pure black color. + const BLACK: Self; + /// A pure white color. + const WHITE: Self; + + /// Returns a grey color with the provided lightness from (0.0 - 1.0). 0 is black, 1 is white. + fn gray(lightness: f32) -> Self { + Self::BLACK.mix(&Self::WHITE, lightness) + } +} + /// Methods for manipulating alpha values. pub trait Alpha: Sized { /// Return a new version of this color with the given alpha value. @@ -82,18 +93,6 @@ pub trait Hue: Sized { } } -/// Trait for returning a grayscale color of a provided lightness. -pub trait Gray: Sized { - /// Returns a grey color with the provided lightness from (0.0 - 1.0). 0 is black, 1 is white. - fn gray(lightness: f32) -> Self; -} - -impl> Gray for T { - fn gray(lightness: f32) -> Self { - Into::::into(Srgba::BLACK).mix(&Srgba::WHITE.into(), lightness) - } -} - /// Trait with methods for asserting a colorspace is within bounds. /// /// During ordinary usage (e.g. reading images from disk, rendering images, picking colors for UI), colors should always be within their ordinary bounds (such as 0 to 1 for RGB colors). diff --git a/crates/bevy_color/src/hsla.rs b/crates/bevy_color/src/hsla.rs index 3c225b369ddab..3e6d7824f17a3 100644 --- a/crates/bevy_color/src/hsla.rs +++ b/crates/bevy_color/src/hsla.rs @@ -1,6 +1,5 @@ use crate::{ - Alpha, ClampColor, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, - Xyza, + Alpha, ClampColor, Gray, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza }; use bevy_reflect::prelude::*; @@ -118,6 +117,11 @@ impl Mix for Hsla { } } +impl Gray for Hsla { + const BLACK: Self = Self::new(0., 0., 0., 1.); + const WHITE: Self = Self::new(0., 0., 1., 1.); +} + impl Alpha for Hsla { #[inline] fn with_alpha(&self, alpha: f32) -> Self { diff --git a/crates/bevy_color/src/hsva.rs b/crates/bevy_color/src/hsva.rs index f58cdefac5659..e70a969d402da 100644 --- a/crates/bevy_color/src/hsva.rs +++ b/crates/bevy_color/src/hsva.rs @@ -1,4 +1,4 @@ -use crate::{Alpha, ClampColor, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza}; +use crate::{Alpha, ClampColor, Gray, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza}; use bevy_reflect::prelude::*; /// Color in Hue-Saturation-Value (HSV) color space with alpha. @@ -86,6 +86,11 @@ impl Mix for Hsva { } } +impl Gray for Hsva { + const BLACK: Self = Self::new(0., 0., 0., 1.); + const WHITE: Self = Self::new(0., 0., 1., 1.); +} + impl Alpha for Hsva { #[inline] fn with_alpha(&self, alpha: f32) -> Self { diff --git a/crates/bevy_color/src/hwba.rs b/crates/bevy_color/src/hwba.rs index f5e7cf3a93c38..f8e95cfc471cf 100644 --- a/crates/bevy_color/src/hwba.rs +++ b/crates/bevy_color/src/hwba.rs @@ -2,7 +2,7 @@ //! in [_HWB - A More Intuitive Hue-Based Color Model_] by _Smith et al_. //! //! [_HWB - A More Intuitive Hue-Based Color Model_]: https://web.archive.org/web/20240226005220/http://alvyray.com/Papers/CG/HWB_JGTv208.pdf -use crate::{Alpha, ClampColor, Hue, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza}; +use crate::{Alpha, ClampColor, Gray, Hue, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza}; use bevy_reflect::prelude::*; /// Color in Hue-Whiteness-Blackness (HWB) color space with alpha. @@ -90,6 +90,11 @@ impl Mix for Hwba { } } +impl Gray for Hwba { + const BLACK: Self = Self::new(0., 0., 1., 1.); + const WHITE: Self = Self::new(0., 1., 0., 1.); +} + impl Alpha for Hwba { #[inline] fn with_alpha(&self, alpha: f32) -> Self { diff --git a/crates/bevy_color/src/laba.rs b/crates/bevy_color/src/laba.rs index 2ce9b55b72393..855241b2433f8 100644 --- a/crates/bevy_color/src/laba.rs +++ b/crates/bevy_color/src/laba.rs @@ -1,6 +1,5 @@ use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, Hsla, Hsva, Hwba, LinearRgba, Luminance, - Mix, Oklaba, Srgba, StandardColor, Xyza, + impl_componentwise_vector_space, Alpha, ClampColor, Gray, Hsla, Hsva, Hwba, LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza }; use bevy_reflect::prelude::*; @@ -100,6 +99,11 @@ impl Mix for Laba { } } +impl Gray for Laba { + const BLACK: Self = Self::new(0., 0., 0., 1.); + const WHITE: Self = Self::new(1., 0., 0., 1.); +} + impl Alpha for Laba { #[inline] fn with_alpha(&self, alpha: f32) -> Self { diff --git a/crates/bevy_color/src/lcha.rs b/crates/bevy_color/src/lcha.rs index b33236d6f10ed..7a097b39cc3af 100644 --- a/crates/bevy_color/src/lcha.rs +++ b/crates/bevy_color/src/lcha.rs @@ -1,4 +1,4 @@ -use crate::{Alpha, ClampColor, Hue, Laba, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza}; +use crate::{Alpha, ClampColor, Gray, Hue, Laba, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza}; use bevy_reflect::prelude::*; /// Color in LCH color space, with alpha @@ -119,6 +119,11 @@ impl Mix for Lcha { } } +impl Gray for Lcha { + const BLACK: Self = Self::new(0.0, 0.0, 0.0000136603785, 1.0); + const WHITE: Self = Self::new(1.0, 0.0, 0.0000136603785, 1.0); +} + impl Alpha for Lcha { #[inline] fn with_alpha(&self, alpha: f32) -> Self { diff --git a/crates/bevy_color/src/linear_rgba.rs b/crates/bevy_color/src/linear_rgba.rs index 2a7dfbf67fead..cffc697dcb056 100644 --- a/crates/bevy_color/src/linear_rgba.rs +++ b/crates/bevy_color/src/linear_rgba.rs @@ -1,6 +1,5 @@ use crate::{ - color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, - Luminance, Mix, StandardColor, + color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Gray, Luminance, Mix, StandardColor }; use bevy_math::Vec4; use bevy_reflect::prelude::*; @@ -224,6 +223,11 @@ impl Mix for LinearRgba { } } +impl Gray for LinearRgba { + const BLACK: Self = Self::BLACK; + const WHITE: Self = Self::WHITE; +} + impl Alpha for LinearRgba { #[inline] fn with_alpha(&self, alpha: f32) -> Self { diff --git a/crates/bevy_color/src/oklaba.rs b/crates/bevy_color/src/oklaba.rs index 858091a719de6..464fb686011cb 100644 --- a/crates/bevy_color/src/oklaba.rs +++ b/crates/bevy_color/src/oklaba.rs @@ -1,6 +1,6 @@ use crate::{ - color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Hsla, - Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, + color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Gray, + Hsla, Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, }; use bevy_reflect::prelude::*; @@ -100,6 +100,11 @@ impl Mix for Oklaba { } } +impl Gray for Oklaba { + const BLACK: Self = Self::new(0., 0., 0., 1.); + const WHITE: Self = Self::new(1.0, 0.0, 0.000000059604645, 1.0); +} + impl Alpha for Oklaba { #[inline] fn with_alpha(&self, alpha: f32) -> Self { diff --git a/crates/bevy_color/src/oklcha.rs b/crates/bevy_color/src/oklcha.rs index 01b21b6780560..d4d82e31709ef 100644 --- a/crates/bevy_color/src/oklcha.rs +++ b/crates/bevy_color/src/oklcha.rs @@ -1,6 +1,5 @@ use crate::{ - color_difference::EuclideanDistance, Alpha, ClampColor, Hsla, Hsva, Hue, Hwba, Laba, Lcha, - LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza, + color_difference::EuclideanDistance, Alpha, ClampColor, Gray, Hsla, Hsva, Hue, Hwba, Laba, Lcha, LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza }; use bevy_reflect::prelude::*; @@ -118,6 +117,11 @@ impl Mix for Oklcha { } } +impl Gray for Oklcha { + const BLACK: Self = Self::new(0., 0., 0., 1.); + const WHITE: Self = Self::new(1.0, 0.000000059604645, 90.0, 1.0); +} + impl Alpha for Oklcha { #[inline] fn with_alpha(&self, alpha: f32) -> Self { diff --git a/crates/bevy_color/src/srgba.rs b/crates/bevy_color/src/srgba.rs index 43c82fda25d68..fc2f259314f16 100644 --- a/crates/bevy_color/src/srgba.rs +++ b/crates/bevy_color/src/srgba.rs @@ -1,7 +1,6 @@ use crate::color_difference::EuclideanDistance; use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, LinearRgba, Luminance, Mix, StandardColor, - Xyza, + impl_componentwise_vector_space, Alpha, ClampColor, Gray, LinearRgba, Luminance, Mix, StandardColor, Xyza }; use bevy_math::Vec4; use bevy_reflect::prelude::*; @@ -332,6 +331,11 @@ impl ClampColor for Srgba { } } +impl Gray for Srgba { + const BLACK: Self = Self::BLACK; + const WHITE: Self = Self::WHITE; +} + impl From for Srgba { #[inline] fn from(value: LinearRgba) -> Self { diff --git a/crates/bevy_color/src/xyza.rs b/crates/bevy_color/src/xyza.rs index d3baf464f472e..6c2f38f365651 100644 --- a/crates/bevy_color/src/xyza.rs +++ b/crates/bevy_color/src/xyza.rs @@ -1,5 +1,6 @@ use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, LinearRgba, Luminance, Mix, StandardColor, + impl_componentwise_vector_space, Alpha, ClampColor, Gray, LinearRgba, Luminance, Mix, + StandardColor, }; use bevy_reflect::prelude::*; @@ -160,6 +161,11 @@ impl ClampColor for Xyza { } } +impl Gray for Xyza { + const BLACK: Self = Self::new(0., 0., 0., 1.); + const WHITE: Self = Self::new(0.95047, 1.0, 1.08883, 1.0); +} + impl From for Xyza { fn from( LinearRgba { From 59ef7bf369c1db62ec229c9ea5556ebcf54e8a4d Mon Sep 17 00:00:00 2001 From: Earthmark Date: Mon, 6 May 2024 17:48:47 -0700 Subject: [PATCH 07/11] Missed a formatting pass. --- crates/bevy_color/src/hsla.rs | 3 ++- crates/bevy_color/src/hsva.rs | 4 +++- crates/bevy_color/src/laba.rs | 3 ++- crates/bevy_color/src/lcha.rs | 4 +++- crates/bevy_color/src/linear_rgba.rs | 3 ++- crates/bevy_color/src/oklcha.rs | 3 ++- crates/bevy_color/src/srgba.rs | 3 ++- 7 files changed, 16 insertions(+), 7 deletions(-) diff --git a/crates/bevy_color/src/hsla.rs b/crates/bevy_color/src/hsla.rs index 3e6d7824f17a3..892db89bed924 100644 --- a/crates/bevy_color/src/hsla.rs +++ b/crates/bevy_color/src/hsla.rs @@ -1,5 +1,6 @@ use crate::{ - Alpha, ClampColor, Gray, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza + Alpha, ClampColor, Gray, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, + StandardColor, Xyza, }; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/hsva.rs b/crates/bevy_color/src/hsva.rs index e70a969d402da..8717b048ca88f 100644 --- a/crates/bevy_color/src/hsva.rs +++ b/crates/bevy_color/src/hsva.rs @@ -1,4 +1,6 @@ -use crate::{Alpha, ClampColor, Gray, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza}; +use crate::{ + Alpha, ClampColor, Gray, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza, +}; use bevy_reflect::prelude::*; /// Color in Hue-Saturation-Value (HSV) color space with alpha. diff --git a/crates/bevy_color/src/laba.rs b/crates/bevy_color/src/laba.rs index 855241b2433f8..2de99a46750d0 100644 --- a/crates/bevy_color/src/laba.rs +++ b/crates/bevy_color/src/laba.rs @@ -1,5 +1,6 @@ use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, Gray, Hsla, Hsva, Hwba, LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza + impl_componentwise_vector_space, Alpha, ClampColor, Gray, Hsla, Hsva, Hwba, LinearRgba, + Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza, }; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/lcha.rs b/crates/bevy_color/src/lcha.rs index 7a097b39cc3af..680535ff7e887 100644 --- a/crates/bevy_color/src/lcha.rs +++ b/crates/bevy_color/src/lcha.rs @@ -1,4 +1,6 @@ -use crate::{Alpha, ClampColor, Gray, Hue, Laba, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza}; +use crate::{ + Alpha, ClampColor, Gray, Hue, Laba, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, +}; use bevy_reflect::prelude::*; /// Color in LCH color space, with alpha diff --git a/crates/bevy_color/src/linear_rgba.rs b/crates/bevy_color/src/linear_rgba.rs index cffc697dcb056..cae5df2546196 100644 --- a/crates/bevy_color/src/linear_rgba.rs +++ b/crates/bevy_color/src/linear_rgba.rs @@ -1,5 +1,6 @@ use crate::{ - color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Gray, Luminance, Mix, StandardColor + color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Gray, + Luminance, Mix, StandardColor, }; use bevy_math::Vec4; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/oklcha.rs b/crates/bevy_color/src/oklcha.rs index d4d82e31709ef..c0326d61c56c6 100644 --- a/crates/bevy_color/src/oklcha.rs +++ b/crates/bevy_color/src/oklcha.rs @@ -1,5 +1,6 @@ use crate::{ - color_difference::EuclideanDistance, Alpha, ClampColor, Gray, Hsla, Hsva, Hue, Hwba, Laba, Lcha, LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza + color_difference::EuclideanDistance, Alpha, ClampColor, Gray, Hsla, Hsva, Hue, Hwba, Laba, + Lcha, LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza, }; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/srgba.rs b/crates/bevy_color/src/srgba.rs index fc2f259314f16..2586e7a2bd191 100644 --- a/crates/bevy_color/src/srgba.rs +++ b/crates/bevy_color/src/srgba.rs @@ -1,6 +1,7 @@ use crate::color_difference::EuclideanDistance; use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, Gray, LinearRgba, Luminance, Mix, StandardColor, Xyza + impl_componentwise_vector_space, Alpha, ClampColor, Gray, LinearRgba, Luminance, Mix, + StandardColor, Xyza, }; use bevy_math::Vec4; use bevy_reflect::prelude::*; From 2d48ae0cfe629c4cc10bc3ac617566ccd07d4e73 Mon Sep 17 00:00:00 2001 From: Earthmark Date: Tue, 7 May 2024 19:11:59 -0700 Subject: [PATCH 08/11] Added tests that verify gray for 0 is black, and 1 is white. --- crates/bevy_color/src/color_ops.rs | 20 +++++++++++++++++++- crates/bevy_color/src/testing.rs | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/crates/bevy_color/src/color_ops.rs b/crates/bevy_color/src/color_ops.rs index 850306dbcc8f3..3441ad2e6e4e8 100644 --- a/crates/bevy_color/src/color_ops.rs +++ b/crates/bevy_color/src/color_ops.rs @@ -120,8 +120,13 @@ pub(crate) fn lerp_hue(a: f32, b: f32, t: f32) -> f32 { #[cfg(test)] mod tests { + use std::fmt::Debug; + use super::*; - use crate::{testing::assert_approx_eq, Hsla}; + use crate::{ + testing::{assert_approx_eq, call_for_every_color}, + Hsla, + }; #[test] fn test_rotate_hue() { @@ -153,4 +158,17 @@ mod tests { assert_approx_eq!(lerp_hue(350., 10., 0.5), 0., 0.001); assert_approx_eq!(lerp_hue(350., 10., 0.75), 5., 0.001); } + + fn verify_gray() + where + Col: Gray + Debug + PartialEq, + { + assert_eq!(Col::gray(0.), Col::BLACK); + assert_eq!(Col::gray(1.), Col::WHITE); + } + + #[test] + fn test_gray() { + call_for_every_color!(verify_gray); + } } diff --git a/crates/bevy_color/src/testing.rs b/crates/bevy_color/src/testing.rs index 0c87fe226c749..8826208e11d51 100644 --- a/crates/bevy_color/src/testing.rs +++ b/crates/bevy_color/src/testing.rs @@ -13,3 +13,21 @@ macro_rules! assert_approx_eq { #[cfg(test)] pub(crate) use assert_approx_eq; + +#[cfg(test)] +macro_rules! call_for_every_color { + ($m:ident) => { + $m::(); + $m::(); + $m::(); + $m::(); + $m::(); + $m::(); + $m::(); + $m::(); + $m::(); + }; +} + +#[cfg(test)] +pub(crate) use call_for_every_color; From 4c8eeb7582c873c1bca81ec7e06761e89e2f7214 Mon Sep 17 00:00:00 2001 From: Earthmark Date: Tue, 7 May 2024 20:18:20 -0700 Subject: [PATCH 09/11] Inlined the color test macro. --- crates/bevy_color/src/color_ops.rs | 15 ++++++++++----- crates/bevy_color/src/testing.rs | 18 ------------------ 2 files changed, 10 insertions(+), 23 deletions(-) diff --git a/crates/bevy_color/src/color_ops.rs b/crates/bevy_color/src/color_ops.rs index 3441ad2e6e4e8..c684338e2bc22 100644 --- a/crates/bevy_color/src/color_ops.rs +++ b/crates/bevy_color/src/color_ops.rs @@ -123,10 +123,7 @@ mod tests { use std::fmt::Debug; use super::*; - use crate::{ - testing::{assert_approx_eq, call_for_every_color}, - Hsla, - }; + use crate::{testing::assert_approx_eq, Hsla}; #[test] fn test_rotate_hue() { @@ -169,6 +166,14 @@ mod tests { #[test] fn test_gray() { - call_for_every_color!(verify_gray); + verify_gray::(); + verify_gray::(); + verify_gray::(); + verify_gray::(); + verify_gray::(); + verify_gray::(); + verify_gray::(); + verify_gray::(); + verify_gray::(); } } diff --git a/crates/bevy_color/src/testing.rs b/crates/bevy_color/src/testing.rs index 8826208e11d51..0c87fe226c749 100644 --- a/crates/bevy_color/src/testing.rs +++ b/crates/bevy_color/src/testing.rs @@ -13,21 +13,3 @@ macro_rules! assert_approx_eq { #[cfg(test)] pub(crate) use assert_approx_eq; - -#[cfg(test)] -macro_rules! call_for_every_color { - ($m:ident) => { - $m::(); - $m::(); - $m::(); - $m::(); - $m::(); - $m::(); - $m::(); - $m::(); - $m::(); - }; -} - -#[cfg(test)] -pub(crate) use call_for_every_color; From c3eb1e05f7a7805d7266a575f1e5c7c1984f1fbc Mon Sep 17 00:00:00 2001 From: Earthmark Date: Fri, 10 May 2024 00:31:21 -0700 Subject: [PATCH 10/11] Fixes for the problematic merge. --- crates/bevy_color/src/hsla.rs | 4 ++-- crates/bevy_color/src/hsva.rs | 6 ++---- crates/bevy_color/src/hwba.rs | 3 ++- crates/bevy_color/src/lcha.rs | 4 +--- crates/bevy_color/src/linear_rgba.rs | 4 ++-- crates/bevy_color/src/oklaba.rs | 6 ++---- crates/bevy_color/src/oklcha.rs | 4 ++-- crates/bevy_color/src/srgba.rs | 4 ++-- crates/bevy_color/src/xyza.rs | 5 ++--- 9 files changed, 17 insertions(+), 23 deletions(-) diff --git a/crates/bevy_color/src/hsla.rs b/crates/bevy_color/src/hsla.rs index c7e309646bafb..5993516329609 100644 --- a/crates/bevy_color/src/hsla.rs +++ b/crates/bevy_color/src/hsla.rs @@ -1,6 +1,6 @@ use crate::{ - Alpha, ClampColor, ColorToComponents, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Gray, Mix, Srgba, - StandardColor, Xyza, + Alpha, ClampColor, ColorToComponents, Gray, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Mix, + Srgba, StandardColor, Xyza, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/hsva.rs b/crates/bevy_color/src/hsva.rs index 40acc6ade60c1..10ec395421226 100644 --- a/crates/bevy_color/src/hsva.rs +++ b/crates/bevy_color/src/hsva.rs @@ -1,8 +1,6 @@ use crate::{ - - Alpha, ClampColor, Gray, ColorToComponents, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, - Xyza, -, + Alpha, ClampColor, ColorToComponents, Gray, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, + StandardColor, Xyza, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/hwba.rs b/crates/bevy_color/src/hwba.rs index c5456b7d25b47..741d6dedc70b1 100644 --- a/crates/bevy_color/src/hwba.rs +++ b/crates/bevy_color/src/hwba.rs @@ -3,7 +3,8 @@ //! //! [_HWB - A More Intuitive Hue-Based Color Model_]: https://web.archive.org/web/20240226005220/http://alvyray.com/Papers/CG/HWB_JGTv208.pdf use crate::{ - Alpha, ClampColor, Gray, ColorToComponents, Hue, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza, + Alpha, ClampColor, ColorToComponents, Gray, Hue, Lcha, LinearRgba, Mix, Srgba, StandardColor, + Xyza, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/lcha.rs b/crates/bevy_color/src/lcha.rs index ac989c04b826e..1be7f939f98e7 100644 --- a/crates/bevy_color/src/lcha.rs +++ b/crates/bevy_color/src/lcha.rs @@ -1,8 +1,6 @@ use crate::{ - - Alpha, ClampColor, Gray, ColorToComponents, Hue, Laba, LinearRgba, Luminance, Mix, Srgba, + Alpha, ClampColor, ColorToComponents, Gray, Hue, Laba, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, -, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/linear_rgba.rs b/crates/bevy_color/src/linear_rgba.rs index a9f24b0186aeb..3ce91a3aab629 100644 --- a/crates/bevy_color/src/linear_rgba.rs +++ b/crates/bevy_color/src/linear_rgba.rs @@ -1,6 +1,6 @@ use crate::{ - color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Gray, - ColorToComponents, Luminance, Mix, StandardColor, + color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, + ColorToComponents, Gray, Luminance, Mix, StandardColor, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/oklaba.rs b/crates/bevy_color/src/oklaba.rs index 7c4b2b5f20f19..a893b6180e000 100644 --- a/crates/bevy_color/src/oklaba.rs +++ b/crates/bevy_color/src/oklaba.rs @@ -1,9 +1,7 @@ use crate::{ - color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Gray, - Hsla, Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, - ColorToComponents, Hsla, Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, - Xyza, + ColorToComponents, Gray, Hsla, Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, + StandardColor, Xyza, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/oklcha.rs b/crates/bevy_color/src/oklcha.rs index 1adc8eb7915bb..4a1c27c867e74 100644 --- a/crates/bevy_color/src/oklcha.rs +++ b/crates/bevy_color/src/oklcha.rs @@ -1,6 +1,6 @@ use crate::{ - color_difference::EuclideanDistance, Alpha, ClampColor, ColorToComponents, Hsla, Hsva, Hue, Gray, - Hwba, Laba, Lcha, LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza, + color_difference::EuclideanDistance, Alpha, ClampColor, ColorToComponents, Gray, Hsla, Hsva, + Hue, Hwba, Laba, Lcha, LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/srgba.rs b/crates/bevy_color/src/srgba.rs index 0ea2c0fd81d36..bb119ed10f1b5 100644 --- a/crates/bevy_color/src/srgba.rs +++ b/crates/bevy_color/src/srgba.rs @@ -1,7 +1,7 @@ use crate::color_difference::EuclideanDistance; use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, ColorToComponents, Gray, LinearRgba, Luminance, - Mix, StandardColor, Xyza, + impl_componentwise_vector_space, Alpha, ClampColor, ColorToComponents, Gray, LinearRgba, + Luminance, Mix, StandardColor, Xyza, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/xyza.rs b/crates/bevy_color/src/xyza.rs index 51d5446735f28..ab29405ee2ac1 100644 --- a/crates/bevy_color/src/xyza.rs +++ b/crates/bevy_color/src/xyza.rs @@ -1,7 +1,6 @@ use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, ColorToComponents, Gray, LinearRgba, Luminance, - Mix, - StandardColor, + impl_componentwise_vector_space, Alpha, ClampColor, ColorToComponents, Gray, LinearRgba, + Luminance, Mix, StandardColor, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; From aa797d228dda244030e511ce2e8c31a703c6b8b7 Mon Sep 17 00:00:00 2001 From: Earthmark Date: Sat, 25 May 2024 18:14:45 -0700 Subject: [PATCH 11/11] Fixed some lingering references to a removed trait. --- crates/bevy_color/src/hsva.rs | 3 +-- crates/bevy_color/src/oklaba.rs | 5 ++--- crates/bevy_color/src/srgba.rs | 4 ++-- crates/bevy_color/src/xyza.rs | 4 ++-- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/crates/bevy_color/src/hsva.rs b/crates/bevy_color/src/hsva.rs index b3a389f659c95..cf89ea1013976 100644 --- a/crates/bevy_color/src/hsva.rs +++ b/crates/bevy_color/src/hsva.rs @@ -1,6 +1,5 @@ use crate::{ - Alpha, ClampColor, ColorToComponents, Gray, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, - StandardColor, Xyza, + Alpha, ColorToComponents, Gray, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/oklaba.rs b/crates/bevy_color/src/oklaba.rs index cdee0c9e7b130..ec725adbdf6ba 100644 --- a/crates/bevy_color/src/oklaba.rs +++ b/crates/bevy_color/src/oklaba.rs @@ -1,7 +1,6 @@ use crate::{ - color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, - ColorToComponents, Gray, Hsla, Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, - StandardColor, Xyza, + color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ColorToComponents, + Gray, Hsla, Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/srgba.rs b/crates/bevy_color/src/srgba.rs index 1565636da1420..9de33883af82d 100644 --- a/crates/bevy_color/src/srgba.rs +++ b/crates/bevy_color/src/srgba.rs @@ -1,7 +1,7 @@ use crate::color_difference::EuclideanDistance; use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, ColorToComponents, Gray, LinearRgba, - Luminance, Mix, StandardColor, Xyza, + impl_componentwise_vector_space, Alpha, ColorToComponents, Gray, LinearRgba, Luminance, Mix, + StandardColor, Xyza, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*; diff --git a/crates/bevy_color/src/xyza.rs b/crates/bevy_color/src/xyza.rs index f6a5b98ff539a..ea20a2ee72fe4 100644 --- a/crates/bevy_color/src/xyza.rs +++ b/crates/bevy_color/src/xyza.rs @@ -1,6 +1,6 @@ use crate::{ - impl_componentwise_vector_space, Alpha, ClampColor, ColorToComponents, Gray, LinearRgba, - Luminance, Mix, StandardColor, + impl_componentwise_vector_space, Alpha, ColorToComponents, Gray, LinearRgba, Luminance, Mix, + StandardColor, }; use bevy_math::{Vec3, Vec4}; use bevy_reflect::prelude::*;