Skip to content

Commit 560ffd7

Browse files
authored
make Prepass/ShadowsEnabled methods on Material (#20999)
# Objective - enabling prepass/shadows should be done like the rest of a material's properties ## Solution - remove `Prepass/ShadowsEnabled` resources and associated fields on `MaterialPlugin` - add `Material::enable_prepass` and `Material::enable_shadows`
1 parent feea1a1 commit 560ffd7

File tree

7 files changed

+70
-57
lines changed

7 files changed

+70
-57
lines changed

crates/bevy_pbr/src/decal/forward.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ impl Plugin for ForwardDecalPlugin {
4141
app.insert_resource(ForwardDecalMesh(mesh));
4242

4343
app.add_plugins(MaterialPlugin::<ForwardDecalMaterial<StandardMaterial>> {
44-
prepass_enabled: false,
45-
shadows_enabled: false,
4644
debug_flags: RenderDebugFlags::default(),
4745
..Default::default()
4846
});

crates/bevy_pbr/src/extended_material.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,19 @@ pub trait MaterialExtension: Asset + AsBindGroup + Clone + Sized {
4848
None
4949
}
5050

51+
/// Controls if the prepass is enabled for the Material.
52+
/// For more information about what a prepass is, see the [`bevy_core_pipeline::prepass`] docs.
53+
#[inline]
54+
fn enable_prepass() -> bool {
55+
true
56+
}
57+
58+
/// Controls if shadows are enabled for the Material.
59+
#[inline]
60+
fn enable_shadows() -> bool {
61+
true
62+
}
63+
5164
/// Returns this material's prepass vertex shader. If [`ShaderRef::Default`] is returned, the base material prepass vertex shader
5265
/// will be used.
5366
fn prepass_vertex_shader() -> ShaderRef {
@@ -325,6 +338,14 @@ impl<B: Material, E: MaterialExtension> Material for ExtendedMaterial<B, E> {
325338
B::reads_view_transmission_texture(&self.base)
326339
}
327340

341+
fn enable_prepass() -> bool {
342+
E::enable_prepass()
343+
}
344+
345+
fn enable_shadows() -> bool {
346+
E::enable_prepass()
347+
}
348+
328349
fn prepass_vertex_shader() -> ShaderRef {
329350
match E::prepass_vertex_shader() {
330351
ShaderRef::Default => B::prepass_vertex_shader(),

crates/bevy_pbr/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,6 @@ impl Plugin for PbrPlugin {
223223
debug_flags: self.debug_flags,
224224
},
225225
MaterialPlugin::<StandardMaterial> {
226-
prepass_enabled: self.prepass_enabled,
227226
debug_flags: self.debug_flags,
228227
..Default::default()
229228
},

crates/bevy_pbr/src/material.rs

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,19 @@ pub trait Material: Asset + AsBindGroup + Clone + Sized {
179179
false
180180
}
181181

182+
/// Controls if the prepass is enabled for the Material.
183+
/// For more information about what a prepass is, see the [`bevy_core_pipeline::prepass`] docs.
184+
#[inline]
185+
fn enable_prepass() -> bool {
186+
true
187+
}
188+
189+
/// Controls if shadows are enabled for the Material.
190+
#[inline]
191+
fn enable_shadows() -> bool {
192+
true
193+
}
194+
182195
/// Returns this material's prepass vertex shader. If [`ShaderRef::Default`] is returned, the default prepass vertex shader
183196
/// will be used.
184197
///
@@ -324,14 +337,6 @@ impl Plugin for MaterialsPlugin {
324337
/// Adds the necessary ECS resources and render logic to enable rendering entities using the given [`Material`]
325338
/// asset type.
326339
pub struct MaterialPlugin<M: Material> {
327-
/// Controls if the prepass is enabled for the Material.
328-
/// For more information about what a prepass is, see the [`bevy_core_pipeline::prepass`] docs.
329-
///
330-
/// When it is enabled, it will automatically add the [`PrepassPlugin`]
331-
/// required to make the prepass work on this Material.
332-
pub prepass_enabled: bool,
333-
/// Controls if shadows are enabled for the Material.
334-
pub shadows_enabled: bool,
335340
/// Debugging flags that can optionally be set when constructing the renderer.
336341
pub debug_flags: RenderDebugFlags,
337342
pub _marker: PhantomData<M>,
@@ -340,8 +345,6 @@ pub struct MaterialPlugin<M: Material> {
340345
impl<M: Material> Default for MaterialPlugin<M> {
341346
fn default() -> Self {
342347
Self {
343-
prepass_enabled: true,
344-
shadows_enabled: true,
345348
debug_flags: RenderDebugFlags::default(),
346349
_marker: Default::default(),
347350
}
@@ -366,7 +369,7 @@ where
366369
.after(mark_3d_meshes_as_changed_if_their_assets_changed),
367370
);
368371

369-
if self.shadows_enabled {
372+
if M::enable_shadows() {
370373
app.add_systems(
371374
PostUpdate,
372375
check_light_entities_needing_specialization::<M>
@@ -375,13 +378,6 @@ where
375378
}
376379

377380
if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
378-
if self.prepass_enabled {
379-
render_app.init_resource::<PrepassEnabled<M>>();
380-
}
381-
if self.shadows_enabled {
382-
render_app.init_resource::<ShadowsEnabled<M>>();
383-
}
384-
385381
render_app
386382
.add_systems(RenderStartup, add_material_bind_group_allocator::<M>)
387383
.add_systems(
@@ -1511,11 +1507,7 @@ where
15111507
SRes<DrawFunctions<AlphaMask3dDeferred>>,
15121508
SRes<DrawFunctions<Shadow>>,
15131509
SRes<AssetServer>,
1514-
(
1515-
Option<SRes<ShadowsEnabled<M>>>,
1516-
Option<SRes<PrepassEnabled<M>>>,
1517-
M::Param,
1518-
),
1510+
M::Param,
15191511
);
15201512

15211513
fn prepare_asset(
@@ -1536,13 +1528,13 @@ where
15361528
alpha_mask_deferred_draw_functions,
15371529
shadow_draw_functions,
15381530
asset_server,
1539-
(shadows_enabled, prepass_enabled, material_param),
1531+
material_param,
15401532
): &mut SystemParamItem<Self::Param>,
15411533
) -> Result<Self::ErasedAsset, PrepareAssetError<Self::SourceAsset>> {
15421534
let material_layout = M::bind_group_layout(render_device);
15431535

1544-
let shadows_enabled = shadows_enabled.is_some();
1545-
let prepass_enabled = prepass_enabled.is_some();
1536+
let shadows_enabled = M::enable_shadows();
1537+
let prepass_enabled = M::enable_prepass();
15461538

15471539
let draw_opaque_pbr = opaque_draw_functions.read().id::<DrawMaterial>();
15481540
let draw_alpha_mask_pbr = alpha_mask_draw_functions.read().id::<DrawMaterial>();
@@ -1811,13 +1803,3 @@ pub fn write_material_bind_group_buffers(
18111803
allocator.write_buffers(&render_device, &render_queue);
18121804
}
18131805
}
1814-
1815-
/// Marker resource for whether shadows are enabled for this material type
1816-
#[derive(Resource, Debug)]
1817-
pub struct ShadowsEnabled<M: Material>(PhantomData<M>);
1818-
1819-
impl<M: Material> Default for ShadowsEnabled<M> {
1820-
fn default() -> Self {
1821-
Self(PhantomData)
1822-
}
1823-
}

crates/bevy_pbr/src/prepass/mod.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::{
44
alpha_mode_pipeline_key, binding_arrays_are_usable, buffer_layout,
55
collect_meshes_for_gpu_building, init_material_pipeline, set_mesh_motion_vector_flags,
66
setup_morph_and_skinning_defs, skin, DeferredDrawFunction, DeferredFragmentShader,
7-
DeferredVertexShader, DrawMesh, EntitySpecializationTicks, ErasedMaterialPipelineKey, Material,
7+
DeferredVertexShader, DrawMesh, EntitySpecializationTicks, ErasedMaterialPipelineKey,
88
MaterialPipeline, MaterialProperties, MeshLayouts, MeshPipeline, MeshPipelineKey,
99
OpaqueRendererMethod, PreparedMaterial, PrepassDrawFunction, PrepassFragmentShader,
1010
PrepassVertexShader, RenderLightmaps, RenderMaterialInstances, RenderMeshInstanceFlags,
@@ -61,7 +61,6 @@ use bevy_render::{
6161
RenderSystems::{PrepareAssets, PrepareResources},
6262
};
6363
use bevy_utils::default;
64-
use core::marker::PhantomData;
6564

6665
/// Sets up everything required to use the prepass pipeline.
6766
///
@@ -183,16 +182,6 @@ impl Plugin for PrepassPlugin {
183182
}
184183
}
185184

186-
/// Marker resource for whether prepass is enabled globally for this material type
187-
#[derive(Resource, Debug)]
188-
pub struct PrepassEnabled<M: Material>(PhantomData<M>);
189-
190-
impl<M: Material> Default for PrepassEnabled<M> {
191-
fn default() -> Self {
192-
PrepassEnabled(PhantomData)
193-
}
194-
}
195-
196185
#[derive(Resource)]
197186
struct AnyPrepassPluginLoaded;
198187

examples/shader/shader_prepass.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,7 @@ fn main() {
2727
..default()
2828
}),
2929
MaterialPlugin::<CustomMaterial>::default(),
30-
MaterialPlugin::<PrepassOutputMaterial> {
31-
// This material only needs to read the prepass textures,
32-
// but the meshes using it should not contribute to the prepass render, so we can disable it.
33-
prepass_enabled: false,
34-
..default()
35-
},
30+
MaterialPlugin::<PrepassOutputMaterial>::default(),
3631
))
3732
.add_systems(Startup, setup)
3833
.add_systems(Update, (rotate, toggle_prepass_view))
@@ -207,6 +202,10 @@ impl Material for PrepassOutputMaterial {
207202
fn alpha_mode(&self) -> AlphaMode {
208203
AlphaMode::Blend
209204
}
205+
206+
fn enable_prepass() -> bool {
207+
false
208+
}
210209
}
211210

212211
/// Every time you press space, it will cycle between transparent, depth and normals view
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
title: "`enable_prepass` and `enable_shadows` are now Material methods"
3+
pull_requests: [20999]
4+
---
5+
6+
The `MaterialPlugin` fields `prepass_enabled` and `shadows_enabled` have
7+
been replaced by the `Material` methods `enable_prepass` and `enable_shadows`.
8+
9+
Analogous methods have also been added to `MaterialExtension`
10+
11+
```rust
12+
/// before
13+
MaterialPlugin::<MyMaterial> {
14+
prepass_enabled: false,
15+
shadows_enabled: false,
16+
}
17+
18+
/// after
19+
impl Material for MyMaterial {
20+
/// ...
21+
22+
fn enable_prepass() { false }
23+
fn enable_shadows() { false }
24+
}
25+
```

0 commit comments

Comments
 (0)