use bevy::{gizmos::gizmos, prelude::*}; use shared::states::GameplayState; use shared::{resources::TileUnderCursor, sets::GameplaySet}; use world_generation::{ consts::{HEX_CORNERS, WATER_HEX_CORNERS}, prelude::Map, states::GeneratorState, }; use crate::camera_system::components::{PhosCamera, PhosOrbitCamera}; pub struct DebugPlugin; impl Plugin for DebugPlugin { fn build(&self, app: &mut App) { app.insert_state(DebugState::Base); app.add_systems( Update, show_tile_heights .run_if(in_state(GeneratorState::Idle)) .run_if(not(in_state(DebugState::None))), ); app.add_systems( Update, verbose_data .run_if(in_state(GeneratorState::Idle)) .run_if(in_state(DebugState::Verbose)), ); // app.add_systems(Update, camera_debug.in_set(GameplaySet)); app.add_systems(Update, regenerate_map.run_if(in_state(GeneratorState::Idle))); app.insert_resource(Shape(Polyline3d::new([ HEX_CORNERS[0], HEX_CORNERS[1], HEX_CORNERS[2], HEX_CORNERS[3], HEX_CORNERS[4], HEX_CORNERS[5], HEX_CORNERS[0], ]))); } } #[derive(Resource)] struct Shape(pub Polyline3d<7>); #[derive(States, Debug, Clone, PartialEq, Eq, Hash)] pub enum DebugState { Base, None, Verbose, } fn regenerate_map( mut generator_state: ResMut>, mut gameplay_state: ResMut>, input: Res>, ) { if input.just_pressed(KeyCode::KeyR) { generator_state.set(GeneratorState::Regenerate); gameplay_state.set(GameplayState::PlaceHQ); } } fn show_tile_heights(map: Res, mut gizmos: Gizmos, shape: Res, tile_under_cursor: Res) { if let Some(contact) = tile_under_cursor.0 { let height = map.sample_height(&contact.tile); gizmos.primitive_3d(&shape.0, contact.tile.to_world(height + 0.01), Color::WHITE); gizmos.line(contact.point, contact.point + Vec3::X, LinearRgba::RED); gizmos.line(contact.point, contact.point + Vec3::Y, LinearRgba::GREEN); gizmos.line(contact.point, contact.point + Vec3::Z, LinearRgba::BLUE); // show_water_corners(contact.tile.to_world(height + 1.0), &mut gizmos); } } fn show_water_corners(pos: Vec3, gizmos: &mut Gizmos) { for i in 0..WATER_HEX_CORNERS.len() { let p = pos + WATER_HEX_CORNERS[i]; let p2 = pos + WATER_HEX_CORNERS[(i + 1) % WATER_HEX_CORNERS.len()]; gizmos.line(p, p2, LinearRgba::RED); } } fn camera_debug(mut cam_query: Query<(&PhosCamera, &PhosOrbitCamera)>, mut gizmos: Gizmos) { let (config, orbit) = cam_query.single(); gizmos.sphere(orbit.target, 0.3, LinearRgba::RED); let cam_proxy = orbit.target - (orbit.forward * 10.0); gizmos.ray(orbit.target, orbit.forward * 10.0, LinearRgba::rgb(1.0, 0.0, 1.0)); gizmos.circle(cam_proxy, 0.3, LinearRgba::rgb(1.0, 1.0, 0.0)); } fn verbose_data() {}