traaains/editor/track/placing/
move_to_cursor.rs1use 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}