Search across packages, versions, files, declarations, and comments. Use multiple terms to narrow results (AND), and add @vertex, @fragment, or @compute to filter by shader stage.
1#import bevy_ui::ui_vertex_output::UiVertexOutput
3@group(1) @binding(0) var<storage> values: array<f32>;
4struct Config {
5 dt_min: f32,
6 dt_max: f32,
7 dt_min_log2: f32,
8 dt_max_log2: f32,
9 proportional_width: u32,
11@group(1) @binding(1) var<uniform> config: Config;
13const RED: vec4<f32> = vec4(1.0, 0.0, 0.0, 1.0);
14const GREEN: vec4<f32> = vec4(0.0, 1.0, 0.0, 1.0);
16// Gets a color based on the delta time
17// TODO use customizable gradient
18fn color_from_dt(dt: f32) -> vec4<f32> {
19 return mix(GREEN, RED, dt / config.dt_max);
22// Draw an SDF square
23fn sdf_square(pos: vec2<f32>, half_size: vec2<f32>, offset: vec2<f32>) -> f32 {
24 let p = pos - offset;
25 let dist = abs(p) - half_size;
26 let outside_dist = length(max(dist, vec2<f32>(0.0, 0.0)));
27 let inside_dist = min(max(dist.x, dist.y), 0.0);
28 return outside_dist + inside_dist;
31@fragment
32fn fragment(in: UiVertexOutput) -> @location(0) vec4<f32> {
33 let dt_min = config.dt_min;
34 let dt_max = config.dt_max;
35 let dt_min_log2 = config.dt_min_log2;
36 let dt_max_log2 = config.dt_max_log2;
38 // The general algorithm is highly inspired by
39 // <https://asawicki.info/news_1758_an_idea_for_visualization_of_frame_times>
41 let len = arrayLength(&values);
42 var graph_width = 0.0;
43 for (var i = 1u; i <= len; i += 1u) {
44 let dt = values[len - i];
46 var frame_width: f32;
47 if config.proportional_width == 1u {
48 frame_width = (dt / dt_min) / f32(len);
49 } else {
50 frame_width = 0.015;
51 }
53 let frame_height_factor = (log2(dt) - dt_min_log2) / (dt_max_log2 - dt_min_log2);
54 let frame_height_factor_norm = min(max(0.0, frame_height_factor), 1.0);
55 let frame_height = mix(0.0, 1.0, frame_height_factor_norm);
57 let size = vec2(frame_width, frame_height) / 2.0;
58 let offset = vec2(1.0 - graph_width - size.x, 1. - size.y);
59 if (sdf_square(in.uv, size, offset) < 0.0) {
60 return color_from_dt(dt);
61 }
63 graph_width += frame_width;
64 }
66 return vec4(0.0, 0.0, 0.0, 0.5);
Contents