use crate::prelude::*;
use bevy::{
color::palettes::css::{BLUE, FUCHSIA, GREEN, LIME, RED, WHITE, YELLOW},
prelude::*,
};
#[derive(Resource, Reflect, Clone, Debug)]
#[reflect(Resource, Debug)]
pub struct TiledDebugObjectsConfig {
pub objects_colors_list: Vec<Color>,
pub arrow_length: Vec2,
}
impl Default for TiledDebugObjectsConfig {
fn default() -> Self {
Self {
arrow_length: Vec2::new(-15., 15.),
objects_colors_list: vec![
Color::from(RED),
Color::from(FUCHSIA),
Color::from(WHITE),
Color::from(BLUE),
Color::from(GREEN),
Color::from(YELLOW),
Color::from(LIME),
],
}
}
}
#[derive(Default, Clone, Debug)]
pub struct TiledDebugObjectsPlugin(pub TiledDebugObjectsConfig);
impl Plugin for TiledDebugObjectsPlugin {
fn build(&self, app: &mut bevy::prelude::App) {
app.register_type::<TiledDebugObjectsConfig>()
.insert_resource(self.0.clone())
.add_systems(Update, draw_debug_gizmos);
}
}
fn draw_debug_gizmos(
map_query: Query<(&TiledMap, &TiledMapStorage)>,
assets: Res<Assets<TiledMapAsset>>,
object_query: Query<(&TiledObject, &GlobalTransform)>,
config: Res<TiledDebugObjectsConfig>,
mut gizmos: Gizmos,
) {
for (tiled_map, storage) in map_query.iter() {
let Some(map_asset) = assets.get(&tiled_map.0) else {
continue;
};
for (idx, (_, entity)) in storage.objects().enumerate() {
let Ok((object, transform)) = object_query.get(*entity) else {
continue;
};
let color = config.objects_colors_list[idx % config.objects_colors_list.len()];
let origin = Vec2::new(transform.translation().x, transform.translation().y);
gizmos.arrow_2d(origin + config.arrow_length, origin, color);
let positions = object
.line_string(
transform,
matches!(
tilemap_type_from_map(&map_asset.map),
TilemapType::Isometric(..)
),
&map_asset.tilemap_size,
&grid_size_from_map(&map_asset.map),
map_asset.tiled_offset,
)
.map(|ls| ls.coords().map(|c| Vec2::new(c.x, c.y)).collect::<Vec<_>>());
if let Some(pos) = positions {
gizmos.linestrip_2d(pos, color);
}
}
}
}