mirror of
https://github.com/bevyengine/bevy
synced 2025-02-16 14:08:32 +00:00
# Objective fixes #13224 adds conversions for Vec3 and Vec4 since these appear so often ## Solution added Covert trait (couldn't think of good name) for [f32; 4], [f32, 3], Vec4, and Vec3 along with the symmetric implementation ## Changelog added conversions between arrays and vector to colors and vice versa #migration LinearRgba appears to have already had implicit conversions for [f32;4] and Vec4
This commit is contained in:
parent
d9d305dab5
commit
3f2cc244d7
13 changed files with 606 additions and 46 deletions
|
@ -1,3 +1,5 @@
|
||||||
|
use bevy_math::{Vec3, Vec4};
|
||||||
|
|
||||||
/// Methods for changing the luminance of a color. Note that these methods are not
|
/// Methods for changing the luminance of a color. Note that these methods are not
|
||||||
/// guaranteed to produce consistent results across color spaces,
|
/// guaranteed to produce consistent results across color spaces,
|
||||||
/// but will be within a given space.
|
/// but will be within a given space.
|
||||||
|
@ -97,6 +99,26 @@ pub trait ClampColor: Sized {
|
||||||
fn is_within_bounds(&self) -> bool;
|
fn is_within_bounds(&self) -> bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Trait with methods for converting colors to non-color types
|
||||||
|
pub trait ColorToComponents {
|
||||||
|
/// Convert to an f32 array
|
||||||
|
fn to_f32_array(self) -> [f32; 4];
|
||||||
|
/// Convert to an f32 array without the alpha value
|
||||||
|
fn to_f32_array_no_alpha(self) -> [f32; 3];
|
||||||
|
/// Convert to a Vec4
|
||||||
|
fn to_vec4(self) -> Vec4;
|
||||||
|
/// Convert to a Vec3
|
||||||
|
fn to_vec3(self) -> Vec3;
|
||||||
|
/// Convert from an f32 array
|
||||||
|
fn from_f32_array(color: [f32; 4]) -> Self;
|
||||||
|
/// Convert from an f32 array without the alpha value
|
||||||
|
fn from_f32_array_no_alpha(color: [f32; 3]) -> Self;
|
||||||
|
/// Convert from a Vec4
|
||||||
|
fn from_vec4(color: Vec4) -> Self;
|
||||||
|
/// Convert from a Vec3
|
||||||
|
fn from_vec3(color: Vec3) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
/// Utility function for interpolating hue values. This ensures that the interpolation
|
/// Utility function for interpolating hue values. This ensures that the interpolation
|
||||||
/// takes the shortest path around the color wheel, and that the result is always between
|
/// takes the shortest path around the color wheel, and that the result is always between
|
||||||
/// 0 and 360.
|
/// 0 and 360.
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
Alpha, ClampColor, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor,
|
Alpha, ClampColor, ColorToComponents, Hsva, Hue, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba,
|
||||||
Xyza,
|
StandardColor, Xyza,
|
||||||
};
|
};
|
||||||
|
use bevy_math::{Vec3, Vec4};
|
||||||
use bevy_reflect::prelude::*;
|
use bevy_reflect::prelude::*;
|
||||||
|
|
||||||
/// Color in Hue-Saturation-Lightness (HSL) color space with alpha.
|
/// Color in Hue-Saturation-Lightness (HSL) color space with alpha.
|
||||||
|
@ -195,6 +196,60 @@ impl ClampColor for Hsla {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ColorToComponents for Hsla {
|
||||||
|
fn to_f32_array(self) -> [f32; 4] {
|
||||||
|
[self.hue, self.saturation, self.lightness, self.alpha]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_f32_array_no_alpha(self) -> [f32; 3] {
|
||||||
|
[self.hue, self.saturation, self.lightness]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec4(self) -> Vec4 {
|
||||||
|
Vec4::new(self.hue, self.saturation, self.lightness, self.alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec3(self) -> Vec3 {
|
||||||
|
Vec3::new(self.hue, self.saturation, self.lightness)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array(color: [f32; 4]) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
saturation: color[1],
|
||||||
|
lightness: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array_no_alpha(color: [f32; 3]) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
saturation: color[1],
|
||||||
|
lightness: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec4(color: Vec4) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
saturation: color[1],
|
||||||
|
lightness: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec3(color: Vec3) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
saturation: color[1],
|
||||||
|
lightness: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<Hsla> for Hsva {
|
impl From<Hsla> for Hsva {
|
||||||
fn from(
|
fn from(
|
||||||
Hsla {
|
Hsla {
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
use crate::{Alpha, ClampColor, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza};
|
use crate::{
|
||||||
|
Alpha, ClampColor, ColorToComponents, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor,
|
||||||
|
Xyza,
|
||||||
|
};
|
||||||
|
use bevy_math::{Vec3, Vec4};
|
||||||
use bevy_reflect::prelude::*;
|
use bevy_reflect::prelude::*;
|
||||||
|
|
||||||
/// Color in Hue-Saturation-Value (HSV) color space with alpha.
|
/// Color in Hue-Saturation-Value (HSV) color space with alpha.
|
||||||
|
@ -172,6 +176,60 @@ impl From<Hwba> for Hsva {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ColorToComponents for Hsva {
|
||||||
|
fn to_f32_array(self) -> [f32; 4] {
|
||||||
|
[self.hue, self.saturation, self.value, self.alpha]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_f32_array_no_alpha(self) -> [f32; 3] {
|
||||||
|
[self.hue, self.saturation, self.value]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec4(self) -> Vec4 {
|
||||||
|
Vec4::new(self.hue, self.saturation, self.value, self.alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec3(self) -> Vec3 {
|
||||||
|
Vec3::new(self.hue, self.saturation, self.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array(color: [f32; 4]) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
saturation: color[1],
|
||||||
|
value: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array_no_alpha(color: [f32; 3]) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
saturation: color[1],
|
||||||
|
value: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec4(color: Vec4) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
saturation: color[1],
|
||||||
|
value: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec3(color: Vec3) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
saturation: color[1],
|
||||||
|
value: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Derived Conversions
|
// Derived Conversions
|
||||||
|
|
||||||
impl From<Srgba> for Hsva {
|
impl From<Srgba> for Hsva {
|
||||||
|
|
|
@ -2,7 +2,10 @@
|
||||||
//! in [_HWB - A More Intuitive Hue-Based Color Model_] by _Smith et al_.
|
//! 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
|
//! [_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, ColorToComponents, Hue, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza,
|
||||||
|
};
|
||||||
|
use bevy_math::{Vec3, Vec4};
|
||||||
use bevy_reflect::prelude::*;
|
use bevy_reflect::prelude::*;
|
||||||
|
|
||||||
/// Color in Hue-Whiteness-Blackness (HWB) color space with alpha.
|
/// Color in Hue-Whiteness-Blackness (HWB) color space with alpha.
|
||||||
|
@ -142,6 +145,60 @@ impl ClampColor for Hwba {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ColorToComponents for Hwba {
|
||||||
|
fn to_f32_array(self) -> [f32; 4] {
|
||||||
|
[self.hue, self.whiteness, self.blackness, self.alpha]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_f32_array_no_alpha(self) -> [f32; 3] {
|
||||||
|
[self.hue, self.whiteness, self.blackness]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec4(self) -> Vec4 {
|
||||||
|
Vec4::new(self.hue, self.whiteness, self.blackness, self.alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec3(self) -> Vec3 {
|
||||||
|
Vec3::new(self.hue, self.whiteness, self.blackness)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array(color: [f32; 4]) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
whiteness: color[1],
|
||||||
|
blackness: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array_no_alpha(color: [f32; 3]) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
whiteness: color[1],
|
||||||
|
blackness: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec4(color: Vec4) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
whiteness: color[1],
|
||||||
|
blackness: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec3(color: Vec3) -> Self {
|
||||||
|
Self {
|
||||||
|
hue: color[0],
|
||||||
|
whiteness: color[1],
|
||||||
|
blackness: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<Srgba> for Hwba {
|
impl From<Srgba> for Hwba {
|
||||||
fn from(
|
fn from(
|
||||||
Srgba {
|
Srgba {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
impl_componentwise_vector_space, Alpha, ClampColor, Hsla, Hsva, Hwba, LinearRgba, Luminance,
|
impl_componentwise_vector_space, Alpha, ClampColor, ColorToComponents, Hsla, Hsva, Hwba,
|
||||||
Mix, Oklaba, Srgba, StandardColor, Xyza,
|
LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza,
|
||||||
};
|
};
|
||||||
|
use bevy_math::{Vec3, Vec4};
|
||||||
use bevy_reflect::prelude::*;
|
use bevy_reflect::prelude::*;
|
||||||
|
|
||||||
/// Color in LAB color space, with alpha
|
/// Color in LAB color space, with alpha
|
||||||
|
@ -164,6 +165,60 @@ impl Luminance for Laba {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ColorToComponents for Laba {
|
||||||
|
fn to_f32_array(self) -> [f32; 4] {
|
||||||
|
[self.lightness, self.a, self.b, self.alpha]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_f32_array_no_alpha(self) -> [f32; 3] {
|
||||||
|
[self.lightness, self.a, self.b]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec4(self) -> Vec4 {
|
||||||
|
Vec4::new(self.lightness, self.a, self.b, self.alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec3(self) -> Vec3 {
|
||||||
|
Vec3::new(self.lightness, self.a, self.b)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array(color: [f32; 4]) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
a: color[1],
|
||||||
|
b: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array_no_alpha(color: [f32; 3]) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
a: color[1],
|
||||||
|
b: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec4(color: Vec4) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
a: color[1],
|
||||||
|
b: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec3(color: Vec3) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
a: color[1],
|
||||||
|
b: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<Laba> for Xyza {
|
impl From<Laba> for Xyza {
|
||||||
fn from(
|
fn from(
|
||||||
Laba {
|
Laba {
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
use crate::{Alpha, ClampColor, Hue, Laba, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza};
|
use crate::{
|
||||||
|
Alpha, ClampColor, ColorToComponents, Hue, Laba, LinearRgba, Luminance, Mix, Srgba,
|
||||||
|
StandardColor, Xyza,
|
||||||
|
};
|
||||||
|
use bevy_math::{Vec3, Vec4};
|
||||||
use bevy_reflect::prelude::*;
|
use bevy_reflect::prelude::*;
|
||||||
|
|
||||||
/// Color in LCH color space, with alpha
|
/// Color in LCH color space, with alpha
|
||||||
|
@ -200,6 +204,60 @@ impl ClampColor for Lcha {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ColorToComponents for Lcha {
|
||||||
|
fn to_f32_array(self) -> [f32; 4] {
|
||||||
|
[self.lightness, self.chroma, self.hue, self.alpha]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_f32_array_no_alpha(self) -> [f32; 3] {
|
||||||
|
[self.lightness, self.chroma, self.hue]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec4(self) -> Vec4 {
|
||||||
|
Vec4::new(self.lightness, self.chroma, self.hue, self.alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec3(self) -> Vec3 {
|
||||||
|
Vec3::new(self.lightness, self.chroma, self.hue)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array(color: [f32; 4]) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
chroma: color[1],
|
||||||
|
hue: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array_no_alpha(color: [f32; 3]) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
chroma: color[1],
|
||||||
|
hue: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec4(color: Vec4) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
chroma: color[1],
|
||||||
|
hue: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec3(color: Vec3) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
chroma: color[1],
|
||||||
|
hue: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<Lcha> for Laba {
|
impl From<Lcha> for Laba {
|
||||||
fn from(
|
fn from(
|
||||||
Lcha {
|
Lcha {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor,
|
color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor,
|
||||||
Luminance, Mix, StandardColor,
|
ColorToComponents, Luminance, Mix, StandardColor,
|
||||||
};
|
};
|
||||||
use bevy_math::Vec4;
|
use bevy_math::{Vec3, Vec4};
|
||||||
use bevy_reflect::prelude::*;
|
use bevy_reflect::prelude::*;
|
||||||
use bytemuck::{Pod, Zeroable};
|
use bytemuck::{Pod, Zeroable};
|
||||||
|
|
||||||
|
@ -281,15 +281,57 @@ impl ClampColor for LinearRgba {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<LinearRgba> for [f32; 4] {
|
impl ColorToComponents for LinearRgba {
|
||||||
fn from(color: LinearRgba) -> Self {
|
fn to_f32_array(self) -> [f32; 4] {
|
||||||
[color.red, color.green, color.blue, color.alpha]
|
[self.red, self.green, self.blue, self.alpha]
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl From<LinearRgba> for Vec4 {
|
fn to_f32_array_no_alpha(self) -> [f32; 3] {
|
||||||
fn from(color: LinearRgba) -> Self {
|
[self.red, self.green, self.blue]
|
||||||
Vec4::new(color.red, color.green, color.blue, color.alpha)
|
}
|
||||||
|
|
||||||
|
fn to_vec4(self) -> Vec4 {
|
||||||
|
Vec4::new(self.red, self.green, self.blue, self.alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec3(self) -> Vec3 {
|
||||||
|
Vec3::new(self.red, self.green, self.blue)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array(color: [f32; 4]) -> Self {
|
||||||
|
Self {
|
||||||
|
red: color[0],
|
||||||
|
green: color[1],
|
||||||
|
blue: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array_no_alpha(color: [f32; 3]) -> Self {
|
||||||
|
Self {
|
||||||
|
red: color[0],
|
||||||
|
green: color[1],
|
||||||
|
blue: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec4(color: Vec4) -> Self {
|
||||||
|
Self {
|
||||||
|
red: color[0],
|
||||||
|
green: color[1],
|
||||||
|
blue: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec3(color: Vec3) -> Self {
|
||||||
|
Self {
|
||||||
|
red: color[0],
|
||||||
|
green: color[1],
|
||||||
|
blue: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor, Hsla,
|
color_difference::EuclideanDistance, impl_componentwise_vector_space, Alpha, ClampColor,
|
||||||
Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor, Xyza,
|
ColorToComponents, Hsla, Hsva, Hwba, Lcha, LinearRgba, Luminance, Mix, Srgba, StandardColor,
|
||||||
|
Xyza,
|
||||||
};
|
};
|
||||||
|
use bevy_math::{Vec3, Vec4};
|
||||||
use bevy_reflect::prelude::*;
|
use bevy_reflect::prelude::*;
|
||||||
|
|
||||||
/// Color in Oklab color space, with alpha
|
/// Color in Oklab color space, with alpha
|
||||||
|
@ -173,6 +175,60 @@ impl ClampColor for Oklaba {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ColorToComponents for Oklaba {
|
||||||
|
fn to_f32_array(self) -> [f32; 4] {
|
||||||
|
[self.lightness, self.a, self.b, self.alpha]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_f32_array_no_alpha(self) -> [f32; 3] {
|
||||||
|
[self.lightness, self.a, self.b]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec4(self) -> Vec4 {
|
||||||
|
Vec4::new(self.lightness, self.a, self.b, self.alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec3(self) -> Vec3 {
|
||||||
|
Vec3::new(self.lightness, self.a, self.b)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array(color: [f32; 4]) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
a: color[1],
|
||||||
|
b: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array_no_alpha(color: [f32; 3]) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
a: color[1],
|
||||||
|
b: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec4(color: Vec4) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
a: color[1],
|
||||||
|
b: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec3(color: Vec3) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
a: color[1],
|
||||||
|
b: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(clippy::excessive_precision)]
|
#[allow(clippy::excessive_precision)]
|
||||||
impl From<LinearRgba> for Oklaba {
|
impl From<LinearRgba> for Oklaba {
|
||||||
fn from(value: LinearRgba) -> Self {
|
fn from(value: LinearRgba) -> Self {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
color_difference::EuclideanDistance, Alpha, ClampColor, Hsla, Hsva, Hue, Hwba, Laba, Lcha,
|
color_difference::EuclideanDistance, Alpha, ClampColor, ColorToComponents, Hsla, Hsva, Hue,
|
||||||
LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza,
|
Hwba, Laba, Lcha, LinearRgba, Luminance, Mix, Oklaba, Srgba, StandardColor, Xyza,
|
||||||
};
|
};
|
||||||
|
use bevy_math::{Vec3, Vec4};
|
||||||
use bevy_reflect::prelude::*;
|
use bevy_reflect::prelude::*;
|
||||||
|
|
||||||
/// Color in Oklch color space, with alpha
|
/// Color in Oklch color space, with alpha
|
||||||
|
@ -190,6 +191,60 @@ impl EuclideanDistance for Oklcha {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ColorToComponents for Oklcha {
|
||||||
|
fn to_f32_array(self) -> [f32; 4] {
|
||||||
|
[self.lightness, self.chroma, self.hue, self.alpha]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_f32_array_no_alpha(self) -> [f32; 3] {
|
||||||
|
[self.lightness, self.chroma, self.hue]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec4(self) -> Vec4 {
|
||||||
|
Vec4::new(self.lightness, self.chroma, self.hue, self.alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec3(self) -> Vec3 {
|
||||||
|
Vec3::new(self.lightness, self.chroma, self.hue)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array(color: [f32; 4]) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
chroma: color[1],
|
||||||
|
hue: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array_no_alpha(color: [f32; 3]) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
chroma: color[1],
|
||||||
|
hue: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec4(color: Vec4) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
chroma: color[1],
|
||||||
|
hue: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec3(color: Vec3) -> Self {
|
||||||
|
Self {
|
||||||
|
lightness: color[0],
|
||||||
|
chroma: color[1],
|
||||||
|
hue: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<Oklaba> for Oklcha {
|
impl From<Oklaba> for Oklcha {
|
||||||
fn from(
|
fn from(
|
||||||
Oklaba {
|
Oklaba {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
use crate::color_difference::EuclideanDistance;
|
use crate::color_difference::EuclideanDistance;
|
||||||
use crate::{
|
use crate::{
|
||||||
impl_componentwise_vector_space, Alpha, ClampColor, LinearRgba, Luminance, Mix, StandardColor,
|
impl_componentwise_vector_space, Alpha, ClampColor, ColorToComponents, LinearRgba, Luminance,
|
||||||
Xyza,
|
Mix, StandardColor, Xyza,
|
||||||
};
|
};
|
||||||
use bevy_math::Vec4;
|
use bevy_math::{Vec3, Vec4};
|
||||||
use bevy_reflect::prelude::*;
|
use bevy_reflect::prelude::*;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
|
@ -332,6 +332,60 @@ impl ClampColor for Srgba {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ColorToComponents for Srgba {
|
||||||
|
fn to_f32_array(self) -> [f32; 4] {
|
||||||
|
[self.red, self.green, self.blue, self.alpha]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_f32_array_no_alpha(self) -> [f32; 3] {
|
||||||
|
[self.red, self.green, self.blue]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec4(self) -> Vec4 {
|
||||||
|
Vec4::new(self.red, self.green, self.blue, self.alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec3(self) -> Vec3 {
|
||||||
|
Vec3::new(self.red, self.green, self.blue)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array(color: [f32; 4]) -> Self {
|
||||||
|
Self {
|
||||||
|
red: color[0],
|
||||||
|
green: color[1],
|
||||||
|
blue: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array_no_alpha(color: [f32; 3]) -> Self {
|
||||||
|
Self {
|
||||||
|
red: color[0],
|
||||||
|
green: color[1],
|
||||||
|
blue: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec4(color: Vec4) -> Self {
|
||||||
|
Self {
|
||||||
|
red: color[0],
|
||||||
|
green: color[1],
|
||||||
|
blue: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec3(color: Vec3) -> Self {
|
||||||
|
Self {
|
||||||
|
red: color[0],
|
||||||
|
green: color[1],
|
||||||
|
blue: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<LinearRgba> for Srgba {
|
impl From<LinearRgba> for Srgba {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from(value: LinearRgba) -> Self {
|
fn from(value: LinearRgba) -> Self {
|
||||||
|
@ -356,18 +410,6 @@ impl From<Srgba> for LinearRgba {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Srgba> for [f32; 4] {
|
|
||||||
fn from(color: Srgba) -> Self {
|
|
||||||
[color.red, color.green, color.blue, color.alpha]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Srgba> for Vec4 {
|
|
||||||
fn from(color: Srgba) -> Self {
|
|
||||||
Vec4::new(color.red, color.green, color.blue, color.alpha)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Derived Conversions
|
// Derived Conversions
|
||||||
|
|
||||||
impl From<Xyza> for Srgba {
|
impl From<Xyza> for Srgba {
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
impl_componentwise_vector_space, Alpha, ClampColor, LinearRgba, Luminance, Mix, StandardColor,
|
impl_componentwise_vector_space, Alpha, ClampColor, ColorToComponents, LinearRgba, Luminance,
|
||||||
|
Mix, StandardColor,
|
||||||
};
|
};
|
||||||
|
use bevy_math::{Vec3, Vec4};
|
||||||
use bevy_reflect::prelude::*;
|
use bevy_reflect::prelude::*;
|
||||||
|
|
||||||
/// [CIE 1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space, also known as XYZ, with an alpha channel.
|
/// [CIE 1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space, also known as XYZ, with an alpha channel.
|
||||||
|
@ -160,6 +162,60 @@ impl ClampColor for Xyza {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ColorToComponents for Xyza {
|
||||||
|
fn to_f32_array(self) -> [f32; 4] {
|
||||||
|
[self.x, self.y, self.z, self.alpha]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_f32_array_no_alpha(self) -> [f32; 3] {
|
||||||
|
[self.x, self.y, self.z]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec4(self) -> Vec4 {
|
||||||
|
Vec4::new(self.x, self.y, self.z, self.alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_vec3(self) -> Vec3 {
|
||||||
|
Vec3::new(self.x, self.y, self.z)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array(color: [f32; 4]) -> Self {
|
||||||
|
Self {
|
||||||
|
x: color[0],
|
||||||
|
y: color[1],
|
||||||
|
z: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_f32_array_no_alpha(color: [f32; 3]) -> Self {
|
||||||
|
Self {
|
||||||
|
x: color[0],
|
||||||
|
y: color[1],
|
||||||
|
z: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec4(color: Vec4) -> Self {
|
||||||
|
Self {
|
||||||
|
x: color[0],
|
||||||
|
y: color[1],
|
||||||
|
z: color[2],
|
||||||
|
alpha: color[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_vec3(color: Vec3) -> Self {
|
||||||
|
Self {
|
||||||
|
x: color[0],
|
||||||
|
y: color[1],
|
||||||
|
z: color[2],
|
||||||
|
alpha: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<LinearRgba> for Xyza {
|
impl From<LinearRgba> for Xyza {
|
||||||
fn from(
|
fn from(
|
||||||
LinearRgba {
|
LinearRgba {
|
||||||
|
|
|
@ -1509,7 +1509,7 @@ mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "multi-threaded")]
|
#[cfg(feature = "multi_threaded")]
|
||||||
#[test]
|
#[test]
|
||||||
fn test_events_par_iter() {
|
fn test_events_par_iter() {
|
||||||
use std::{collections::HashSet, sync::mpsc};
|
use std::{collections::HashSet, sync::mpsc};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use bevy_app::{App, Plugin};
|
use bevy_app::{App, Plugin};
|
||||||
use bevy_asset::{load_internal_asset, Handle};
|
use bevy_asset::{load_internal_asset, Handle};
|
||||||
use bevy_color::LinearRgba;
|
use bevy_color::{ColorToComponents, LinearRgba};
|
||||||
use bevy_ecs::prelude::*;
|
use bevy_ecs::prelude::*;
|
||||||
use bevy_math::{Vec3, Vec4};
|
use bevy_math::{Vec3, Vec4};
|
||||||
use bevy_render::{
|
use bevy_render::{
|
||||||
|
@ -66,24 +66,27 @@ pub fn prepare_fog(
|
||||||
match &fog.falloff {
|
match &fog.falloff {
|
||||||
FogFalloff::Linear { start, end } => GpuFog {
|
FogFalloff::Linear { start, end } => GpuFog {
|
||||||
mode: GPU_FOG_MODE_LINEAR,
|
mode: GPU_FOG_MODE_LINEAR,
|
||||||
base_color: LinearRgba::from(fog.color).into(),
|
base_color: LinearRgba::from(fog.color).to_vec4(),
|
||||||
directional_light_color: LinearRgba::from(fog.directional_light_color).into(),
|
directional_light_color: LinearRgba::from(fog.directional_light_color)
|
||||||
|
.to_vec4(),
|
||||||
directional_light_exponent: fog.directional_light_exponent,
|
directional_light_exponent: fog.directional_light_exponent,
|
||||||
be: Vec3::new(*start, *end, 0.0),
|
be: Vec3::new(*start, *end, 0.0),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
FogFalloff::Exponential { density } => GpuFog {
|
FogFalloff::Exponential { density } => GpuFog {
|
||||||
mode: GPU_FOG_MODE_EXPONENTIAL,
|
mode: GPU_FOG_MODE_EXPONENTIAL,
|
||||||
base_color: LinearRgba::from(fog.color).into(),
|
base_color: LinearRgba::from(fog.color).to_vec4(),
|
||||||
directional_light_color: LinearRgba::from(fog.directional_light_color).into(),
|
directional_light_color: LinearRgba::from(fog.directional_light_color)
|
||||||
|
.to_vec4(),
|
||||||
directional_light_exponent: fog.directional_light_exponent,
|
directional_light_exponent: fog.directional_light_exponent,
|
||||||
be: Vec3::new(*density, 0.0, 0.0),
|
be: Vec3::new(*density, 0.0, 0.0),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
FogFalloff::ExponentialSquared { density } => GpuFog {
|
FogFalloff::ExponentialSquared { density } => GpuFog {
|
||||||
mode: GPU_FOG_MODE_EXPONENTIAL_SQUARED,
|
mode: GPU_FOG_MODE_EXPONENTIAL_SQUARED,
|
||||||
base_color: LinearRgba::from(fog.color).into(),
|
base_color: LinearRgba::from(fog.color).to_vec4(),
|
||||||
directional_light_color: LinearRgba::from(fog.directional_light_color).into(),
|
directional_light_color: LinearRgba::from(fog.directional_light_color)
|
||||||
|
.to_vec4(),
|
||||||
directional_light_exponent: fog.directional_light_exponent,
|
directional_light_exponent: fog.directional_light_exponent,
|
||||||
be: Vec3::new(*density, 0.0, 0.0),
|
be: Vec3::new(*density, 0.0, 0.0),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
@ -93,8 +96,9 @@ pub fn prepare_fog(
|
||||||
inscattering,
|
inscattering,
|
||||||
} => GpuFog {
|
} => GpuFog {
|
||||||
mode: GPU_FOG_MODE_ATMOSPHERIC,
|
mode: GPU_FOG_MODE_ATMOSPHERIC,
|
||||||
base_color: LinearRgba::from(fog.color).into(),
|
base_color: LinearRgba::from(fog.color).to_vec4(),
|
||||||
directional_light_color: LinearRgba::from(fog.directional_light_color).into(),
|
directional_light_color: LinearRgba::from(fog.directional_light_color)
|
||||||
|
.to_vec4(),
|
||||||
directional_light_exponent: fog.directional_light_exponent,
|
directional_light_exponent: fog.directional_light_exponent,
|
||||||
be: *extinction,
|
be: *extinction,
|
||||||
bi: *inscattering,
|
bi: *inscattering,
|
||||||
|
|
Loading…
Add table
Reference in a new issue