From b7d279e739ca90154d717cabbdfc85d2119aa8c4 Mon Sep 17 00:00:00 2001 From: Nathan Lilienthal Date: Thu, 19 Sep 2024 08:35:35 -0700 Subject: [PATCH] Add system name labels --- Cargo.lock | 12 +++++++ starmap/Cargo.toml | 9 ++--- starmap/assets/neuropolitical.otf | Bin 0 -> 66036 bytes starmap/src/main.rs | 15 ++++++-- starmap/src/systems/spawn.rs | 57 +++++++++++++++++++++++++++++- starmap/src/ui.rs | 5 ++- 6 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 starmap/assets/neuropolitical.otf diff --git a/Cargo.lock b/Cargo.lock index c85fb93..97aeb67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1164,6 +1164,17 @@ dependencies = [ "glam", ] +[[package]] +name = "bevy_mod_billboard" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7fcf796f109d285725c5cbb4c38f6f93b809c7dbea14bc19c5b94ce01ad59de" +dependencies = [ + "bevy", + "bitflags 2.6.0", + "smallvec", +] + [[package]] name = "bevy_mod_picking" version = "0.20.1" @@ -5934,6 +5945,7 @@ dependencies = [ "bevy", "bevy-inspector-egui", "bevy_egui", + "bevy_mod_billboard", "bevy_mod_picking", "bevy_panorbit_camera", "elite_journal 0.2.0", diff --git a/starmap/Cargo.toml b/starmap/Cargo.toml index 3187ea7..5488cec 100644 --- a/starmap/Cargo.toml +++ b/starmap/Cargo.toml @@ -8,11 +8,12 @@ inspector = ["bevy-inspector-egui"] tracy = ["bevy/trace_tracy"] [dependencies] +async-std = "*" bevy = { version = "*", features = ["shader_format_glsl"] } -bevy_panorbit_camera = { version = "*", features = ["bevy_egui"] } +bevy-inspector-egui = { version = "*", optional = true } bevy_egui = "*" +bevy_mod_billboard = "*" bevy_mod_picking = "*" -async-std = "*" -galos_db = { path = "../galos_db" } +bevy_panorbit_camera = { version = "*", features = ["bevy_egui"] } elite_journal = { path = "../elite_journal" } -bevy-inspector-egui = { version = "*", optional = true } +galos_db = { path = "../galos_db" } diff --git a/starmap/assets/neuropolitical.otf b/starmap/assets/neuropolitical.otf new file mode 100644 index 0000000000000000000000000000000000000000..e9e8007576a7730518cbbd3558fc5f5cb8498260 GIT binary patch literal 66036 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 literal 0 HcmV?d00001 diff --git a/starmap/src/main.rs b/starmap/src/main.rs index fd96579..e3d30b8 100644 --- a/starmap/src/main.rs +++ b/starmap/src/main.rs @@ -5,6 +5,7 @@ use bevy::{prelude::*, window::WindowMode}; use bevy_egui::EguiPlugin; #[cfg(feature = "inspector")] use bevy_inspector_egui::quick::WorldInspectorPlugin; +use bevy_mod_billboard::prelude::*; use bevy_mod_picking::prelude::*; use bevy_panorbit_camera::PanOrbitCameraPlugin; use galos_db::Database; @@ -33,17 +34,20 @@ fn main() { })); app.add_plugins(PanOrbitCameraPlugin); app.add_plugins(DefaultPickingPlugins); + app.add_plugins(BillboardPlugin); app.add_plugins(EguiPlugin); + app.insert_resource(ClearColor(Color::BLACK)); app.insert_resource(AmbientLight { color: Color::default(), brightness: 1000.0, }); app.insert_resource(Db(db)); + app.insert_resource(systems::View::Systems); app.insert_resource(systems::ColorBy::Allegiance); app.insert_resource(systems::ScalePopulation(false)); - + app.insert_resource(systems::ShowNames(false)); app.insert_resource(systems::Spyglass { radius: 50., fetch: true, @@ -52,13 +56,15 @@ fn main() { app.insert_resource(systems::Fetched(HashSet::new())); app.insert_resource(systems::FetchTasks { fetched: HashMap::new() }); + app.add_event::(); - app.add_event::(); app.add_systems(Startup, camera::spawn_camera); app.add_systems(Update, camera::move_camera); app.add_systems(Update, camera::keyboard); + app.add_systems(Update, systems::fetch); app.add_systems(Update, systems::spawn.after(camera::move_camera)); + app.add_systems(Update, systems::update.after(systems::spawn)); app.add_systems( Update, systems::scale_systems @@ -71,10 +77,13 @@ fn main() { .after(systems::spawn) .run_if(resource_equals(systems::View::Stars)), ); + + app.add_event::(); + app.add_systems(Update, search::system); + app.add_systems(Update, ui::settings); app.add_systems(Update, ui::search.after(ui::settings)); app.add_systems(Update, ui::route.after(ui::search)); - app.add_systems(Update, search::system); #[cfg(feature = "inspector")] app.add_plugins(WorldInspectorPlugin::new()); diff --git a/starmap/src/systems/spawn.rs b/starmap/src/systems/spawn.rs index 799d5c9..a85fe38 100644 --- a/starmap/src/systems/spawn.rs +++ b/starmap/src/systems/spawn.rs @@ -6,6 +6,7 @@ use bevy::pbr::NotShadowCaster; use bevy::prelude::*; use bevy::tasks::block_on; use bevy::tasks::futures_lite::future; +use bevy_mod_billboard::{BillboardLockAxis, BillboardTextBundle}; use bevy_mod_picking::prelude::*; use elite_journal::{system::Security, Allegiance, Government}; use galos_db::systems::System as DbSystem; @@ -19,12 +20,18 @@ pub enum ColorBy { Security, } +/// Determains whether or not to show system name labels +#[derive(Resource)] +pub struct ShowNames(pub bool); + /// Polls the tasks in `FetchTasks` and spawns entities for each of the /// resulting star systems pub fn spawn( systems_query: Query<(Entity, &System)>, route_query: Query>, color_by: Res, + show_names: Res, + asset_server: Res, mut move_camera_events: EventWriter, mut commands: Commands, mut meshes: ResMut>, @@ -42,6 +49,8 @@ pub fn spawn( &new_systems, &systems_query, &color_by, + &show_names, + &asset_server, &mut commands, &mut meshes, &mut materials, @@ -82,6 +91,8 @@ pub(crate) fn spawn_systems( new_systems: &[DbSystem], systems_query: &Query<(Entity, &System)>, color_by: &Res, + show_names: &Res, + asset_server: &Res, commands: &mut Commands, mesh_asset: &mut ResMut>, material_assets: &mut ResMut>, @@ -93,6 +104,7 @@ pub(crate) fn spawn_systems( let mesh = init_meshes(mesh_asset); let materials = init_materials(material_assets); + let font = asset_server.load("neuropolitical.otf"); for new_system in new_systems { let color_idx = match color_by.deref() { @@ -103,7 +115,7 @@ pub(crate) fn spawn_systems( if let Some(_enitity) = existing_systems.remove(&new_system.address) { // TODO: update } else { - commands.spawn(( + let mut entity = commands.spawn(( PbrBundle { transform: Transform { translation: Vec3::new( @@ -141,8 +153,51 @@ pub(crate) fn spawn_systems( }, ), )); + + if show_names.0 { + entity.with_children(|parent| { + parent.spawn(( + BillboardTextBundle { + transform: Transform::from_scale(Vec3::splat(0.01)) + .with_translation(Vec3::new(5., 0., 0.)), + text: Text::from_section( + new_system.name.clone(), + TextStyle { + font_size: 64.0, + font: font.clone(), + color: Color::WHITE, + }, + ) + .with_justify(JustifyText::Left), + ..default() + }, + BillboardLockAxis::default(), + )); + }); + } + } + } +} + +/// Checks for updated resources and updates the systems. +pub fn update( + systems_query: Query<(&System, &Children)>, + show_names: Res, + mut commands: Commands, +) { + if show_names.is_changed() { + for (_, children) in systems_query.iter() { + for &child in children.iter() { + if show_names.0 { + commands.entity(child).insert(Visibility::Visible); + } else { + commands.entity(child).insert(Visibility::Hidden); + } + } } } + + // TODO: update ColorBy } fn init_meshes(assets: &mut Assets) -> Handle { diff --git a/starmap/src/ui.rs b/starmap/src/ui.rs index 661d4cc..5cb2fa1 100644 --- a/starmap/src/ui.rs +++ b/starmap/src/ui.rs @@ -1,5 +1,5 @@ use crate::search::Searched; -use crate::systems::{ColorBy, ScalePopulation, Spyglass, View}; +use crate::systems::{ColorBy, ScalePopulation, ShowNames, Spyglass, View}; use bevy::prelude::*; use bevy_egui::{egui, EguiContexts}; @@ -12,6 +12,7 @@ pub fn settings( mut view: ResMut, mut color_by: ResMut, mut population_scale: ResMut, + mut show_names: ResMut, ) { if let Some(ctx) = contexts.try_ctx_mut() { // TODO: We really need to figure out how to trigger a re-fetch after @@ -54,6 +55,8 @@ pub fn settings( } View::Stars => {} } + + ui.checkbox(&mut show_names.0, "Show System Names"); }); } }