Skip to content

Commit da15a35

Browse files
committed
wip
1 parent f201a9d commit da15a35

File tree

12 files changed

+202
-267
lines changed

12 files changed

+202
-267
lines changed

crates/bevy_core_pipeline/src/bloom/mod.rs

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pub use settings::{BloomCompositeMode, BloomPrefilterSettings, BloomSettings};
77
use crate::{core_2d, core_3d};
88
use bevy_app::{App, Plugin};
99
use bevy_asset::{load_internal_asset, HandleUntyped};
10-
use bevy_ecs::prelude::*;
10+
use bevy_ecs::{prelude::*, query::ROQueryItem};
1111
use bevy_math::UVec2;
1212
use bevy_reflect::TypeUuid;
1313
use bevy_render::{
@@ -16,7 +16,7 @@ use bevy_render::{
1616
ComponentUniforms, DynamicUniformIndex, ExtractComponentPlugin, UniformComponentPlugin,
1717
},
1818
prelude::Color,
19-
render_graph::{Node, NodeRunError, RenderGraph, RenderGraphContext},
19+
render_graph::{NodeRunError, RenderGraph, RenderGraphContext, ViewNode, ViewNodeRunner},
2020
render_resource::*,
2121
renderer::{RenderContext, RenderDevice},
2222
texture::{CachedTexture, TextureCache},
@@ -75,7 +75,7 @@ impl Plugin for BloomPlugin {
7575

7676
// Add bloom to the 3d render graph
7777
{
78-
let bloom_node = BloomNode::new(&mut render_app.world);
78+
let bloom_node = ViewNodeRunner::new(BloomNode, &mut render_app.world);
7979
let mut graph = render_app.world.resource_mut::<RenderGraph>();
8080
let draw_3d_graph = graph
8181
.get_sub_graph_mut(crate::core_3d::graph::NAME)
@@ -94,7 +94,7 @@ impl Plugin for BloomPlugin {
9494

9595
// Add bloom to the 2d render graph
9696
{
97-
let bloom_node = BloomNode::new(&mut render_app.world);
97+
let bloom_node = ViewNodeRunner::new(BloomNode, &mut render_app.world);
9898
let mut graph = render_app.world.resource_mut::<RenderGraph>();
9999
let draw_2d_graph = graph
100100
.get_sub_graph_mut(crate::core_2d::graph::NAME)
@@ -113,8 +113,9 @@ impl Plugin for BloomPlugin {
113113
}
114114
}
115115

116-
pub struct BloomNode {
117-
view_query: QueryState<(
116+
struct BloomNode;
117+
impl ViewNode for BloomNode {
118+
type ViewWorldQuery = (
118119
&'static ExtractedCamera,
119120
&'static ViewTarget,
120121
&'static BloomTexture,
@@ -123,36 +124,16 @@ pub struct BloomNode {
123124
&'static BloomSettings,
124125
&'static UpsamplingPipelineIds,
125126
&'static BloomDownsamplingPipelineIds,
126-
)>,
127-
}
128-
129-
impl BloomNode {
130-
pub fn new(world: &mut World) -> Self {
131-
Self {
132-
view_query: QueryState::new(world),
133-
}
134-
}
135-
}
136-
137-
impl Node for BloomNode {
138-
fn update(&mut self, world: &mut World) {
139-
self.view_query.update_archetypes(world);
140-
}
127+
);
141128

142129
// Atypically for a post-processing effect, we do not need to
143130
// use a secondary texture normally provided by view_target.post_process_write(),
144131
// instead we write into our own bloom texture and then directly back onto main.
145132
fn run(
146133
&self,
147-
graph: &mut RenderGraphContext,
134+
_graph: &mut RenderGraphContext,
148135
render_context: &mut RenderContext,
149-
world: &World,
150-
) -> Result<(), NodeRunError> {
151-
let downsampling_pipeline_res = world.resource::<BloomDownsamplingPipeline>();
152-
let pipeline_cache = world.resource::<PipelineCache>();
153-
let uniforms = world.resource::<ComponentUniforms<BloomUniforms>>();
154-
let view_entity = graph.view_entity();
155-
let Ok((
136+
(
156137
camera,
157138
view_target,
158139
bloom_texture,
@@ -161,8 +142,12 @@ impl Node for BloomNode {
161142
bloom_settings,
162143
upsampling_pipeline_ids,
163144
downsampling_pipeline_ids,
164-
)) = self.view_query.get_manual(world, view_entity)
165-
else { return Ok(()) };
145+
): ROQueryItem<Self::ViewWorldQuery>,
146+
world: &World,
147+
) -> Result<(), NodeRunError> {
148+
let downsampling_pipeline_res = world.resource::<BloomDownsamplingPipeline>();
149+
let pipeline_cache = world.resource::<PipelineCache>();
150+
let uniforms = world.resource::<ComponentUniforms<BloomUniforms>>();
166151

167152
let (
168153
Some(uniforms),

crates/bevy_core_pipeline/src/core_2d/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use bevy_ecs::prelude::*;
2525
use bevy_render::{
2626
camera::Camera,
2727
extract_component::ExtractComponentPlugin,
28-
render_graph::{EmptyNode, RenderGraph},
28+
render_graph::{EmptyNode, RenderGraph, ViewNodeRunner},
2929
render_phase::{
3030
batch_phase_system, sort_phase_system, BatchedPhaseItem, CachedRenderPipelinePhaseItem,
3131
DrawFunctionId, DrawFunctions, PhaseItem, RenderPhase,
@@ -64,8 +64,8 @@ impl Plugin for Core2dPlugin {
6464
);
6565

6666
let pass_node_2d = MainPass2dNode::new(&mut render_app.world);
67-
let tonemapping = TonemappingNode::new(&mut render_app.world);
68-
let upscaling = UpscalingNode::new(&mut render_app.world);
67+
let tonemapping = ViewNodeRunner::<TonemappingNode>::from_world(&mut render_app.world);
68+
let upscaling = ViewNodeRunner::<UpscalingNode>::from_world(&mut render_app.world);
6969
let mut graph = render_app.world.resource_mut::<RenderGraph>();
7070

7171
let mut draw_2d_graph = RenderGraph::default();

crates/bevy_core_pipeline/src/core_3d/main_opaque_pass_3d_node.rs

Lines changed: 23 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3,59 +3,40 @@ use crate::{
33
core_3d::{Camera3d, Opaque3d},
44
prepass::{DepthPrepass, MotionVectorPrepass, NormalPrepass},
55
};
6-
use bevy_ecs::prelude::*;
6+
use bevy_ecs::{prelude::*, query::ROQueryItem};
77
use bevy_render::{
88
camera::ExtractedCamera,
9-
render_graph::{Node, NodeRunError, RenderGraphContext},
9+
render_graph::{NodeRunError, RenderGraphContext, ViewNode},
1010
render_phase::RenderPhase,
1111
render_resource::{LoadOp, Operations, RenderPassDepthStencilAttachment, RenderPassDescriptor},
1212
renderer::RenderContext,
13-
view::{ExtractedView, ViewDepthTexture, ViewTarget},
13+
view::{ViewDepthTexture, ViewTarget},
1414
};
1515
#[cfg(feature = "trace")]
1616
use bevy_utils::tracing::info_span;
1717

1818
use super::{AlphaMask3d, Camera3dDepthLoadOp};
1919

2020
/// A [`Node`] that runs the [`Opaque3d`] and [`AlphaMask3d`] [`RenderPhase`].
21-
pub struct MainOpaquePass3dNode {
22-
query: QueryState<
23-
(
24-
&'static ExtractedCamera,
25-
&'static RenderPhase<Opaque3d>,
26-
&'static RenderPhase<AlphaMask3d>,
27-
&'static Camera3d,
28-
&'static ViewTarget,
29-
&'static ViewDepthTexture,
30-
Option<&'static DepthPrepass>,
31-
Option<&'static NormalPrepass>,
32-
Option<&'static MotionVectorPrepass>,
33-
),
34-
With<ExtractedView>,
35-
>,
36-
}
37-
38-
impl MainOpaquePass3dNode {
39-
pub fn new(world: &mut World) -> Self {
40-
Self {
41-
query: world.query_filtered(),
42-
}
43-
}
44-
}
45-
46-
impl Node for MainOpaquePass3dNode {
47-
fn update(&mut self, world: &mut World) {
48-
self.query.update_archetypes(world);
49-
}
21+
pub struct MainOpaquePass3dNode;
22+
impl ViewNode for MainOpaquePass3dNode {
23+
type ViewWorldQuery = (
24+
&'static ExtractedCamera,
25+
&'static RenderPhase<Opaque3d>,
26+
&'static RenderPhase<AlphaMask3d>,
27+
&'static Camera3d,
28+
&'static ViewTarget,
29+
&'static ViewDepthTexture,
30+
Option<&'static DepthPrepass>,
31+
Option<&'static NormalPrepass>,
32+
Option<&'static MotionVectorPrepass>,
33+
);
5034

5135
fn run(
5236
&self,
5337
graph: &mut RenderGraphContext,
5438
render_context: &mut RenderContext,
55-
world: &World,
56-
) -> Result<(), NodeRunError> {
57-
let view_entity = graph.view_entity();
58-
let Ok((
39+
(
5940
camera,
6041
opaque_phase,
6142
alpha_mask_phase,
@@ -64,12 +45,10 @@ impl Node for MainOpaquePass3dNode {
6445
depth,
6546
depth_prepass,
6647
normal_prepass,
67-
motion_vector_prepass
68-
)) = self.query.get_manual(world, view_entity) else {
69-
// No window
70-
return Ok(());
71-
};
72-
48+
motion_vector_prepass,
49+
): ROQueryItem<Self::ViewWorldQuery>,
50+
world: &World,
51+
) -> Result<(), NodeRunError> {
7352
// Run the opaque pass, sorted front-to-back
7453
// NOTE: Scoped to drop the mutable borrow of render_context
7554
#[cfg(feature = "trace")]
@@ -115,6 +94,8 @@ impl Node for MainOpaquePass3dNode {
11594
render_pass.set_camera_viewport(viewport);
11695
}
11796

97+
let view_entity = graph.view_entity();
98+
11899
opaque_phase.render(&mut render_pass, world, view_entity);
119100

120101
if !alpha_mask_phase.items.is_empty() {

crates/bevy_core_pipeline/src/core_3d/main_transparent_pass_3d_node.rs

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,34 @@
11
use crate::core_3d::Transparent3d;
2-
use bevy_ecs::prelude::*;
2+
use bevy_ecs::{prelude::*, query::ROQueryItem};
33
use bevy_render::{
44
camera::ExtractedCamera,
5-
render_graph::{Node, NodeRunError, RenderGraphContext},
5+
render_graph::{NodeRunError, RenderGraphContext, ViewNode},
66
render_phase::RenderPhase,
77
render_resource::{LoadOp, Operations, RenderPassDepthStencilAttachment, RenderPassDescriptor},
88
renderer::RenderContext,
9-
view::{ExtractedView, ViewDepthTexture, ViewTarget},
9+
view::{ViewDepthTexture, ViewTarget},
1010
};
1111
#[cfg(feature = "trace")]
1212
use bevy_utils::tracing::info_span;
1313

1414
/// A [`Node`] that runs the [`Transparent3d`] [`RenderPhase`].
15-
pub struct MainTransparentPass3dNode {
16-
query: QueryState<
17-
(
18-
&'static ExtractedCamera,
19-
&'static RenderPhase<Transparent3d>,
20-
&'static ViewTarget,
21-
&'static ViewDepthTexture,
22-
),
23-
With<ExtractedView>,
24-
>,
25-
}
26-
27-
impl MainTransparentPass3dNode {
28-
pub fn new(world: &mut World) -> Self {
29-
Self {
30-
query: world.query_filtered(),
31-
}
32-
}
33-
}
34-
35-
impl Node for MainTransparentPass3dNode {
36-
fn update(&mut self, world: &mut World) {
37-
self.query.update_archetypes(world);
38-
}
15+
pub struct MainTransparentPass3dNode;
3916

17+
impl ViewNode for MainTransparentPass3dNode {
18+
type ViewWorldQuery = (
19+
&'static ExtractedCamera,
20+
&'static RenderPhase<Transparent3d>,
21+
&'static ViewTarget,
22+
&'static ViewDepthTexture,
23+
);
4024
fn run(
4125
&self,
4226
graph: &mut RenderGraphContext,
4327
render_context: &mut RenderContext,
28+
(camera, transparent_phase, target, depth): ROQueryItem<Self::ViewWorldQuery>,
4429
world: &World,
4530
) -> Result<(), NodeRunError> {
4631
let view_entity = graph.view_entity();
47-
let Ok((
48-
camera,
49-
transparent_phase,
50-
target,
51-
depth,
52-
)) = self.query.get_manual(world, view_entity) else {
53-
// No window
54-
return Ok(());
55-
};
5632

5733
if !transparent_phase.items.is_empty() {
5834
// Run the transparent pass, sorted back-to-front

crates/bevy_core_pipeline/src/core_3d/mod.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use bevy_render::{
3434
camera::{Camera, ExtractedCamera},
3535
extract_component::ExtractComponentPlugin,
3636
prelude::Msaa,
37-
render_graph::{EmptyNode, RenderGraph},
37+
render_graph::{EmptyNode, RenderGraph, ViewNodeRunner},
3838
render_phase::{
3939
sort_phase_system, CachedRenderPipelinePhaseItem, DrawFunctionId, DrawFunctions, PhaseItem,
4040
RenderPhase,
@@ -86,11 +86,13 @@ impl Plugin for Core3dPlugin {
8686
),
8787
);
8888

89-
let prepass_node = PrepassNode::new(&mut render_app.world);
90-
let opaque_node_3d = MainOpaquePass3dNode::new(&mut render_app.world);
91-
let transparent_node_3d = MainTransparentPass3dNode::new(&mut render_app.world);
92-
let tonemapping = TonemappingNode::new(&mut render_app.world);
93-
let upscaling = UpscalingNode::new(&mut render_app.world);
89+
let prepass_node = ViewNodeRunner::<PrepassNode>::from_world(&mut render_app.world);
90+
let opaque_node_3d = ViewNodeRunner::new(MainOpaquePass3dNode, &mut render_app.world);
91+
let transparent_node_3d =
92+
ViewNodeRunner::new(MainTransparentPass3dNode, &mut render_app.world);
93+
let tonemapping = ViewNodeRunner::<TonemappingNode>::from_world(&mut render_app.world);
94+
let upscaling = ViewNodeRunner::<UpscalingNode>::from_world(&mut render_app.world);
95+
9496
let mut graph = render_app.world.resource_mut::<RenderGraph>();
9597

9698
let mut draw_3d_graph = RenderGraph::default();

crates/bevy_core_pipeline/src/fxaa/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use bevy_reflect::{
99
use bevy_render::{
1010
extract_component::{ExtractComponent, ExtractComponentPlugin},
1111
prelude::Camera,
12-
render_graph::RenderGraph,
12+
render_graph::{RenderGraph, ViewNodeRunner},
1313
render_resource::*,
1414
renderer::RenderDevice,
1515
texture::BevyDefault,
@@ -93,7 +93,7 @@ impl Plugin for FxaaPlugin {
9393
.add_systems(Render, prepare_fxaa_pipelines.in_set(RenderSet::Prepare));
9494

9595
{
96-
let fxaa_node = FxaaNode::new(&mut render_app.world);
96+
let fxaa_node = ViewNodeRunner::<FxaaNode>::from_world(&mut render_app.world);
9797
let mut binding = render_app.world.resource_mut::<RenderGraph>();
9898
let graph = binding.get_sub_graph_mut(core_3d::graph::NAME).unwrap();
9999

@@ -109,7 +109,7 @@ impl Plugin for FxaaPlugin {
109109
);
110110
}
111111
{
112-
let fxaa_node = FxaaNode::new(&mut render_app.world);
112+
let fxaa_node = ViewNodeRunner::<FxaaNode>::from_world(&mut render_app.world);
113113
let mut binding = render_app.world.resource_mut::<RenderGraph>();
114114
let graph = binding.get_sub_graph_mut(core_2d::graph::NAME).unwrap();
115115

0 commit comments

Comments
 (0)