bevy_render/render_graph/
app.rs

1use bevy_app::{App, SubApp};
2use bevy_ecs::world::FromWorld;
3use bevy_utils::tracing::warn;
4
5use super::{IntoRenderNodeArray, Node, RenderGraph, RenderLabel, RenderSubGraph};
6
7/// Adds common [`RenderGraph`] operations to [`SubApp`] (and [`App`]).
8pub trait RenderGraphApp {
9    // Add a sub graph to the [`RenderGraph`]
10    fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self;
11    /// Add a [`Node`] to the [`RenderGraph`]:
12    /// * Create the [`Node`] using the [`FromWorld`] implementation
13    /// * Add it to the graph
14    fn add_render_graph_node<T: Node + FromWorld>(
15        &mut self,
16        sub_graph: impl RenderSubGraph,
17        node_label: impl RenderLabel,
18    ) -> &mut Self;
19    /// Automatically add the required node edges based on the given ordering
20    fn add_render_graph_edges<const N: usize>(
21        &mut self,
22        sub_graph: impl RenderSubGraph,
23        edges: impl IntoRenderNodeArray<N>,
24    ) -> &mut Self;
25
26    /// Add node edge to the specified graph
27    fn add_render_graph_edge(
28        &mut self,
29        sub_graph: impl RenderSubGraph,
30        output_node: impl RenderLabel,
31        input_node: impl RenderLabel,
32    ) -> &mut Self;
33}
34
35impl RenderGraphApp for SubApp {
36    fn add_render_graph_node<T: Node + FromWorld>(
37        &mut self,
38        sub_graph: impl RenderSubGraph,
39        node_label: impl RenderLabel,
40    ) -> &mut Self {
41        let sub_graph = sub_graph.intern();
42        let node = T::from_world(self.world_mut());
43        let mut render_graph = self.world_mut().get_resource_mut::<RenderGraph>().expect(
44            "RenderGraph not found. Make sure you are using add_render_graph_node on the RenderApp",
45        );
46        if let Some(graph) = render_graph.get_sub_graph_mut(sub_graph) {
47            graph.add_node(node_label, node);
48        } else {
49            warn!(
50                "Tried adding a render graph node to {sub_graph:?} but the sub graph doesn't exist"
51            );
52        }
53        self
54    }
55
56    fn add_render_graph_edges<const N: usize>(
57        &mut self,
58        sub_graph: impl RenderSubGraph,
59        edges: impl IntoRenderNodeArray<N>,
60    ) -> &mut Self {
61        let sub_graph = sub_graph.intern();
62        let mut render_graph = self.world_mut().get_resource_mut::<RenderGraph>().expect(
63            "RenderGraph not found. Make sure you are using add_render_graph_edges on the RenderApp",
64        );
65        if let Some(graph) = render_graph.get_sub_graph_mut(sub_graph) {
66            graph.add_node_edges(edges);
67        } else {
68            warn!(
69                "Tried adding render graph edges to {sub_graph:?} but the sub graph doesn't exist"
70            );
71        }
72        self
73    }
74
75    fn add_render_graph_edge(
76        &mut self,
77        sub_graph: impl RenderSubGraph,
78        output_node: impl RenderLabel,
79        input_node: impl RenderLabel,
80    ) -> &mut Self {
81        let sub_graph = sub_graph.intern();
82        let mut render_graph = self.world_mut().get_resource_mut::<RenderGraph>().expect(
83            "RenderGraph not found. Make sure you are using add_render_graph_edge on the RenderApp",
84        );
85        if let Some(graph) = render_graph.get_sub_graph_mut(sub_graph) {
86            graph.add_node_edge(output_node, input_node);
87        } else {
88            warn!(
89                "Tried adding a render graph edge to {sub_graph:?} but the sub graph doesn't exist"
90            );
91        }
92        self
93    }
94
95    fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self {
96        let mut render_graph = self.world_mut().get_resource_mut::<RenderGraph>().expect(
97            "RenderGraph not found. Make sure you are using add_render_sub_graph on the RenderApp",
98        );
99        render_graph.add_sub_graph(sub_graph, RenderGraph::default());
100        self
101    }
102}
103
104impl RenderGraphApp for App {
105    fn add_render_graph_node<T: Node + FromWorld>(
106        &mut self,
107        sub_graph: impl RenderSubGraph,
108        node_label: impl RenderLabel,
109    ) -> &mut Self {
110        SubApp::add_render_graph_node::<T>(self.main_mut(), sub_graph, node_label);
111        self
112    }
113
114    fn add_render_graph_edge(
115        &mut self,
116        sub_graph: impl RenderSubGraph,
117        output_node: impl RenderLabel,
118        input_node: impl RenderLabel,
119    ) -> &mut Self {
120        SubApp::add_render_graph_edge(self.main_mut(), sub_graph, output_node, input_node);
121        self
122    }
123
124    fn add_render_graph_edges<const N: usize>(
125        &mut self,
126        sub_graph: impl RenderSubGraph,
127        edges: impl IntoRenderNodeArray<N>,
128    ) -> &mut Self {
129        SubApp::add_render_graph_edges(self.main_mut(), sub_graph, edges);
130        self
131    }
132
133    fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self {
134        SubApp::add_render_sub_graph(self.main_mut(), sub_graph);
135        self
136    }
137}