bevy_doryen/
render_schedule.rs1use bevy_app::{App, Plugin};
2use bevy_ecs::schedule::{ExecutorKind, InternedScheduleLabel, Schedule, ScheduleLabel};
3use bevy_ecs::system::Resource;
4use bevy_ecs::world::{Mut, World};
5
6#[derive(ScheduleLabel, Clone, Copy, Debug, Eq, Hash, PartialEq)]
16pub struct MainRender;
17
18#[derive(ScheduleLabel, Clone, Copy, Debug, Eq, Hash, PartialEq)]
21pub struct First;
22
23#[derive(ScheduleLabel, Clone, Copy, Debug, Eq, Hash, PartialEq)]
27pub struct PreRender;
28
29#[derive(ScheduleLabel, Clone, Copy, Debug, Eq, Hash, PartialEq)]
33pub struct Render;
34
35#[derive(ScheduleLabel, Clone, Copy, Debug, Eq, Hash, PartialEq)]
39pub struct PostRender;
40
41#[derive(ScheduleLabel, Clone, Copy, Debug, Eq, Hash, PartialEq)]
44pub struct Last;
45
46#[derive(Debug, Resource)]
49pub struct MainRenderScheduleOrder {
50 pub labels: Vec<InternedScheduleLabel>,
52}
53
54impl Default for MainRenderScheduleOrder {
55 fn default() -> Self {
56 Self {
57 labels: vec![
58 First.intern(),
59 PreRender.intern(),
60 Render.intern(),
61 PostRender.intern(),
62 Last.intern(),
63 ],
64 }
65 }
66}
67
68impl MainRender {
69 pub fn run_main_render(world: &mut World) {
71 #[allow(clippy::shadow_unrelated)]
72 world.resource_scope(|world, order: Mut<'_, MainRenderScheduleOrder>| {
73 for &label in &order.labels {
74 let _ = world.try_run_schedule(label);
75 }
76 });
77 }
78}
79
80#[derive(Copy, Clone, Debug)]
82pub struct RenderSchedulePlugin;
83
84impl Plugin for RenderSchedulePlugin {
85 fn build(&self, app: &mut App) {
86 let mut render_schedule = Schedule::new(MainRender);
88 render_schedule.set_executor_kind(ExecutorKind::SingleThreaded);
89
90 app.add_schedule(render_schedule)
91 .init_resource::<MainRenderScheduleOrder>()
92 .add_systems(MainRender, MainRender::run_main_render);
93 }
94}