traaains/editor/track/placing/states/
mod.rs1use bevy::{
2 ecs::{
3 entity::Entity,
4 observer::Observer,
5 query::With,
6 system::{Commands, Query, Res, ResMut},
7 },
8 mesh::Mesh2d,
9 picking::Pickable,
10 sprite_render::MeshMaterial2d,
11 transform::components::Transform,
12};
13
14use crate::{
15 AssetType, AssetsManager,
16 editor::track::placing::{
17 FromNodeType, LastConnectedBlock, Placing, VirtualNode,
18 observers::{PlacingTrackObserver, on_enter_node, on_exit_node},
19 },
20};
21
22pub mod current_shape;
23pub mod current_step;
24pub mod final_step;
25
26fn spawn_virtual_node(cmd: &mut Commands, assets_manager: &AssetsManager) {
27 cmd.spawn((
28 VirtualNode,
29 Placing,
30 Pickable::IGNORE,
31 Transform::default(),
32 Mesh2d(
33 assets_manager
34 .meshes
35 .get(&AssetType::TrackNodeNormal)
36 .cloned()
37 .unwrap(),
38 ),
39 MeshMaterial2d(
40 assets_manager
41 .materials
42 .get(&AssetType::TrackNodeActive)
43 .cloned()
44 .unwrap(),
45 ),
46 ));
47}
48
49fn spawn_observers(cmd: &mut Commands) {
50 cmd.spawn((PlacingTrackObserver, Placing, Observer::new(on_enter_node)));
51 cmd.spawn((PlacingTrackObserver, Placing, Observer::new(on_exit_node)));
52}
53
54pub fn on_enter_placing(mut cmd: Commands, assets_manager: Res<AssetsManager>) {
55 cmd.init_resource::<FromNodeType>();
56 cmd.init_resource::<LastConnectedBlock>();
57
58 spawn_virtual_node(&mut cmd, &assets_manager);
59 spawn_observers(&mut cmd);
60}
61
62pub fn on_leave_placing(
63 mut cmd: Commands,
64 p: Query<Entity, With<Placing>>,
65 mut last_connected_block: ResMut<LastConnectedBlock>,
66) {
67 p.into_iter().for_each(|e| cmd.entity(e).despawn());
68 last_connected_block.0 = None;
69}