Path: blob/main/crates/bevy_render/src/render_graph/app.rs
6596 views
use bevy_app::{App, SubApp};1use bevy_ecs::world::{FromWorld, World};2use tracing::warn;34use super::{IntoRenderNodeArray, Node, RenderGraph, RenderLabel, RenderSubGraph};56/// Adds common [`RenderGraph`] operations to [`SubApp`] (and [`App`]).7pub trait RenderGraphExt {8// Add a sub graph to the [`RenderGraph`]9fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self;10/// Add a [`Node`] to the [`RenderGraph`]:11/// * Create the [`Node`] using the [`FromWorld`] implementation12/// * Add it to the graph13fn add_render_graph_node<T: Node + FromWorld>(14&mut self,15sub_graph: impl RenderSubGraph,16node_label: impl RenderLabel,17) -> &mut Self;18/// Automatically add the required node edges based on the given ordering19fn add_render_graph_edges<const N: usize>(20&mut self,21sub_graph: impl RenderSubGraph,22edges: impl IntoRenderNodeArray<N>,23) -> &mut Self;2425/// Add node edge to the specified graph26fn add_render_graph_edge(27&mut self,28sub_graph: impl RenderSubGraph,29output_node: impl RenderLabel,30input_node: impl RenderLabel,31) -> &mut Self;32}3334impl RenderGraphExt for World {35fn add_render_graph_node<T: Node + FromWorld>(36&mut self,37sub_graph: impl RenderSubGraph,38node_label: impl RenderLabel,39) -> &mut Self {40let sub_graph = sub_graph.intern();41let node = T::from_world(self);42let mut render_graph = self.get_resource_mut::<RenderGraph>().expect(43"RenderGraph not found. Make sure you are using add_render_graph_node on the RenderApp",44);45if let Some(graph) = render_graph.get_sub_graph_mut(sub_graph) {46graph.add_node(node_label, node);47} else {48warn!(49"Tried adding a render graph node to {sub_graph:?} but the sub graph doesn't exist"50);51}52self53}5455fn add_render_graph_edges<const N: usize>(56&mut self,57sub_graph: impl RenderSubGraph,58edges: impl IntoRenderNodeArray<N>,59) -> &mut Self {60let sub_graph = sub_graph.intern();61let mut render_graph = self.get_resource_mut::<RenderGraph>().expect(62"RenderGraph not found. Make sure you are using add_render_graph_edges on the RenderApp",63);64if let Some(graph) = render_graph.get_sub_graph_mut(sub_graph) {65graph.add_node_edges(edges);66} else {67warn!(68"Tried adding render graph edges to {sub_graph:?} but the sub graph doesn't exist"69);70}71self72}7374fn add_render_graph_edge(75&mut self,76sub_graph: impl RenderSubGraph,77output_node: impl RenderLabel,78input_node: impl RenderLabel,79) -> &mut Self {80let sub_graph = sub_graph.intern();81let mut render_graph = self.get_resource_mut::<RenderGraph>().expect(82"RenderGraph not found. Make sure you are using add_render_graph_edge on the RenderApp",83);84if let Some(graph) = render_graph.get_sub_graph_mut(sub_graph) {85graph.add_node_edge(output_node, input_node);86} else {87warn!(88"Tried adding a render graph edge to {sub_graph:?} but the sub graph doesn't exist"89);90}91self92}9394fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self {95let mut render_graph = self.get_resource_mut::<RenderGraph>().expect(96"RenderGraph not found. Make sure you are using add_render_sub_graph on the RenderApp",97);98render_graph.add_sub_graph(sub_graph, RenderGraph::default());99self100}101}102103impl RenderGraphExt for SubApp {104fn add_render_graph_node<T: Node + FromWorld>(105&mut self,106sub_graph: impl RenderSubGraph,107node_label: impl RenderLabel,108) -> &mut Self {109World::add_render_graph_node::<T>(self.world_mut(), sub_graph, node_label);110self111}112113fn add_render_graph_edge(114&mut self,115sub_graph: impl RenderSubGraph,116output_node: impl RenderLabel,117input_node: impl RenderLabel,118) -> &mut Self {119World::add_render_graph_edge(self.world_mut(), sub_graph, output_node, input_node);120self121}122123fn add_render_graph_edges<const N: usize>(124&mut self,125sub_graph: impl RenderSubGraph,126edges: impl IntoRenderNodeArray<N>,127) -> &mut Self {128World::add_render_graph_edges(self.world_mut(), sub_graph, edges);129self130}131132fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self {133World::add_render_sub_graph(self.world_mut(), sub_graph);134self135}136}137138impl RenderGraphExt for App {139fn add_render_graph_node<T: Node + FromWorld>(140&mut self,141sub_graph: impl RenderSubGraph,142node_label: impl RenderLabel,143) -> &mut Self {144World::add_render_graph_node::<T>(self.world_mut(), sub_graph, node_label);145self146}147148fn add_render_graph_edge(149&mut self,150sub_graph: impl RenderSubGraph,151output_node: impl RenderLabel,152input_node: impl RenderLabel,153) -> &mut Self {154World::add_render_graph_edge(self.world_mut(), sub_graph, output_node, input_node);155self156}157158fn add_render_graph_edges<const N: usize>(159&mut self,160sub_graph: impl RenderSubGraph,161edges: impl IntoRenderNodeArray<N>,162) -> &mut Self {163World::add_render_graph_edges(self.world_mut(), sub_graph, edges);164self165}166167fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self {168World::add_render_sub_graph(self.world_mut(), sub_graph);169self170}171}172173174