From 54da2760914b52ee1be43c49d656ccceb14fe6a0 Mon Sep 17 00:00:00 2001 From: hut Date: Sun, 28 Apr 2024 03:15:45 +0200 Subject: [PATCH] add speedometer --- assets/sprites/speedometer.png | Bin 0 -> 6041 bytes media/speedometer.svg | 246 +++++++++++++++++++++++++++ media/speedometer2.svg | 295 +++++++++++++++++++++++++++++++++ src/hud.rs | 40 +++++ src/nature.rs | 9 + 5 files changed, 590 insertions(+) create mode 100644 assets/sprites/speedometer.png create mode 100644 media/speedometer.svg create mode 100644 media/speedometer2.svg diff --git a/assets/sprites/speedometer.png b/assets/sprites/speedometer.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee1100e26d35fc6c5c72f419dd0ef02ca03d23e GIT binary patch literal 6041 zcmeHLdr(tX9=^yHF;CTH%= z$^G5$e82Da{mvzSKkqfGtyV)2w8qzGe;@>z+Cz}hZPT~Fm4M$&!r<$di9W}ZA!t)G z_AyH6NWp`PmZSs6NI}GC68U6O6htPIcbrX#O^!U77`20#bh>ET%?g4xZ1LT{??~Fs zDM3We=vdg(SromwyQ#O)x#*VV`rJOJ9{r>pa&H1!eVz1>u!l_bJg+BHnH!lggE38)<() zYw^9Tok7t4OY3w~+SZ+`bknu(d+G1rd19)YesJv_-FhhJ*8nr^2srf%-OTRboBgNU zGP(YxWpv4l4IcO-O-=IrYcJ1`#BHMMj#A+{ZjK(zMO)8Ud6&NjANGEp5l-!gTLNBx zXslcRGrW2r|0}z$3iY7LiX704ne3;v^+MR&Pr1}vT~#uHd|c|OXWfj|)!v0$)p_bN zdH$Ew%HQo=Wj69NSa*Ks118)^bJJAJip>|NA)mkLJ0#f=vgmLu;N*4$Hr`!?mvbK=rAOff~%{R~f&#C_dFD!)%o3yWz*x`n-)UtG5xo~eFzvEF- zf`pGsg+}b5cXc?V-HPT3cX4Ob;0IpLsz?lpoO5^IlxiB&iJ2xa5)*G2 zTSumHva7Cw!hvWP{B#=4T8AWLDL@WE2Ca4&%2kPZf7hg0$PI>k5%wb@rev49|R+>aawXR*6>7h6Wq z;2kUlFLWdlA(!=MM9n>iC394n&P77-;TYS-oU} z^|TnVKl2dt%O|J?2~J;>^Yb}7m?hQ($w(O-zH+J*oDtv#; zgANQdobtM6Ga**i?lrpIG)!Nk3vh6pe=L0E&jfey_=B<1p=1}PdejfCDao9<)#9|$ zycxH>*5MXs_%UVB6+He74X^ZS~%J3 zM22uUx`b5`sX-QbhpYP=Yk|ouA6isRibgl2&ZmxWjVtOM=3Se1!MG*H1Q&m+jHNvr6W4Fhz_s>2?lZ- z#rWXrlvSwms*}9{n$VU#YSTv#Y3T^Dt%0o4jHjQt zI1pT`L`8u$Al-w6i;h>W9s}BI#&6yF+%~S*Sw%SHL3DsBNr@- zi8pVe^zh4KT-^rnG3vt__CqG08H65~IfEs=OYF{uVBE?*d45^Fbhx}$$|Y5h4_B-D zmkFhH?zZ>0*2-SdWZ_ z9#gK{DrhFe;4I1;l|H4=eL}3FA14lURYdfP1+CAQlnfrn@zkr$zw$g!iI+?`Xq6nW zhvrLIjzib^GKE&QeY_SNtD0d`Oe9K~h=Yb*5cI+IZ;5l`r+rZQLqDfgnZmY RN3gx~J>a*$=8q>n{ujIkE_VO` literal 0 HcmV?d00001 diff --git a/media/speedometer.svg b/media/speedometer.svg new file mode 100644 index 0000000..3324dac --- /dev/null +++ b/media/speedometer.svg @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media/speedometer2.svg b/media/speedometer2.svg new file mode 100644 index 0000000..2655e94 --- /dev/null +++ b/media/speedometer2.svg @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/hud.rs b/src/hud.rs index 907e810..1aa4bfe 100644 --- a/src/hud.rs +++ b/src/hud.rs @@ -74,6 +74,7 @@ impl Plugin for HudPlugin { #[derive(Component)] struct NodeChoiceText; #[derive(Component)] struct NodeCurrentChatLine; #[derive(Component)] struct Reticule; +#[derive(Component)] struct Speedometer; #[derive(Component)] pub struct ToggleableHudElement; #[derive(Component)] pub struct ToggleableHudMapElement; #[derive(Component)] struct Selectagon; @@ -319,6 +320,36 @@ fn setup( )); }); + // Add Speedometer + let reticule_handle: Handle = asset_server.load("sprites/speedometer.png"); + commands.spawn(( + NodeBundle { + style: Style { + width: Val::VMin(10.0), + height: Val::Percent(100.0), + align_items: AlignItems::End, + overflow: Overflow::clip(), + ..default() + }, + visibility, + ..default() + }, + Speedometer, + ToggleableHudElement, + )).with_children(|builder| { + builder.spawn(( + ImageBundle { + image: UiImage::new(reticule_handle), + style: Style { + width: Val::VMin(50.0), + height: Val::VMin(10.0), + ..Default::default() + }, + ..Default::default() + }, + )); + }); + // Chat "subtitles" and choices commands.spawn(NodeBundle { style: Style { @@ -395,6 +426,7 @@ fn update_hud( mut q_node_currentline: Query<&mut Text, (With, Without, Without, Without)>, query_all_actors: Query<&actor::Actor>, settings: Res, + mut q_speedometer: Query<&mut Style, With>, q_target: Query<(&IsClickable, Option<&Position>, Option<&LinearVelocity>), With>, ) { // TODO only when hud is actually on @@ -494,6 +526,14 @@ fn update_hud( let speed_readable = nature::readable_distance(speed); text.sections[14].value = format!("\n{speed_readable}/s\n{gforce:.1}g{dev_speed}"); + if let Ok(mut speedometer) = q_speedometer.get_single_mut() { + let custom_c = nature::C / 1000.0; + let fraction = nature::lorenz_factor_custom_c(custom_c - speed, custom_c) as f32; + info!(fraction); + let wid = (fraction * 100.0).clamp(0.0, 100.0); + speedometer.width = Val::VMin(wid); + } + if target_multiple { text.sections[15].value = "\n\nERROR: MULTIPLE TARGETS".to_string(); } diff --git a/src/nature.rs b/src/nature.rs index 70fddf5..c9bccaa 100644 --- a/src/nature.rs +++ b/src/nature.rs @@ -19,6 +19,7 @@ pub const LIGHTYEAR2METER: f64 = 9_460_730_472_580_800.0; pub const PARSEC2METER: f64 = 3.0857e16; pub const DIST_JUPTER_SUN: f64 = 778479.0e6; pub const EARTH_GRAVITY: f32 = 9.81; +pub const C: f64 = 299792458.0; // m/s pub const SOL_RADIUS: f64 = 696_300_000.0; pub const JUPITER_RADIUS: f64 = 71_492_000.0; @@ -118,3 +119,11 @@ pub fn readable_distance(distance: f64) -> String { } return format!("{distance:.1}m"); } + +pub fn lorenz_factor(speed: f64) -> f64 { + (1.0 - (speed.powf(2.0) / C.powf(2.0))).sqrt() +} + +pub fn lorenz_factor_custom_c(speed: f64, c: f64) -> f64 { + (1.0 - (speed.powf(2.0) / c.powf(2.0))).sqrt() +}