Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_render/src/render_graph/app.rs
6596 views
1
use bevy_app::{App, SubApp};
2
use bevy_ecs::world::{FromWorld, World};
3
use tracing::warn;
4
5
use super::{IntoRenderNodeArray, Node, RenderGraph, RenderLabel, RenderSubGraph};
6
7
/// Adds common [`RenderGraph`] operations to [`SubApp`] (and [`App`]).
8
pub trait RenderGraphExt {
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
35
impl RenderGraphExt for World {
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);
43
let mut render_graph = self.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.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.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.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
104
impl RenderGraphExt for SubApp {
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
World::add_render_graph_node::<T>(self.world_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
World::add_render_graph_edge(self.world_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
World::add_render_graph_edges(self.world_mut(), sub_graph, edges);
130
self
131
}
132
133
fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self {
134
World::add_render_sub_graph(self.world_mut(), sub_graph);
135
self
136
}
137
}
138
139
impl RenderGraphExt for App {
140
fn add_render_graph_node<T: Node + FromWorld>(
141
&mut self,
142
sub_graph: impl RenderSubGraph,
143
node_label: impl RenderLabel,
144
) -> &mut Self {
145
World::add_render_graph_node::<T>(self.world_mut(), sub_graph, node_label);
146
self
147
}
148
149
fn add_render_graph_edge(
150
&mut self,
151
sub_graph: impl RenderSubGraph,
152
output_node: impl RenderLabel,
153
input_node: impl RenderLabel,
154
) -> &mut Self {
155
World::add_render_graph_edge(self.world_mut(), sub_graph, output_node, input_node);
156
self
157
}
158
159
fn add_render_graph_edges<const N: usize>(
160
&mut self,
161
sub_graph: impl RenderSubGraph,
162
edges: impl IntoRenderNodeArray<N>,
163
) -> &mut Self {
164
World::add_render_graph_edges(self.world_mut(), sub_graph, edges);
165
self
166
}
167
168
fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self {
169
World::add_render_sub_graph(self.world_mut(), sub_graph);
170
self
171
}
172
}
173
174