From 2a48a718b6fb242a8a7a0676ffaf5d279d1246ea Mon Sep 17 00:00:00 2001 From: yuni Date: Sat, 23 Nov 2024 05:31:09 +0100 Subject: [PATCH] implement command `suitmod` (same as `armodel` but always visible) --- src/cmd.rs | 21 ++++++++++++++++++++ src/hud.rs | 56 +++++++++++++++++------------------------------------- 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/src/cmd.rs b/src/cmd.rs index a6f2532..cace18e 100644 --- a/src/cmd.rs +++ b/src/cmd.rs @@ -128,6 +128,7 @@ struct ParserState { light_brightness: f32, light_color: Option, ar_models: Vec, + suit_mod_models: Vec, show_only_in_map_at_distance: Option<(f64, String)>, } impl Default for ParserState { @@ -191,6 +192,7 @@ impl Default for ParserState { light_brightness: 0.0, light_color: None, ar_models: vec![], + suit_mod_models: vec![], show_only_in_map_at_distance: None, } } @@ -699,6 +701,9 @@ pub fn load_defs(mut ew_spawn: EventWriter) { ["armodel", asset_name] => { state.ar_models.push(asset_name.to_string()); } + ["suitmod", asset_name] => { + state.suit_mod_models.push(asset_name.to_string()); + } ["targeted", "yes"] => { state.is_targeted_on_startup = true; } @@ -1599,6 +1604,7 @@ fn spawn_entities( hud::AugmentedRealityOverlay { owner: actor_entity, scale: 1.0, + always_visible: false, }, world::DespawnOnPlayerDeath, SpatialBundle { @@ -1610,6 +1616,21 @@ fn spawn_entities( load_asset(ar_asset_name.as_str(), &mut entitycmd, &*asset_server); } + for ar_asset_name in &state.suit_mod_models { + let mut entitycmd = commands.spawn(( + hud::AugmentedRealityOverlay { + owner: actor_entity, + scale: 1.0, + always_visible: true, + }, + world::DespawnOnPlayerDeath, + SpatialBundle { + ..default() + }, + )); + load_asset(ar_asset_name.as_str(), &mut entitycmd, &*asset_server); + } + if state.is_point_of_interest || state.is_moon || state.is_planet { let mut entitycmd = commands.spawn(( hud::PointOfInterestMarker(actor_entity), diff --git a/src/hud.rs b/src/hud.rs index 3a32b27..ad15bd4 100644 --- a/src/hud.rs +++ b/src/hud.rs @@ -105,9 +105,6 @@ impl Plugin for HudPlugin { .before(TransformSystem::TransformPropagate), ), ); - app.insert_resource(AugmentedRealityState { - overlays_visible: false, - }); app.insert_resource(Log { logs: VecDeque::with_capacity(LOG_MAX), needs_rerendering: true, @@ -180,17 +177,13 @@ enum Gauge { //Integrity, } -#[derive(Resource)] -pub struct AugmentedRealityState { - pub overlays_visible: bool, -} - #[derive(Component)] pub struct AugmentedRealityOverlayBroadcaster; #[derive(Component)] pub struct AugmentedRealityOverlay { pub owner: Entity, pub scale: f32, + pub always_visible: bool, } #[derive(Resource)] @@ -1230,40 +1223,24 @@ fn update_ar_overlays( Without, ), >, - mut q_overlays: Query<( - &mut Transform, - &mut Visibility, - &AugmentedRealityOverlay, - )>, + mut q_overlays: Query<(&mut Transform, &mut Visibility, &AugmentedRealityOverlay)>, settings: ResMut, - mut state: ResMut, ) { - let (need_activate, need_clean, need_update); - if settings.hud_active { - need_activate = !state.overlays_visible; - need_clean = false; - } else { - need_activate = false; - need_clean = state.overlays_visible; - } - need_update = settings.hud_active; - state.overlays_visible = settings.hud_active; - - if need_update || need_clean || need_activate { - for (mut trans, mut vis, ar) in &mut q_overlays { - for (owner_id, owner_trans, owner_vis) in &q_owners { - if owner_id == ar.owner { - *trans = *owner_trans; - if ar.scale != 1.0 { - trans.scale *= ar.scale; - } - if need_clean { - *vis = Visibility::Hidden; - } else { - *vis = *owner_vis; - } - break; + for (mut trans, mut vis, ar) in &mut q_overlays { + if !ar.always_visible && !settings.hud_active { + *vis = Visibility::Hidden; + continue; + } + for (owner_id, owner_trans, owner_vis) in &q_owners { + if owner_id == ar.owner { + *trans = *owner_trans; + if ar.scale != 1.0 { + trans.scale *= ar.scale; } + if ar.always_visible || settings.hud_active { + *vis = *owner_vis; + } + break; } } } @@ -1408,6 +1385,7 @@ fn update_avatar( hud::AugmentedRealityOverlay { owner: player_entity, scale: model_scale, + always_visible: false, }, world::DespawnOnPlayerDeath, PlayerAvatar,