Skip to main content

wde_terrain_grid/core/
mod.rs

1use bevy::prelude::*;
2
3use crate::core::{
4    entries::PlacementPlugin,
5    grid::{Grid, GridEntityEvent}
6};
7use wde_terrain::prelude::*;
8
9pub mod entries;
10pub mod grid;
11pub mod grid_entity;
12
13pub(crate) struct CorePlugin;
14impl Plugin for CorePlugin {
15    fn build(&self, app: &mut App) {
16        app.init_resource::<Grid>()
17            .add_message::<GridEntityEvent>()
18            .add_plugins(PlacementPlugin)
19            .add_systems(Startup, set_parent)
20            .add_systems(Update, handle_grid_entity_events);
21    }
22}
23
24fn set_parent(
25    mut commands: Commands,
26    terrain: Single<Entity, With<Terrain>>,
27    mut grid: ResMut<Grid>
28) {
29    let parent = commands
30        .spawn((
31            Name::new("Terrain Entities"),
32            Transform::default(),
33            ChildOf(*terrain)
34        ))
35        .id();
36    grid.set_parent(parent);
37}
38
39fn handle_grid_entity_events(mut grid: ResMut<Grid>, mut events: MessageReader<GridEntityEvent>) {
40    for event in events.read() {
41        match event {
42            GridEntityEvent::Placed {
43                entity,
44                grid_entity
45            } => {
46                grid.set_entity(grid_entity, *entity);
47            }
48            GridEntityEvent::Removed { entity } => {
49                grid.remove_entity(*entity);
50            }
51        }
52    }
53}