Skip to main content

traaains/sim/track/segment/
mod.rs

1//! An edge in the physical track graph.
2
3use bevy::{
4    ecs::{component::Component, entity::Entity, event::EntityEvent, observer::On, system::ResMut},
5    picking::events::PointerPress,
6    state::state::NextState,
7};
8
9use crate::{shape::Shapes, sim::track::segment::signals_manager::SignalsManager, ui::UiState};
10
11pub mod commands;
12pub mod signals_manager;
13
14/// An edge in the physical track graph, or, a piece of rail. Defined and backed by a single shape.
15/// Shapes should start (lerp(0)) at node `from` and end (lerp(1)) at `to`.
16#[derive(Component, Debug)]
17#[require(SignalsManager)]
18pub struct TrackSegment {
19    pub shape: Shapes,
20    // in the positive direction of travel
21    pub from_node: Entity,
22    pub to_node: Entity,
23    pub block: Entity,
24}
25
26impl TrackSegment {
27    pub fn new(shape: Shapes, from_node: Entity, to_node: Entity, block: Entity) -> Self {
28        TrackSegment {
29            shape,
30            from_node,
31            to_node,
32            block,
33        }
34    }
35}
36
37/// Observer that listens for pointer presses on segments and opens editing windows
38pub fn on_segment_press_window(e: On<PointerPress>, mut next_state: ResMut<NextState<UiState>>) {
39    next_state.set(UiState::SegmentWindow {
40        target: e.event_target(),
41    });
42}