use crate::prelude::*;
use bevy_app::prelude::*;
use bevy_color::prelude::*;
use bevy_ecs::prelude::*;
use bevy_gizmos::prelude::*;
use bevy_math::prelude::*;
use bevy_reflect::Reflect;
use bevy_transform::prelude::*;
pub struct BigSpaceDebugPlugin;
impl Plugin for BigSpaceDebugPlugin {
fn build(&self, app: &mut App) {
app.init_gizmo_group::<BigSpaceGizmoConfig>()
.add_systems(Startup, setup_gizmos)
.add_systems(
PostUpdate,
(update_debug_bounds, update_grid_axes)
.chain()
.after(TransformSystems::Propagate),
);
}
}
fn setup_gizmos(mut store: ResMut<GizmoConfigStore>) {
let (config, _) = store.config_mut::<BigSpaceGizmoConfig>();
config.line.perspective = false;
config.line.joints = GizmoLineJoint::Round(4);
config.line.width = 1.0;
}
fn update_debug_bounds(
mut gizmos: Gizmos<BigSpaceGizmoConfig>,
grids: Grids,
occupied_cells: Query<(Entity, &CellCoord, Option<&FloatingOrigin>)>,
) {
for (cell_entity, cell, origin) in occupied_cells.iter() {
let Some(grid) = grids.parent_grid(cell_entity) else {
continue;
};
let transform = grid.global_transform(
cell,
&Transform::from_scale(Vec3::splat(grid.cell_edge_length() * 0.999)),
);
if origin.is_none() {
gizmos.cube(transform, Color::linear_rgb(0.0, 1.0, 0.0));
} else {
}
}
}
#[derive(Default, Reflect)]
struct BigSpaceGizmoConfig;
impl GizmoConfigGroup for BigSpaceGizmoConfig {}
fn update_grid_axes(
mut gizmos: Gizmos<BigSpaceGizmoConfig>,
grids: Query<(&GlobalTransform, &Grid)>,
) {
for (transform, grid) in grids.iter() {
let start = transform.translation();
let len = (start.length().powf(0.9)).max(grid.cell_edge_length()) * 0.5;
gizmos.ray(
start,
transform.right() * len,
Color::linear_rgb(1.0, 0.0, 0.0),
);
gizmos.ray(
start,
transform.up() * len,
Color::linear_rgb(0.0, 1.0, 0.0),
);
gizmos.ray(
start,
transform.back() * len,
Color::linear_rgb(0.0, 0.0, 1.0),
);
}
}