Skip to content

Commit 6e3739a

Browse files
authored
Use RenderStartup for bevy_pbr for some basic cases. (#19999)
# Objective - Progress towards #19887. ## Solution - For cases that don't need to conditionally add systems, we can just replace FromWorld impls with systems and then add those systems to `RenderStartup`. ## Testing - I ran the `lightmaps`, `reflection_probes`, `deferred_rendering`, `volumetric_fog`, and `wireframe` examples.
1 parent c994bdf commit 6e3739a

File tree

9 files changed

+228
-249
lines changed

9 files changed

+228
-249
lines changed

crates/bevy_pbr/src/deferred/mod.rs

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
};
88
use crate::{DistanceFog, MeshPipelineKey, ViewFogUniformOffset, ViewLightsUniformOffset};
99
use bevy_app::prelude::*;
10-
use bevy_asset::{embedded_asset, load_embedded_asset, Handle};
10+
use bevy_asset::{embedded_asset, load_embedded_asset, AssetServer, Handle};
1111
use bevy_core_pipeline::{
1212
core_3d::graph::{Core3d, Node3d},
1313
deferred::{
@@ -19,6 +19,7 @@ use bevy_core_pipeline::{
1919
use bevy_ecs::{prelude::*, query::QueryItem};
2020
use bevy_image::BevyDefault as _;
2121
use bevy_light::{EnvironmentMapLight, ShadowFilteringMethod};
22+
use bevy_render::RenderStartup;
2223
use bevy_render::{
2324
extract_component::{
2425
ComponentUniforms, ExtractComponent, ExtractComponentPlugin, UniformComponentPlugin,
@@ -104,6 +105,7 @@ impl Plugin for DeferredPbrLightingPlugin {
104105

105106
render_app
106107
.init_resource::<SpecializedRenderPipelines<DeferredLightingLayout>>()
108+
.add_systems(RenderStartup, init_deferred_lighting_layout)
107109
.add_systems(
108110
Render,
109111
(prepare_deferred_lighting_pipelines.in_set(RenderSystems::Prepare),),
@@ -121,14 +123,6 @@ impl Plugin for DeferredPbrLightingPlugin {
121123
),
122124
);
123125
}
124-
125-
fn finish(&self, app: &mut App) {
126-
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
127-
return;
128-
};
129-
130-
render_app.init_resource::<DeferredLightingLayout>();
131-
}
132126
}
133127

134128
#[derive(Default)]
@@ -394,22 +388,27 @@ impl SpecializedRenderPipeline for DeferredLightingLayout {
394388
}
395389
}
396390

397-
impl FromWorld for DeferredLightingLayout {
398-
fn from_world(world: &mut World) -> Self {
399-
let render_device = world.resource::<RenderDevice>();
400-
let layout = render_device.create_bind_group_layout(
401-
"deferred_lighting_layout",
402-
&BindGroupLayoutEntries::single(
403-
ShaderStages::VERTEX_FRAGMENT,
404-
uniform_buffer::<PbrDeferredLightingDepthId>(false),
405-
),
406-
);
407-
Self {
408-
mesh_pipeline: world.resource::<MeshPipeline>().clone(),
409-
bind_group_layout_2: layout,
410-
deferred_lighting_shader: load_embedded_asset!(world, "deferred_lighting.wgsl"),
411-
}
412-
}
391+
pub fn init_deferred_lighting_layout(
392+
mut commands: Commands,
393+
render_device: Res<RenderDevice>,
394+
mesh_pipeline: Res<MeshPipeline>,
395+
asset_server: Res<AssetServer>,
396+
) {
397+
let layout = render_device.create_bind_group_layout(
398+
"deferred_lighting_layout",
399+
&BindGroupLayoutEntries::single(
400+
ShaderStages::VERTEX_FRAGMENT,
401+
uniform_buffer::<PbrDeferredLightingDepthId>(false),
402+
),
403+
);
404+
commands.insert_resource(DeferredLightingLayout {
405+
mesh_pipeline: mesh_pipeline.clone(),
406+
bind_group_layout_2: layout,
407+
deferred_lighting_shader: load_embedded_asset!(
408+
asset_server.as_ref(),
409+
"deferred_lighting.wgsl"
410+
),
411+
});
413412
}
414413

415414
pub fn insert_deferred_lighting_pass_id_component(

crates/bevy_pbr/src/light_probe/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,9 +289,7 @@ impl Plugin for LightProbePlugin {
289289
load_shader_library!(app, "irradiance_volume.wgsl");
290290

291291
app.add_plugins(ExtractInstancesPlugin::<EnvironmentMapIds>::new());
292-
}
293292

294-
fn finish(&self, app: &mut App) {
295293
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
296294
return;
297295
};

crates/bevy_pbr/src/lightmap/mod.rs

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ use bevy_ecs::{
4242
reflect::ReflectComponent,
4343
resource::Resource,
4444
schedule::IntoScheduleConfigs,
45-
system::{Query, Res, ResMut},
46-
world::{FromWorld, World},
45+
system::{Commands, Query, Res, ResMut},
4746
};
4847
use bevy_image::Image;
4948
use bevy_math::{uvec2, vec4, Rect, UVec2};
@@ -57,7 +56,7 @@ use bevy_render::{
5756
sync_world::MainEntity,
5857
texture::{FallbackImage, GpuImage},
5958
view::ViewVisibility,
60-
Extract, ExtractSchedule, RenderApp,
59+
Extract, ExtractSchedule, RenderApp, RenderStartup,
6160
};
6261
use bevy_render::{renderer::RenderDevice, sync_world::MainEntityHashMap};
6362
use bevy_utils::default;
@@ -186,17 +185,16 @@ pub struct LightmapSlotIndex(pub(crate) NonMaxU16);
186185
impl Plugin for LightmapPlugin {
187186
fn build(&self, app: &mut App) {
188187
load_shader_library!(app, "lightmap.wgsl");
189-
}
190188

191-
fn finish(&self, app: &mut App) {
192189
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
193190
return;
194191
};
195-
196-
render_app.init_resource::<RenderLightmaps>().add_systems(
197-
ExtractSchedule,
198-
extract_lightmaps.after(MeshExtractionSystems),
199-
);
192+
render_app
193+
.add_systems(RenderStartup, init_render_lightmaps)
194+
.add_systems(
195+
ExtractSchedule,
196+
extract_lightmaps.after(MeshExtractionSystems),
197+
);
200198
}
201199
}
202200

@@ -334,21 +332,20 @@ impl Default for Lightmap {
334332
}
335333
}
336334

337-
impl FromWorld for RenderLightmaps {
338-
fn from_world(world: &mut World) -> Self {
339-
let render_device = world.resource::<RenderDevice>();
340-
let render_adapter = world.resource::<RenderAdapter>();
341-
342-
let bindless_supported = binding_arrays_are_usable(render_device, render_adapter);
343-
344-
RenderLightmaps {
345-
render_lightmaps: default(),
346-
slabs: vec![],
347-
free_slabs: FixedBitSet::new(),
348-
pending_lightmaps: default(),
349-
bindless_supported,
350-
}
351-
}
335+
pub fn init_render_lightmaps(
336+
mut commands: Commands,
337+
render_device: Res<RenderDevice>,
338+
render_adapter: Res<RenderAdapter>,
339+
) {
340+
let bindless_supported = binding_arrays_are_usable(&render_device, &render_adapter);
341+
342+
commands.insert_resource(RenderLightmaps {
343+
render_lightmaps: default(),
344+
slabs: vec![],
345+
free_slabs: FixedBitSet::new(),
346+
pending_lightmaps: default(),
347+
bindless_supported,
348+
});
352349
}
353350

354351
impl RenderLightmaps {

crates/bevy_pbr/src/material.rs

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,15 @@ impl Plugin for MaterialsPlugin {
267267
.init_resource::<LightKeyCache>()
268268
.init_resource::<LightSpecializationTicks>()
269269
.init_resource::<SpecializedShadowMaterialPipelineCache>()
270+
.init_resource::<DrawFunctions<Shadow>>()
271+
.init_resource::<RenderMaterialInstances>()
272+
.init_resource::<MaterialBindGroupAllocators>()
273+
.add_render_command::<Shadow, DrawPrepass>()
274+
.add_render_command::<Transmissive3d, DrawMaterial>()
275+
.add_render_command::<Transparent3d, DrawMaterial>()
276+
.add_render_command::<Opaque3d, DrawMaterial>()
277+
.add_render_command::<AlphaMask3d, DrawMaterial>()
278+
.add_systems(RenderStartup, init_material_pipeline)
270279
.add_systems(
271280
Render,
272281
(
@@ -301,21 +310,6 @@ impl Plugin for MaterialsPlugin {
301310
);
302311
}
303312
}
304-
305-
fn finish(&self, app: &mut App) {
306-
if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
307-
render_app
308-
.init_resource::<DrawFunctions<Shadow>>()
309-
.init_resource::<RenderMaterialInstances>()
310-
.init_resource::<MaterialPipeline>()
311-
.init_resource::<MaterialBindGroupAllocators>()
312-
.add_render_command::<Shadow, DrawPrepass>()
313-
.add_render_command::<Transmissive3d, DrawMaterial>()
314-
.add_render_command::<Transparent3d, DrawMaterial>()
315-
.add_render_command::<Opaque3d, DrawMaterial>()
316-
.add_render_command::<AlphaMask3d, DrawMaterial>();
317-
}
318-
}
319313
}
320314

321315
/// Adds the necessary ECS resources and render logic to enable rendering entities using the given [`Material`]
@@ -485,12 +479,10 @@ impl SpecializedMeshPipeline for MaterialPipelineSpecializer {
485479
}
486480
}
487481

488-
impl FromWorld for MaterialPipeline {
489-
fn from_world(world: &mut World) -> Self {
490-
MaterialPipeline {
491-
mesh_pipeline: world.resource::<MeshPipeline>().clone(),
492-
}
493-
}
482+
pub fn init_material_pipeline(mut commands: Commands, mesh_pipeline: Res<MeshPipeline>) {
483+
commands.insert_resource(MaterialPipeline {
484+
mesh_pipeline: mesh_pipeline.clone(),
485+
});
494486
}
495487

496488
pub type DrawMaterial = (

0 commit comments

Comments
 (0)