Skip to content

Commit fff060d

Browse files
Preconvert colors to sRGB
1 parent f1eace6 commit fff060d

File tree

4 files changed

+321
-178
lines changed

4 files changed

+321
-178
lines changed

Cargo.toml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3068,6 +3068,17 @@ description = "Test rendering of many UI elements"
30683068
category = "Stress Tests"
30693069
wasm = true
30703070

3071+
[[example]]
3072+
name = "many_gradients"
3073+
path = "examples/stress_tests/many_gradients.rs"
3074+
doc-scrape-examples = true
3075+
3076+
[package.metadata.example.many_gradients]
3077+
name = "Many Gradients"
3078+
description = "Stress test for gradient rendering performance"
3079+
category = "Stress Tests"
3080+
wasm = true
3081+
30713082
[[example]]
30723083
name = "many_cameras_lights"
30733084
path = "examples/stress_tests/many_cameras_lights.rs"

crates/bevy_ui_render/src/gradient.rs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use core::{
77
use super::shader_flags::BORDER_ALL;
88
use crate::*;
99
use bevy_asset::*;
10-
use bevy_color::{ColorToComponents, LinearRgba};
10+
use bevy_color::{ColorToComponents, Hsla, Hsva, LinearRgba, Oklaba, Oklcha, Srgba};
1111
use bevy_ecs::{
1212
prelude::Component,
1313
system::{
@@ -654,6 +654,36 @@ struct UiGradientVertex {
654654
hint: f32,
655655
}
656656

657+
fn convert_color_to_space(color: LinearRgba, space: InterpolationColorSpace) -> [f32; 4] {
658+
match space {
659+
InterpolationColorSpace::OkLab => {
660+
let oklaba: Oklaba = color.into();
661+
[oklaba.lightness, oklaba.a, oklaba.b, oklaba.alpha]
662+
}
663+
InterpolationColorSpace::OkLch | InterpolationColorSpace::OkLchLong => {
664+
let oklcha: Oklcha = color.into();
665+
[oklcha.lightness, oklcha.chroma, oklcha.hue.to_radians(), oklcha.alpha]
666+
}
667+
InterpolationColorSpace::Srgb => {
668+
let srgba: Srgba = color.into();
669+
[srgba.red, srgba.green, srgba.blue, srgba.alpha]
670+
}
671+
InterpolationColorSpace::LinearRgb => {
672+
color.to_f32_array()
673+
}
674+
InterpolationColorSpace::Hsl | InterpolationColorSpace::HslLong => {
675+
let hsla: Hsla = color.into();
676+
// Normalize hue to 0..1 range for shader
677+
[hsla.hue / 360.0, hsla.saturation, hsla.lightness, hsla.alpha]
678+
}
679+
InterpolationColorSpace::Hsv | InterpolationColorSpace::HsvLong => {
680+
let hsva: Hsva = color.into();
681+
// Normalize hue to 0..1 range for shader
682+
[hsva.hue / 360.0, hsva.saturation, hsva.value, hsva.alpha]
683+
}
684+
}
685+
}
686+
657687
pub fn prepare_gradient(
658688
mut commands: Commands,
659689
render_device: Res<RenderDevice>,
@@ -804,8 +834,8 @@ pub fn prepare_gradient(
804834
continue;
805835
}
806836
}
807-
let start_color = start_stop.0.to_f32_array();
808-
let end_color = end_stop.0.to_f32_array();
837+
let start_color = convert_color_to_space(start_stop.0, gradient.color_space);
838+
let end_color = convert_color_to_space(end_stop.0, gradient.color_space);
809839
let mut stop_flags = flags;
810840
if 0. < start_stop.1
811841
&& (stop_index == gradient.stops_range.start || segment_count == 0)

0 commit comments

Comments
 (0)