diff --git a/assets/models/mapgrid.glb b/assets/models/mapgrid.glb new file mode 100644 index 0000000..8fc1b00 Binary files /dev/null and b/assets/models/mapgrid.glb differ diff --git a/src/blender/mapgrid.blend b/src/blender/mapgrid.blend new file mode 100644 index 0000000..f9eb8e9 Binary files /dev/null and b/src/blender/mapgrid.blend differ diff --git a/src/camera.rs b/src/camera.rs index b460ec5..ae0555a 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -90,6 +90,12 @@ impl Plugin for CameraPlugin { } #[derive(Component)] +pub enum MapGrid { + HighRes, + LowRes, +} + +#[derive(Component, Default)] pub struct ShowOnlyInMap { pub min_distance: f64, pub distance_to_id: String, @@ -126,6 +132,7 @@ impl Default for MapCam { pub fn setup_camera( mut commands: Commands, settings: Res, + asset_server: Res, prefs: Res, ) { // Add player @@ -201,6 +208,28 @@ pub fn setup_camera( commands.insert_resource(DirectionalLightShadowMap { size: settings.shadowmap_resolution, }); + + // Add map grid + let mut entitycmd = commands.spawn(( + MapGrid::HighRes, + hud::ToggleableHudElement, + ShowOnlyInMap::default(), + bevy::pbr::NotShadowCaster, + bevy::pbr::NotShadowReceiver, + visual::IsEffect, + SpatialBundle::default(), + )); + load_asset("mapgrid", &mut entitycmd, &*asset_server); + let mut entitycmd = commands.spawn(( + MapGrid::LowRes, + hud::ToggleableHudElement, + ShowOnlyInMap::default(), + bevy::pbr::NotShadowCaster, + bevy::pbr::NotShadowReceiver, + visual::IsEffect, + SpatialBundle::default(), + )); + load_asset("mapgrid", &mut entitycmd, &*asset_server); } pub fn sync_camera_to_player( @@ -259,6 +288,14 @@ pub fn update_map_camera( ), >, q_target_changed: Query<(), Changed>, + mut q_mapgrid: Query< + (&mut Transform, &MapGrid), + ( + Without, + Without, + Without, + ), + >, mut mouse_events: EventReader, mut er_mousewheel: EventReader, keyboard_input: Res>, @@ -275,6 +312,18 @@ pub fn update_map_camera( }; mapcam.center_on_entity = Some(target_entity); + // Update map grid + let step: f64 = 5.0; + for (mut trans, mapgrid) in &mut q_mapgrid { + trans.translation = Vec3::ZERO; + let scale = step.powf(mapcam.zoom_level.log(step).floor()); + let scale = match mapgrid { + MapGrid::HighRes => scale, + MapGrid::LowRes => scale * step, + }; + trans.scale = Vec3::splat(scale as f32); + } + // Get mouse movement let mut mouse_delta = Vec2::ZERO; for mouse_event in mouse_events.read() { @@ -625,19 +674,23 @@ pub fn update_map_only_object_visibility( let cam_pos: Vec3 = cam.translation + player_pos.as_vec3(); for (mut vis, onlyinmap) in &mut q_onlyinmap { if settings.map_active && settings.hud_active { - if let Some(pos) = id2pos.0.get(&onlyinmap.distance_to_id) { - let dist = cam_pos.distance(pos.as_vec3()); - if dist >= onlyinmap.min_distance as f32 { - *vis = Visibility::Inherited; + if onlyinmap.distance_to_id.is_empty() { + *vis = Visibility::Inherited; + } else { + if let Some(pos) = id2pos.0.get(&onlyinmap.distance_to_id) { + let dist = cam_pos.distance(pos.as_vec3()); + if dist >= onlyinmap.min_distance as f32 { + *vis = Visibility::Inherited; + } else { + *vis = Visibility::Hidden; + } } else { + error!( + "Failed get position of actor ID '{}'", + &onlyinmap.distance_to_id + ); *vis = Visibility::Hidden; } - } else { - error!( - "Failed get position of actor ID '{}'", - &onlyinmap.distance_to_id - ); - *vis = Visibility::Hidden; } } else { *vis = Visibility::Hidden; diff --git a/src/load.rs b/src/load.rs index b6f1857..1891711 100644 --- a/src/load.rs +++ b/src/load.rs @@ -63,6 +63,7 @@ pub fn asset_name_to_path(name: &str) -> &'static str { "pizzasign" => "models/pizzasign.glb#Scene0", "selectagon" => "models/selectagon.glb#Scene0", "orbitring" => "models/orbitring.glb#Scene0", + "mapgrid" => "models/mapgrid.glb#Scene0", "clippy" => "models/clippy/clippy.glb#Scene0", "clippy_ar" => "models/clippy/ar_happy.glb#Scene0", "whale" => "models/whale.gltf#Scene0",