mirror of
https://codeberg.org/schrottkatze/mgd2-tram-championships.git
synced 2025-07-01 17:27:38 +00:00
99 lines
2.7 KiB
Rust
99 lines
2.7 KiB
Rust
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<DebugEvent>,
|
|
mut logger: ResMut<ConsoleLog>,
|
|
asset_server: Res<AssetServer>,
|
|
) {
|
|
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<DebugEvent>,
|
|
mut logger: ResMut<ConsoleLog>,
|
|
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<DebugEvent>,
|
|
mut logger: ResMut<ConsoleLog>,
|
|
mut rapier_ctx: ResMut<DebugRenderContext>,
|
|
) {
|
|
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."
|
|
})
|
|
}
|
|
}
|
|
}
|