@@ -17,8 +17,10 @@ use bevy_core_pipeline::{
1717use bevy_derive:: { Deref , DerefMut } ;
1818use bevy_diagnostic:: FrameCount ;
1919use bevy_ecs:: {
20+ entity:: EntityHashSet ,
2021 prelude:: * ,
2122 query:: { QueryData , ROQueryItem } ,
23+ relationship:: RelationshipSourceCollection ,
2224 system:: { lifetimeless:: * , SystemParamItem , SystemState } ,
2325} ;
2426use 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