Skip to content

Commit f98727c

Browse files
authored
Use RenderStartup in MaterialPlugin (#19885)
# Objective - The MaterialPlugin has some ugly code to initialize some data in the render world - #19887 ## Solution - Use the new RenderStartup schedule to use a system instead of using the plugin `finish()` ## Testing - Tested that the 3d_scene and shader_material example still work as expected
1 parent 735eb88 commit f98727c

File tree

1 file changed

+30
-33
lines changed

1 file changed

+30
-33
lines changed

crates/bevy_pbr/src/material.rs

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ use bevy_render::erased_render_asset::{
3737
use bevy_render::mesh::mark_3d_meshes_as_changed_if_their_assets_changed;
3838
use bevy_render::render_asset::{prepare_assets, RenderAssets};
3939
use bevy_render::renderer::RenderQueue;
40+
use bevy_render::RenderStartup;
4041
use bevy_render::{
4142
batching::gpu_preprocessing::GpuPreprocessingSupport,
4243
extract_resource::ExtractResource,
@@ -371,44 +372,40 @@ where
371372
}
372373

373374
if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
374-
render_app.add_systems(
375-
ExtractSchedule,
376-
(
377-
extract_mesh_materials::<M>.in_set(MaterialExtractionSystems),
378-
early_sweep_material_instances::<M>
379-
.after(MaterialExtractionSystems)
380-
.before(late_sweep_material_instances),
381-
extract_entities_needs_specialization::<M>.after(extract_cameras),
382-
),
383-
);
384-
}
385-
}
386-
387-
fn finish(&self, app: &mut App) {
388-
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
389-
return;
390-
};
391-
392-
render_app.world_mut().resource_scope(
393-
|world, mut bind_group_allocators: Mut<MaterialBindGroupAllocators>| {
394-
let render_device = world.resource::<RenderDevice>();
395-
bind_group_allocators.insert(
396-
TypeId::of::<M>(),
397-
MaterialBindGroupAllocator::new(
398-
render_device,
399-
M::label(),
400-
material_uses_bindless_resources::<M>(render_device)
401-
.then(|| M::bindless_descriptor())
402-
.flatten(),
403-
M::bind_group_layout(render_device),
404-
M::bindless_slot_count(),
375+
render_app
376+
.add_systems(RenderStartup, setup_render_app::<M>)
377+
.add_systems(
378+
ExtractSchedule,
379+
(
380+
extract_mesh_materials::<M>.in_set(MaterialExtractionSystems),
381+
early_sweep_material_instances::<M>
382+
.after(MaterialExtractionSystems)
383+
.before(late_sweep_material_instances),
384+
extract_entities_needs_specialization::<M>.after(extract_cameras),
405385
),
406386
);
407-
},
408-
);
387+
}
409388
}
410389
}
411390

391+
fn setup_render_app<M: Material>(
392+
render_device: Res<RenderDevice>,
393+
mut bind_group_allocators: ResMut<MaterialBindGroupAllocators>,
394+
) {
395+
bind_group_allocators.insert(
396+
TypeId::of::<M>(),
397+
MaterialBindGroupAllocator::new(
398+
&render_device,
399+
M::label(),
400+
material_uses_bindless_resources::<M>(&render_device)
401+
.then(|| M::bindless_descriptor())
402+
.flatten(),
403+
M::bind_group_layout(&render_device),
404+
M::bindless_slot_count(),
405+
),
406+
);
407+
}
408+
412409
/// A dummy [`AssetId`] that we use as a placeholder whenever a mesh doesn't
413410
/// have a material.
414411
///

0 commit comments

Comments
 (0)