From 21df9da95c8e649291ebe0091d7c1569f45ec822 Mon Sep 17 00:00:00 2001 From: hut Date: Sun, 28 Apr 2024 05:42:00 +0200 Subject: [PATCH] add second speedometer for very high speeds --- assets/sprites/speedometer_white.png | Bin 0 -> 5589 bytes media/speedometer2.svg | 10 +- media/speedometer2white.svg | 295 +++++++++++++++++++++++++++ src/hud.rs | 76 +++++-- 4 files changed, 362 insertions(+), 19 deletions(-) create mode 100644 assets/sprites/speedometer_white.png create mode 100644 media/speedometer2white.svg diff --git a/assets/sprites/speedometer_white.png b/assets/sprites/speedometer_white.png new file mode 100644 index 0000000000000000000000000000000000000000..7f896867d105d84062ebb32579b7435488308b4d GIT binary patch literal 5589 zcmeHLYfMvT82(TOXhcArAeRPbM@>Yaf=ZRUkkSxZog2z3ayg-`AebKQsHGT{gp)v_1Jw+w;E9 z`##V6oRhzu%`{(ZyBGjq&I%6v1OPK*0E{ZlOyJIJ(aZbrV^LCYI1d2IP4qHK=s4;F zH&>+u?M~U5xIcv-og54Je7?)UghMg#;(*@m+>%aPs(o1J@SI zI5J_P39%$kz1U+-tIwXuTi?oP@*vJi_%*(4#7ng1(bdB6PwiHz7%@W_hP>Bb~A zEe-a(-OTo7{=m=beM?@|Tf)n7mNy{YZ^J}VDa8nIEy?6viH)r4Nbi_!1yxXwxkomT z-SURfsAtT7ofY~KE-XxFOAE(aVD8;_T5RU_crO5+{2X19siSSw`k0BlQ>Qu?0-<$_ zT%Y?|s$Ld_0pxc9_>XTkz#P!(qpKU&%5#xpNyJ1KcNGBOX-y_^EhQ1>?t&~=7iI`1 z%z%*h#IUwSKjb?g{i5;2DoDRcF}*ATRzcXjT-So}Bk{N$461vk&~h4k7Sw;7e} z0xa3!G@WplFkuvV$ixrrf;!NJWo@M?VN>qicdvB3huZY0xh(T~vS@S?RS>*#)f(-Z`ya4e!l9N~+m9)NyZE%Z zDJOVVY!F4)b(HWIs4tu35vX=NOq2~h6$-l85x#>5ThH~1A!NrmTF8KNuL0Ob8XPZ( z(+{0?n>4pH&7Q!WT?AO&wMRD&= zW@BvmFsEx0MNP{q)baryzQc09Zjrb;0sL#(cri~|)O#N3R5~U~tkwc2>(@FG@#U`X z)|sWo>#Pgg!Vomn)=$`6!rNQedj>_(g^41y$T`W+LFCFQ4wzSi7CGR7q$&x|pvs5P z{oZkEokNcz1ouk5#nlY`NX-sMOaY+e-=M^cn|B#}R@OCGKcyS->iK{bx-(p_!O@@a%&P+*JkIxaBOM_GFtPI%9ZjnfHE7@RwBRea$H zCHpN@FZNqP*1~aNzEmOI*nDf_XdW!+F`R(6--`R z1OB)c1$>51(9obni|qtGVEO6ZL1+l=PGr=Dbk)slHP@ahbvINaiXW8nsPINtd`iI} zQm0XDn`!mY7U`O2_vi#)ADe2QrLkX=J1YSVgh?lcn_2J}k&-#{8#PB8AOK5m8^Xju zZ_(YvPP;y;m`V~HIaWkm5_}Z*c;71CW1wHTNhKAz3?biF}SgzC=8X96~qp#4v5P6 E6GaAw*8l(j literal 0 HcmV?d00001 diff --git a/media/speedometer2.svg b/media/speedometer2.svg index 2655e94..a2e4203 100644 --- a/media/speedometer2.svg +++ b/media/speedometer2.svg @@ -2,9 +2,9 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/hud.rs b/src/hud.rs index 1aa4bfe..3b0a20f 100644 --- a/src/hud.rs +++ b/src/hud.rs @@ -25,6 +25,8 @@ pub const LOG_MAX_TIME_S: f64 = 30.0; pub const LOG_MAX_ROWS: usize = 30; pub const LOG_MAX: usize = LOG_MAX_ROWS; pub const MAX_CHOICES: usize = 10; +pub const SPEEDOMETER_WIDTH: f32 = 40.0; +pub const SPEEDOMETER_HEIGHT: f32 = 10.0; pub const AMBIENT_LIGHT: f32 = 0.0; // Space is DARK pub const AMBIENT_LIGHT_AR: f32 = 30.0; //pub const REPLY_NUMBERS: [char; 10] = ['❶', '❷', '❸', '❹', '❺', '❻', '❼', '❽', '❾', '⓿']; @@ -37,6 +39,7 @@ impl Plugin for HudPlugin { app.add_systems(Startup, setup); app.add_systems(Update, ( update_hud, + update_speedometer, handle_input, handle_target_event, )); @@ -75,6 +78,7 @@ impl Plugin for HudPlugin { #[derive(Component)] struct NodeCurrentChatLine; #[derive(Component)] struct Reticule; #[derive(Component)] struct Speedometer; +#[derive(Component)] struct Speedometer2; #[derive(Component)] pub struct ToggleableHudElement; #[derive(Component)] pub struct ToggleableHudMapElement; #[derive(Component)] struct Selectagon; @@ -321,11 +325,12 @@ fn setup( }); // Add Speedometer - let reticule_handle: Handle = asset_server.load("sprites/speedometer.png"); + let speedometer_height = 10.0; + let speedometer_handle: Handle = asset_server.load("sprites/speedometer.png"); commands.spawn(( NodeBundle { style: Style { - width: Val::VMin(10.0), + width: Val::VMin(0.0), height: Val::Percent(100.0), align_items: AlignItems::End, overflow: Overflow::clip(), @@ -339,10 +344,38 @@ fn setup( )).with_children(|builder| { builder.spawn(( ImageBundle { - image: UiImage::new(reticule_handle), + image: UiImage::new(speedometer_handle), style: Style { - width: Val::VMin(50.0), - height: Val::VMin(10.0), + width: Val::VMin(SPEEDOMETER_WIDTH), + height: Val::VMin(SPEEDOMETER_HEIGHT), + ..Default::default() + }, + ..Default::default() + }, + )); + }); + let speedometer_handle: Handle = asset_server.load("sprites/speedometer_white.png"); + commands.spawn(( + NodeBundle { + style: Style { + width: Val::VMin(0.0), + height: Val::Percent(100.0), + align_items: AlignItems::End, + overflow: Overflow::clip(), + ..default() + }, + visibility, + ..default() + }, + Speedometer2, + ToggleableHudElement, + )).with_children(|builder| { + builder.spawn(( + ImageBundle { + image: UiImage::new(speedometer_handle), + style: Style { + width: Val::VMin(SPEEDOMETER_WIDTH), + height: Val::VMin(SPEEDOMETER_HEIGHT), ..Default::default() }, ..Default::default() @@ -411,6 +444,30 @@ fn setup( ew_updateoverlays.send(UpdateOverlayVisibility); } +fn update_speedometer( + q_camera: Query<&LinearVelocity, With>, + mut q_speedometer: Query<&mut Style, (With, Without)>, + mut q_speedometer2: Query<&mut Style, (With, Without)>, +) { + if let Ok(cam_v) = q_camera.get_single() { + let speed = cam_v.length(); + + let speedometer_split = 5_000.0; + if let Ok(mut speedometer) = q_speedometer.get_single_mut() { + let custom_c = speedometer_split; + let fraction = nature::lorenz_factor_custom_c((custom_c - speed).clamp(0.0, custom_c), custom_c).clamp(0.0, 1.0) as f32; + let wid = (fraction * SPEEDOMETER_WIDTH).clamp(0.0, 100.0); + speedometer.width = Val::VMin(wid); + } + if let Ok(mut speedometer2) = q_speedometer2.get_single_mut() { + let custom_c = nature::C - speedometer_split; + let fraction = nature::lorenz_factor_custom_c((custom_c - speed + speedometer_split).clamp(0.0, custom_c), custom_c).clamp(0.0, 1.0) as f32; + let wid = (fraction * SPEEDOMETER_WIDTH).clamp(0.0, 100.0); + speedometer2.width = Val::VMin(wid); + } + } +} + fn update_hud( diagnostics: Res, time: Res