diff --git a/src/args.rs b/src/args.rs index 3b14cf9..37eea1d 100644 --- a/src/args.rs +++ b/src/args.rs @@ -35,12 +35,12 @@ pub struct CLIArgs { averaging_window: u32, /// Window width - #[arg(long = "width", default_value_t = 1000)] - window_width: i32, + #[arg(long = "width", default_value_t = 1000.0)] + window_width: f32, /// Window height - #[arg(long = "height", default_value_t = 700)] - window_height: i32, + #[arg(long = "height", default_value_t = 700.0)] + window_height: f32, /// Border size for each bar #[arg(long = "border-size", default_value_t = 1)] diff --git a/src/main.rs b/src/main.rs index 7d3f91e..48370cc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -56,8 +56,8 @@ struct FFTArgs { fft_fps: u32, bar_smoothness: u32, freq_resolution: u32, - window_width: i32, - window_height: i32, + window_width: f32, + window_height: f32, averaging_window: u32, min_freq: f32, max_freq: f32, @@ -128,7 +128,6 @@ fn main() { .into(), name: Some("fftviz".into()), resolution: (args.window_width as f32, args.window_height as f32).into(), - resizable: false, prevent_default_event_handling: false, enabled_buttons: bevy::window::EnabledButtons { maximize: false, diff --git a/src/systems/startup.rs b/src/systems/startup.rs index 40af2c4..28d76db 100644 --- a/src/systems/startup.rs +++ b/src/systems/startup.rs @@ -42,7 +42,7 @@ fn spawn_bars( transform: Transform::from_xyz( bar_size * i as f32 + (bar_size / 2.0) - (w / 2.0) as f32, 0.0, - 0.0, + -1.0, ), ..default() }) diff --git a/src/systems/update_view_settings.rs b/src/systems/update_view_settings.rs index 1166157..1c93b2b 100644 --- a/src/systems/update_view_settings.rs +++ b/src/systems/update_view_settings.rs @@ -29,9 +29,62 @@ pub fn update_view_settings ( mut clear_color: ResMut, mut text_query: Query<&mut Text>, mut differencing_args_query: Query<&mut FFTArgs>, + mut bar_query: Query<&mut Transform, Without> ) { let mut differencing_args = differencing_args_query.get_single_mut().unwrap(); + // Update bar sizes and positions on resize + let w = window.single_mut().width(); + if differencing_args.window_width != w { + let bar_size = w / app_state.fft[0].len() as f32; + for (i, b) in app_state.despawn_handles.chunks(2).enumerate() { + bar_query.get_mut(b[0]).unwrap().translation.x = bar_size * i as f32 + bar_size / 2.0 - w / 2.0; + bar_query.get_mut(b[1]).unwrap().translation.x = bar_size * i as f32 + bar_size / 2.0 - w / 2.0; + } + + + let outer_bar_size = bar_size / 2.0; + let inner_bar_size = (bar_size - args.border_size as f32) / 2.0; + + for handle in app_state.curr_bars.chunks(2) { + let handle1 = handle[0].0.clone_weak(); + let handle2 = handle[1].0.clone_weak(); + + let dims = meshes + .get_mut(handle1) + .unwrap() + .attribute_mut(Mesh::ATTRIBUTE_POSITION) + .unwrap(); + + match dims { + VertexAttributeValues::Float32x3(x) => { + x[0][0] = outer_bar_size; + x[1][0] = -outer_bar_size; + x[2][0] = -outer_bar_size; + x[3][0] = outer_bar_size; + } + _ => {} + } + + let dims = meshes + .get_mut(handle2) + .unwrap() + .attribute_mut(Mesh::ATTRIBUTE_POSITION) + .unwrap(); + + match dims { + VertexAttributeValues::Float32x3(x) => { + x[0][0] = inner_bar_size; + x[1][0] = -inner_bar_size; + x[2][0] = -inner_bar_size; + x[3][0] = inner_bar_size; + } + _ => {} + } + } + differencing_args.window_width = w; + } + // Update text color + visibility + size if differencing_args.text_color != args.text_color || differencing_args.track_name != args.track_name || differencing_args.font_size != args.font_size { for mut text in &mut text_query {