Skip to content

Commit be4f4e7

Browse files
authored
Fix shadow caster/receiver toggle not working (#22004)
# Objective Fixes #21582 ## Solution In the original implementation of `extract_meshes_for_gpu_building`, we didn’t account for the case where components are removed. This patch adds fixes for all affected components. ## Testing The example `shadow_caster_receiver` works now.
1 parent 5f7e43c commit be4f4e7

File tree

1 file changed

+49
-2
lines changed

1 file changed

+49
-2
lines changed

crates/bevy_pbr/src/render/mesh.rs

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ use bevy_core_pipeline::{
1717
use bevy_derive::{Deref, DerefMut};
1818
use bevy_diagnostic::FrameCount;
1919
use bevy_ecs::{
20+
entity::EntityHashSet,
2021
prelude::*,
2122
query::{QueryData, ROQueryItem},
23+
relationship::RelationshipSourceCollection,
2224
system::{lifetimeless::*, SystemParamItem, SystemState},
2325
};
2426
use bevy_image::{BevyDefault, ImageSampler, TextureFormatPixelInfo};
@@ -1507,11 +1509,39 @@ pub fn extract_meshes_for_gpu_building(
15071509
)>,
15081510
>,
15091511
>,
1512+
(
1513+
mut removed_previous_global_transform_query,
1514+
mut removed_lightmap_query,
1515+
mut removed_aabb_query,
1516+
mut removed_mesh_tag_query,
1517+
mut removed_no_frustum_culling_query,
1518+
mut removed_not_shadow_receiver_query,
1519+
mut removed_transmitted_receiver_query,
1520+
mut removed_not_shadow_caster_query,
1521+
mut removed_no_automatic_batching_query,
1522+
mut removed_visibility_range_query,
1523+
mut removed_skinned_mesh_query,
1524+
): (
1525+
Extract<RemovedComponents<PreviousGlobalTransform>>,
1526+
Extract<RemovedComponents<Lightmap>>,
1527+
Extract<RemovedComponents<Aabb>>,
1528+
Extract<RemovedComponents<MeshTag>>,
1529+
Extract<RemovedComponents<NoFrustumCulling>>,
1530+
Extract<RemovedComponents<NotShadowReceiver>>,
1531+
Extract<RemovedComponents<TransmittedShadowReceiver>>,
1532+
Extract<RemovedComponents<NotShadowCaster>>,
1533+
Extract<RemovedComponents<NoAutomaticBatching>>,
1534+
Extract<RemovedComponents<VisibilityRange>>,
1535+
Extract<RemovedComponents<SkinnedMesh>>,
1536+
),
15101537
all_meshes_query: Extract<Query<GpuMeshExtractionQuery>>,
15111538
mut removed_meshes_query: Extract<RemovedComponents<Mesh3d>>,
15121539
gpu_culling_query: Extract<Query<(), (With<Camera>, Without<NoIndirectDrawing>)>>,
15131540
meshes_to_reextract_next_frame: ResMut<MeshesToReextractNextFrame>,
1541+
mut reextract_entities: Local<EntityHashSet>,
15141542
) {
1543+
reextract_entities.clear();
1544+
15151545
let any_gpu_culling = !gpu_culling_query.is_empty();
15161546

15171547
for render_mesh_instance_queue in render_mesh_instance_queues.iter_mut() {
@@ -1549,9 +1579,26 @@ pub fn extract_meshes_for_gpu_building(
15491579
// because the material hadn't yet been loaded. We reextract such materials
15501580
// on subsequent frames so that `collect_meshes_for_gpu_building` will check
15511581
// to see if their materials have been prepared.
1582+
let iters = meshes_to_reextract_next_frame
1583+
.iter()
1584+
.map(|&e| *e)
1585+
.chain(removed_previous_global_transform_query.read())
1586+
.chain(removed_lightmap_query.read())
1587+
.chain(removed_aabb_query.read())
1588+
.chain(removed_mesh_tag_query.read())
1589+
.chain(removed_no_frustum_culling_query.read())
1590+
.chain(removed_not_shadow_receiver_query.read())
1591+
.chain(removed_transmitted_receiver_query.read())
1592+
.chain(removed_not_shadow_caster_query.read())
1593+
.chain(removed_no_automatic_batching_query.read())
1594+
.chain(removed_visibility_range_query.read())
1595+
.chain(removed_skinned_mesh_query.read());
1596+
1597+
reextract_entities.extend_from_iter(iters);
1598+
15521599
let mut queue = render_mesh_instance_queues.borrow_local_mut();
1553-
for &mesh_entity in &**meshes_to_reextract_next_frame {
1554-
if let Ok(query_row) = all_meshes_query.get(*mesh_entity) {
1600+
for entity in &reextract_entities {
1601+
if let Ok(query_row) = all_meshes_query.get(*entity) {
15551602
extract_mesh_for_gpu_building(
15561603
query_row,
15571604
&render_visibility_ranges,

0 commit comments

Comments
 (0)