Skip to content

Commit b6f82e0

Browse files
committed
wip
1 parent f201a9d commit b6f82e0

File tree

10 files changed

+176
-191
lines changed

10 files changed

+176
-191
lines changed

crates/bevy_core_pipeline/src/bloom/mod.rs

Lines changed: 24 additions & 39 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, system::lifetimeless::Read};
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,46 +113,27 @@ impl Plugin for BloomPlugin {
113113
}
114114
}
115115

116-
pub struct BloomNode {
117-
view_query: QueryState<(
118-
&'static ExtractedCamera,
119-
&'static ViewTarget,
120-
&'static BloomTexture,
121-
&'static BloomBindGroups,
122-
&'static DynamicUniformIndex<BloomUniforms>,
123-
&'static BloomSettings,
124-
&'static UpsamplingPipelineIds,
125-
&'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-
}
116+
struct BloomNode;
117+
impl ViewNode for BloomNode {
118+
type ViewWorldQuery = (
119+
Read<ExtractedCamera>,
120+
Read<ViewTarget>,
121+
Read<BloomTexture>,
122+
Read<BloomBindGroups>,
123+
Read<DynamicUniformIndex<BloomUniforms>>,
124+
Read<BloomSettings>,
125+
Read<UpsamplingPipelineIds>,
126+
Read<BloomDownsamplingPipelineIds>,
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/mod.rs

Lines changed: 5 additions & 4 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,12 @@ impl Plugin for Core3dPlugin {
8686
),
8787
);
8888

89-
let prepass_node = PrepassNode::new(&mut render_app.world);
89+
let prepass_node = ViewNodeRunner::<PrepassNode>::from_world(&mut render_app.world);
9090
let opaque_node_3d = MainOpaquePass3dNode::new(&mut render_app.world);
9191
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);
92+
let tonemapping = ViewNodeRunner::<TonemappingNode>::from_world(&mut render_app.world);
93+
let upscaling = ViewNodeRunner::<UpscalingNode>::from_world(&mut render_app.world);
94+
9495
let mut graph = render_app.world.resource_mut::<RenderGraph>();
9596

9697
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::new(FxaaNode::new(), &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::new(FxaaNode::new(), &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

crates/bevy_core_pipeline/src/fxaa/node.rs

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,60 +2,51 @@ use std::sync::Mutex;
22

33
use crate::fxaa::{CameraFxaaPipeline, Fxaa, FxaaPipeline};
44
use bevy_ecs::prelude::*;
5-
use bevy_ecs::query::QueryState;
5+
use bevy_ecs::query::ROQueryItem;
6+
use bevy_ecs::system::lifetimeless::Read;
67
use bevy_render::{
7-
render_graph::{Node, NodeRunError, RenderGraphContext},
8+
render_graph::{NodeRunError, RenderGraphContext, ViewNode},
89
render_resource::{
910
BindGroup, BindGroupDescriptor, BindGroupEntry, BindingResource, FilterMode, Operations,
1011
PipelineCache, RenderPassColorAttachment, RenderPassDescriptor, SamplerDescriptor,
1112
TextureViewId,
1213
},
1314
renderer::RenderContext,
14-
view::{ExtractedView, ViewTarget},
15+
view::ViewTarget,
1516
};
1617
use bevy_utils::default;
1718

1819
pub struct FxaaNode {
19-
query: QueryState<
20-
(
21-
&'static ViewTarget,
22-
&'static CameraFxaaPipeline,
23-
&'static Fxaa,
24-
),
25-
With<ExtractedView>,
26-
>,
2720
cached_texture_bind_group: Mutex<Option<(TextureViewId, BindGroup)>>,
2821
}
2922

3023
impl FxaaNode {
31-
pub fn new(world: &mut World) -> Self {
24+
pub fn new() -> Self {
3225
Self {
33-
query: QueryState::new(world),
3426
cached_texture_bind_group: Mutex::new(None),
3527
}
3628
}
3729
}
3830

39-
impl Node for FxaaNode {
40-
fn update(&mut self, world: &mut World) {
41-
self.query.update_archetypes(world);
31+
impl Default for FxaaNode {
32+
fn default() -> Self {
33+
Self::new()
4234
}
35+
}
36+
37+
impl ViewNode for FxaaNode {
38+
type ViewWorldQuery = (Read<ViewTarget>, Read<CameraFxaaPipeline>, Read<Fxaa>);
4339

4440
fn run(
4541
&self,
46-
graph: &mut RenderGraphContext,
42+
_graph: &mut RenderGraphContext,
4743
render_context: &mut RenderContext,
44+
(target, pipeline, fxaa): ROQueryItem<Self::ViewWorldQuery>,
4845
world: &World,
4946
) -> Result<(), NodeRunError> {
50-
let view_entity = graph.view_entity();
5147
let pipeline_cache = world.resource::<PipelineCache>();
5248
let fxaa_pipeline = world.resource::<FxaaPipeline>();
5349

54-
let (target, pipeline, fxaa) = match self.query.get_manual(world, view_entity) {
55-
Ok(result) => result,
56-
Err(_) => return Ok(()),
57-
};
58-
5950
if !fxaa.enabled {
6051
return Ok(());
6152
};

crates/bevy_core_pipeline/src/prepass/node.rs

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1-
use bevy_ecs::prelude::*;
2-
use bevy_ecs::query::QueryState;
1+
use bevy_ecs::query::ROQueryItem;
2+
use bevy_ecs::{prelude::*, system::lifetimeless::Read};
3+
use bevy_render::render_graph::ViewNode;
34
use bevy_render::{
45
camera::ExtractedCamera,
56
prelude::Color,
6-
render_graph::{Node, NodeRunError, RenderGraphContext},
7+
render_graph::{NodeRunError, RenderGraphContext},
78
render_phase::RenderPhase,
89
render_resource::{
910
LoadOp, Operations, RenderPassColorAttachment, RenderPassDepthStencilAttachment,
1011
RenderPassDescriptor,
1112
},
1213
renderer::RenderContext,
13-
view::{ExtractedView, ViewDepthTexture},
14+
view::ViewDepthTexture,
1415
};
1516
#[cfg(feature = "trace")]
1617
use bevy_utils::tracing::info_span;
@@ -20,48 +21,36 @@ use super::{AlphaMask3dPrepass, Opaque3dPrepass, ViewPrepassTextures};
2021
/// Render node used by the prepass.
2122
///
2223
/// By default, inserted before the main pass in the render graph.
23-
pub struct PrepassNode {
24-
main_view_query: QueryState<
25-
(
26-
&'static ExtractedCamera,
27-
&'static RenderPhase<Opaque3dPrepass>,
28-
&'static RenderPhase<AlphaMask3dPrepass>,
29-
&'static ViewDepthTexture,
30-
&'static ViewPrepassTextures,
31-
),
32-
With<ExtractedView>,
33-
>,
34-
}
35-
36-
impl PrepassNode {
37-
pub fn new(world: &mut World) -> Self {
38-
Self {
39-
main_view_query: QueryState::new(world),
40-
}
24+
pub struct PrepassNode;
25+
impl FromWorld for PrepassNode {
26+
fn from_world(_world: &mut World) -> Self {
27+
Self
4128
}
4229
}
4330

44-
impl Node for PrepassNode {
45-
fn update(&mut self, world: &mut World) {
46-
self.main_view_query.update_archetypes(world);
47-
}
31+
impl ViewNode for PrepassNode {
32+
type ViewWorldQuery = (
33+
Read<ExtractedCamera>,
34+
Read<RenderPhase<Opaque3dPrepass>>,
35+
Read<RenderPhase<AlphaMask3dPrepass>>,
36+
Read<ViewDepthTexture>,
37+
Read<ViewPrepassTextures>,
38+
);
4839

4940
fn run(
5041
&self,
5142
graph: &mut RenderGraphContext,
5243
render_context: &mut RenderContext,
53-
world: &World,
54-
) -> Result<(), NodeRunError> {
55-
let view_entity = graph.view_entity();
56-
let Ok((
44+
(
5745
camera,
5846
opaque_prepass_phase,
5947
alpha_mask_prepass_phase,
6048
view_depth_texture,
6149
view_prepass_textures,
62-
)) = self.main_view_query.get_manual(world, view_entity) else {
63-
return Ok(());
64-
};
50+
): ROQueryItem<Self::ViewWorldQuery>,
51+
world: &World,
52+
) -> Result<(), NodeRunError> {
53+
let view_entity = graph.view_entity();
6554

6655
let mut color_attachments = vec![];
6756
color_attachments.push(

0 commit comments

Comments
 (0)