
# Objective Add support for interpolation in OKLab and OKLCH color spaces for UI gradients. ## Solution * New `InterpolationColorSpace` enum with `OkLab`, `OkLch`, `OkLchLong`, `Srgb` and `LinearRgb` variants. * Added a color space specialization to the gradients pipeline. * Added support for interpolation in OkLCH and OkLAB color spaces to the gradients shader. OKLCH interpolation supports both short and long hue paths. This is mostly based on the conversion functions from `bevy_color` except that interpolation in polar space uses radians. * Added `color_space` fields to each gradient type. ## Testing The `gradients` example has been updated to demonstrate the different color interpolation methods. Press space to cycle through the different options. --- ## Showcase 
92 lines
3.3 KiB
Rust
92 lines
3.3 KiB
Rust
//! An example demonstrating overlaid gradients
|
|
|
|
use bevy::color::palettes::css::BLUE;
|
|
use bevy::color::palettes::css::RED;
|
|
use bevy::color::palettes::css::YELLOW;
|
|
use bevy::prelude::*;
|
|
use core::f32::consts::TAU;
|
|
|
|
fn main() {
|
|
App::new()
|
|
.add_plugins(DefaultPlugins)
|
|
.add_systems(Startup, setup)
|
|
.run();
|
|
}
|
|
|
|
fn setup(mut commands: Commands) {
|
|
commands.spawn(Camera2d);
|
|
commands
|
|
.spawn(Node {
|
|
display: Display::Grid,
|
|
width: Val::Percent(100.),
|
|
height: Val::Percent(100.),
|
|
|
|
..Default::default()
|
|
})
|
|
.with_children(|commands| {
|
|
commands.spawn((
|
|
Node {
|
|
width: Val::Percent(100.),
|
|
height: Val::Percent(100.),
|
|
..Default::default()
|
|
},
|
|
BackgroundColor(Color::BLACK),
|
|
BackgroundGradient(vec![
|
|
LinearGradient::to_top_right(vec![
|
|
ColorStop::auto(RED),
|
|
ColorStop::auto(RED.with_alpha(0.)),
|
|
])
|
|
.into(),
|
|
LinearGradient::to_top_left(vec![
|
|
ColorStop::auto(BLUE),
|
|
ColorStop::auto(BLUE.with_alpha(0.)),
|
|
])
|
|
.into(),
|
|
ConicGradient {
|
|
start: 0.,
|
|
position: UiPosition::CENTER,
|
|
stops: vec![
|
|
AngularColorStop::auto(YELLOW.with_alpha(0.)),
|
|
AngularColorStop::auto(YELLOW.with_alpha(0.)),
|
|
AngularColorStop::auto(YELLOW),
|
|
AngularColorStop::auto(YELLOW.with_alpha(0.)),
|
|
AngularColorStop::auto(YELLOW.with_alpha(0.)),
|
|
],
|
|
..Default::default()
|
|
}
|
|
.into(),
|
|
RadialGradient {
|
|
position: UiPosition::TOP.at_x(Val::Percent(5.)),
|
|
shape: RadialGradientShape::Circle(Val::Vh(30.)),
|
|
stops: vec![
|
|
ColorStop::auto(Color::WHITE),
|
|
ColorStop::auto(YELLOW),
|
|
ColorStop::auto(YELLOW.with_alpha(0.1)),
|
|
ColorStop::auto(YELLOW.with_alpha(0.)),
|
|
],
|
|
..Default::default()
|
|
}
|
|
.into(),
|
|
LinearGradient {
|
|
angle: TAU / 16.,
|
|
stops: vec![
|
|
ColorStop::auto(Color::BLACK),
|
|
ColorStop::auto(Color::BLACK.with_alpha(0.)),
|
|
],
|
|
..Default::default()
|
|
}
|
|
.into(),
|
|
LinearGradient {
|
|
angle: 15. * TAU / 16.,
|
|
stops: vec![
|
|
ColorStop::auto(Color::BLACK),
|
|
ColorStop::auto(Color::BLACK.with_alpha(0.)),
|
|
],
|
|
..Default::default()
|
|
}
|
|
.into(),
|
|
]),
|
|
));
|
|
});
|
|
}
|