use bevy_app::App;
use bevy_ecs::schedule::{ScheduleLabel, Schedules};
mod dot;
#[cfg(feature = "render_graph")]
pub mod render_graph;
pub mod schedule_graph;
#[derive(ScheduleLabel, Clone, Debug, PartialEq, Eq, Hash)]
struct ScheduleDebugGroup;
#[track_caller]
pub fn schedule_graph_dot(
app: &mut App,
label: impl ScheduleLabel,
settings: &schedule_graph::Settings,
) -> String {
app.world
.resource_scope::<Schedules, _>(|world, mut schedules| {
let ignored_ambiguities = schedules.ignored_scheduling_ambiguities.clone();
let schedule = schedules
.get_mut(label)
.ok_or_else(|| "schedule doesn't exist".to_string())
.unwrap();
schedule.graph_mut().initialize(world);
let _ = schedule.graph_mut().build_schedule(
world.components(),
ScheduleDebugGroup.intern(),
&ignored_ambiguities,
);
schedule_graph::schedule_graph_dot(schedule, world, settings)
})
}
pub fn print_schedule_graph(app: &mut App, schedule_label: impl ScheduleLabel) {
let dot = schedule_graph_dot(app, schedule_label, &schedule_graph::Settings::default());
println!("{dot}");
}
#[cfg(feature = "render_graph")]
pub fn render_graph_dot(app: &App, settings: &render_graph::Settings) -> String {
use bevy_render::render_graph::RenderGraph;
let render_app = app
.get_sub_app(bevy_render::RenderApp)
.unwrap_or_else(|_| panic!("no render app"));
let render_graph = render_app.world.get_resource::<RenderGraph>().unwrap();
render_graph::render_graph_dot(render_graph, &settings)
}
#[cfg(feature = "render_graph")]
pub fn print_render_graph(app: &mut App) {
let dot = render_graph_dot(app, &render_graph::Settings::default());
println!("{dot}");
}