mirror of
https://github.com/bevyengine/bevy
synced 2024-11-24 21:53:07 +00:00
Implement Mix
for Hsva
and Hwba
(#12619)
# Objective - Fixes #12618 ## Solution - Implemented `Mix` for `Hsva` and `Hwba` following the implementation approach of `Hsla`.
This commit is contained in:
parent
70d8ce7762
commit
7673afb03e
2 changed files with 44 additions and 2 deletions
|
@ -1,4 +1,4 @@
|
|||
use crate::{Alpha, ClampColor, Hue, Hwba, Lcha, LinearRgba, Srgba, StandardColor, Xyza};
|
||||
use crate::{Alpha, ClampColor, Hue, Hwba, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza};
|
||||
use bevy_reflect::prelude::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
|
@ -69,6 +69,27 @@ impl Default for Hsva {
|
|||
}
|
||||
}
|
||||
|
||||
impl Mix for Hsva {
|
||||
#[inline]
|
||||
fn mix(&self, other: &Self, factor: f32) -> Self {
|
||||
let n_factor = 1.0 - factor;
|
||||
// TODO: Refactor this into EuclideanModulo::lerp_modulo
|
||||
let shortest_angle = ((((other.hue - self.hue) % 360.) + 540.) % 360.) - 180.;
|
||||
let mut hue = self.hue + shortest_angle * factor;
|
||||
if hue < 0. {
|
||||
hue += 360.;
|
||||
} else if hue >= 360. {
|
||||
hue -= 360.;
|
||||
}
|
||||
Self {
|
||||
hue,
|
||||
saturation: self.saturation * n_factor + other.saturation * factor,
|
||||
value: self.value * n_factor + other.value * factor,
|
||||
alpha: self.alpha * n_factor + other.alpha * factor,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Alpha for Hsva {
|
||||
#[inline]
|
||||
fn with_alpha(&self, alpha: f32) -> Self {
|
||||
|
|
|
@ -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, Srgba, StandardColor, Xyza};
|
||||
use crate::{Alpha, ClampColor, Hue, Lcha, LinearRgba, Mix, Srgba, StandardColor, Xyza};
|
||||
use bevy_reflect::prelude::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
|
@ -73,6 +73,27 @@ impl Default for Hwba {
|
|||
}
|
||||
}
|
||||
|
||||
impl Mix for Hwba {
|
||||
#[inline]
|
||||
fn mix(&self, other: &Self, factor: f32) -> Self {
|
||||
let n_factor = 1.0 - factor;
|
||||
// TODO: Refactor this into EuclideanModulo::lerp_modulo
|
||||
let shortest_angle = ((((other.hue - self.hue) % 360.) + 540.) % 360.) - 180.;
|
||||
let mut hue = self.hue + shortest_angle * factor;
|
||||
if hue < 0. {
|
||||
hue += 360.;
|
||||
} else if hue >= 360. {
|
||||
hue -= 360.;
|
||||
}
|
||||
Self {
|
||||
hue,
|
||||
whiteness: self.whiteness * n_factor + other.whiteness * factor,
|
||||
blackness: self.blackness * n_factor + other.blackness * factor,
|
||||
alpha: self.alpha * n_factor + other.alpha * factor,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Alpha for Hwba {
|
||||
#[inline]
|
||||
fn with_alpha(&self, alpha: f32) -> Self {
|
||||
|
|
Loading…
Reference in a new issue