Skip to main content

traaains/editor/track/placing/
move_to_cursor.rs

1use bevy::{
2    asset::Assets,
3    ecs::{
4        query::{With, Without},
5        system::{Query, Res, ResMut, Single},
6    },
7    mesh::{Mesh, Mesh2d},
8    transform::components::Transform,
9};
10
11use crate::{
12    editor::track::placing::{FromNodeType, NodeType, VirtualNode, VirtualSegment},
13    game::cursor::CursorPos,
14    shape::BezierMeshProps,
15    sim::track::node::TrackNode,
16    utils::Meshable,
17};
18
19pub fn virtual_node_to_cursor(
20    mut n: Single<&mut Transform, With<VirtualNode>>,
21    cursor_pos: Res<CursorPos>,
22    from_node_type: Res<FromNodeType>,
23) {
24    if from_node_type.0 != NodeType::Virtual {
25        return;
26    }
27
28    n.translation = cursor_pos.0.extend(0.0);
29}
30
31pub fn virtual_segment_to_cursor(
32    mut s: Single<(&Transform, &mut VirtualSegment, &mut Mesh2d), Without<VirtualNode>>,
33    node_transforms: Query<&Transform, With<TrackNode>>,
34    cursor_pos: Res<CursorPos>,
35    mut meshes: ResMut<Assets<Mesh>>,
36) {
37    if s.1.to != NodeType::Virtual {
38        return;
39    }
40
41    let (v_transform, v_segment, v_mesh) = &mut *s;
42
43    let from_node = node_transforms.get(v_segment.from).unwrap();
44    if from_node.translation.truncate() == cursor_pos.0 {
45        return;
46    }
47
48    let local_cursor_pos = cursor_pos.0 - v_transform.translation.truncate();
49    v_segment.shape.set_last_point(local_cursor_pos);
50    v_mesh.0 = meshes.add(v_segment.shape.mesh(BezierMeshProps::default()));
51}