~starkingdoms/starkingdoms

ref: 39baf66c3db36da0bb8fed8dc2389efe5a67f905 starkingdoms/crates/unified/src/client/ship/attachment.rs -rw-r--r-- 2.1 KiB
39baf66c — core fix: slight refactor 26 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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::<AttachmentDebugRes>()
        .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<Part>>,
    mut gizmos: Gizmos,
    state: ResMut<AttachmentDebugRes>,
) {
    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);
    }
}