use crate::prelude::*;
use bevy::prelude::*;
#[derive(Component, Default, Reflect, Clone, Debug)]
#[reflect(Component, Default, Debug)]
pub struct TiledPhysicsSettings<T: TiledPhysicsBackend> {
pub objects_layer_filter: TiledFilter,
pub objects_filter: TiledFilter,
pub tiles_layer_filter: TiledFilter,
pub tiles_objects_filter: TiledFilter,
pub backend: T,
}
pub(crate) fn plugin<T: TiledPhysicsBackend>(app: &mut App) {
app.register_type::<TiledPhysicsSettings<T>>();
app.add_systems(
PreUpdate,
(
initialize_settings_for_worlds::<T>,
initialize_settings_for_maps::<T>,
)
.chain()
.in_set(TiledPreUpdateSystems::InitializePhysicsSettings),
);
app.add_systems(
PostUpdate,
handle_settings_update::<T>.in_set(TiledPostUpdateSystems::HandlePhysicsSettingsUpdate),
);
}
fn initialize_settings_for_worlds<T: TiledPhysicsBackend>(
mut commands: Commands,
worlds_query: Query<Entity, (With<TiledWorld>, Without<TiledPhysicsSettings<T>>)>,
) {
for world in worlds_query.iter() {
commands
.entity(world)
.insert(TiledPhysicsSettings::<T>::default());
}
}
fn initialize_settings_for_maps<T: TiledPhysicsBackend>(
mut commands: Commands,
maps_query: Query<
(Entity, Option<&ChildOf>),
(With<TiledMap>, Without<TiledPhysicsSettings<T>>),
>,
worlds_query: Query<&TiledPhysicsSettings<T>, With<TiledWorld>>,
) {
for (map, child_of) in maps_query.iter() {
commands.entity(map).insert(
child_of
.and_then(|child_of| worlds_query.get(child_of.parent()).ok())
.cloned()
.unwrap_or_default(),
);
}
}
fn handle_settings_update<T: TiledPhysicsBackend>(
mut commands: Commands,
maps_query: Query<(Entity, Ref<TiledPhysicsSettings<T>>), With<TiledMap>>,
worlds_query: Query<(Entity, Ref<TiledPhysicsSettings<T>>), With<TiledWorld>>,
) {
for (world, settings) in worlds_query.iter() {
if settings.is_changed() && !settings.is_added() {
commands.entity(world).insert(RespawnTiledWorld);
}
}
for (map, settings) in maps_query.iter() {
if settings.is_changed() && !settings.is_added() {
commands.entity(map).insert(RespawnTiledMap);
}
}
}