use std::path::PathBuf; use bevy::{ asset::{AssetPath, io::AssetSourceEvent}, prelude::*, }; use bevy_rapier3d::{prelude::RigidBody, render::DebugRenderContext}; use crate::debug::{ConsoleLog, DebugEvent, DebugMode}; pub fn plugin(app: &mut App) { app.add_systems( Update, ( handle_load_gltf.run_if(in_state(DebugMode::Enabled)), handle_despawn, handle_debug_rapier, ), ); } #[derive(Component, Clone)] struct Id(String); #[derive(Component)] struct HasPath(String); fn handle_load_gltf( mut c: Commands, mut dbg_reader: EventReader, mut logger: ResMut, asset_server: Res, ) { for ev in dbg_reader.read() { if let DebugEvent::LoadGltf { asset_path, id } = ev { logger.write(&format!("Loading {asset_path}...")); let scene_handle = asset_server .load(GltfAssetLabel::Scene(0).from_asset(AssetPath::from(asset_path.clone()))); let mut scene = c.spawn(( SceneRoot(scene_handle), HasPath(asset_path.clone()), // RigidBody::Fixed, )); if let Some(id) = id { scene.insert(Id(id.clone())); } logger.write( "Should be loaded now. If nothing happened, check if you might've typoed the path.", ); } } } fn handle_despawn( mut c: Commands, mut dbg_reader: EventReader, mut logger: ResMut, entities: Query<(Entity, &Id)>, ) { for ev in dbg_reader.read() { if let DebugEvent::Despawn { id: target_id } = ev { let mut count = 0; entities .iter() .filter_map(|(entity, Id(id))| (id == target_id).then_some(entity)) .for_each(|entity| { count += 1; c.entity(entity).despawn() }); if count > 0 { logger.write(&format!("Despawned {count} entities.")); } else { logger.err(&format!( "Couldn't find any entities to despawn with id {target_id:?}." )) } } } } fn handle_debug_rapier( mut dbg_reader: EventReader, mut logger: ResMut, mut rapier_ctx: ResMut, ) { for ev in dbg_reader.read() { if &DebugEvent::DebugRapier == ev { rapier_ctx.enabled = !rapier_ctx.enabled; logger.write(if rapier_ctx.enabled { "Enabled Rapier debug rendering." } else { "Disabled Rapier debug rendering." }) } } }