use std::ops::Deref; use bevy::color::palettes::basic::{FUCHSIA, GREEN, WHITE}; use bevy::color::palettes::css::ORANGE; use crate::attachment::{JointOf, Peer, SnapOf}; use crate::ecs::Part; use crate::prelude::*; pub fn client_attachment_plugin(app: &mut App) { app .init_resource::() .add_systems(Update, draw_attachment_debug); } #[derive(Resource, Default)] pub struct AttachmentDebugRes(pub bool); impl Deref for AttachmentDebugRes { type Target = bool; fn deref(&self) -> &Self::Target { &self.0 } } pub fn draw_attachment_debug( joints: Query<(&Transform, &JointOf, Option<&Peer>)>, snaps: Query<(&Transform, &SnapOf)>, parts: Query<&GlobalTransform, With>, mut gizmos: Gizmos, state: ResMut, ) { if !state.0 { return; } for (offset, parent, peer) in joints.iter() { let Ok(parent_pos) = parts.get(parent.0) else { continue; }; let joint_target = parent_pos.transform_point(offset.translation); gizmos.cross_2d(joint_target.xy(), 4.0, FUCHSIA); if let Some(peer_id) = peer && let Ok(peer) = joints.get(peer_id.peer_joint_entity_id) { let Ok(peer_parent_pos) = parts.get(peer.1.0) else { continue; }; gizmos.arrow_2d( peer_parent_pos.translation().xy(), peer_parent_pos.translation().xy() + ((peer.0.rotation * peer_parent_pos.rotation()) .mul_vec3(Vec3::Y) .xy() * 20.0), ORANGE, ); gizmos.arrow_2d( parent_pos.translation().xy(), peer_parent_pos.translation().xy(), WHITE, ); } } for (offset, parent) in snaps.iter() { let Ok(parent_pos) = parts.get(parent.0) else { continue; }; let joint_snap = parent_pos.transform_point(offset.translation); gizmos.cross_2d(joint_snap.xy(), 4.0, GREEN); } }