use std::marker::PhantomData;
use bevy::{
app::{App, Plugin, PostUpdate, Update},
ecs::{bundle::Bundle, schedule::IntoScheduleConfigs, system::Query},
gizmos::AppGizmoBuilder,
math::{Vec2, Vec3},
transform::TransformSystem,
};
use ghx_grid::{
cartesian::coordinates::{CartesianCoordinates, CartesianPosition},
coordinate_system::CoordinateSystem,
};
use self::{
markers::{
despawn_debug_markers, draw_debug_markers_2d, draw_debug_markers_3d,
insert_transform_on_new_markers, MarkerDespawnEvent, MarkersGroup,
},
view::{
draw_debug_grids_2d, draw_debug_grids_3d, DebugGridView, DebugGridView2d, DebugGridView3d,
GridViewGizmoGroup,
},
};
pub mod markers;
pub mod view;
pub struct GridDebugPlugin<C: CoordinateSystem> {
typestate: PhantomData<C>,
}
impl<T: CoordinateSystem> GridDebugPlugin<T> {
pub fn new() -> Self {
Self {
typestate: PhantomData,
}
}
}
impl<C: CartesianCoordinates> Plugin for GridDebugPlugin<C> {
fn build(&self, app: &mut App) {
app.add_systems(Update, (draw_debug_grids_3d::<C>, draw_debug_grids_2d::<C>))
.add_systems(
PostUpdate,
(
((despawn_debug_markers, insert_transform_on_new_markers).chain())
.before(TransformSystem::TransformPropagate),
(draw_debug_markers_3d, draw_debug_markers_2d)
.after(TransformSystem::TransformPropagate),
),
)
.add_event::<MarkerDespawnEvent>()
.init_gizmo_group::<MarkersGroup>()
.init_gizmo_group::<GridViewGizmoGroup>();
}
}
#[derive(Bundle)]
pub struct DebugGridView3dBundle {
pub view: DebugGridView,
pub view_type: DebugGridView3d,
}
impl Default for DebugGridView3dBundle {
fn default() -> Self {
Self {
view_type: Default::default(),
view: Default::default(),
}
}
}
#[derive(Bundle)]
pub struct DebugGridView2dBundle {
pub view: DebugGridView,
pub view_type: DebugGridView2d,
}
impl Default for DebugGridView2dBundle {
fn default() -> Self {
Self {
view_type: Default::default(),
view: Default::default(),
}
}
}
#[inline]
pub fn get_translation_from_grid_pos_3d(grid_pos: &CartesianPosition, node_size: &Vec3) -> Vec3 {
Vec3 {
x: (grid_pos.x as f32 + 0.5) * node_size.x,
y: (grid_pos.y as f32 + 0.5) * node_size.y,
z: (grid_pos.z as f32 + 0.5) * node_size.z,
}
}
#[inline]
pub fn get_translation_from_grid_coords_3d(x: u32, y: u32, z: u32, node_size: &Vec3) -> Vec3 {
Vec3 {
x: (x as f32 + 0.5) * node_size.x,
y: (y as f32 + 0.5) * node_size.y,
z: (z as f32 + 0.5) * node_size.z,
}
}
#[inline]
pub fn get_translation_from_grid_pos_2d(grid_pos: &CartesianPosition, node_size: &Vec2) -> Vec2 {
Vec2 {
x: (grid_pos.x as f32 + 0.5) * node_size.x,
y: (grid_pos.y as f32 + 0.5) * node_size.y,
}
}
#[inline]
pub fn get_translation_from_grid_coords_2d(x: u32, y: u32, node_size: &Vec2) -> Vec2 {
Vec2 {
x: (x as f32 + 0.5) * node_size.x,
y: (y as f32 + 0.5) * node_size.y,
}
}
pub fn toggle_debug_grids_visibilities(mut grid_views: Query<&mut DebugGridView>) {
for mut view in grid_views.iter_mut() {
view.display_grid = !view.display_grid;
}
}
pub fn toggle_grid_markers_visibilities(mut grid_views: Query<&mut DebugGridView>) {
for mut view in grid_views.iter_mut() {
view.display_markers = !view.display_markers;
}
}