Skip to main content

traaains/editor/track/placing/states/
mod.rs

1use 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}