diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 950d32d6fba18..db3aeee86190e 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -116,79 +116,43 @@ bitflags::bitflags! { pub fn extract_meshes( mut commands: Commands, - mut previous_caster_len: Local, - mut previous_not_caster_len: Local, - caster_query: Query< - ( - Entity, - &ComputedVisibility, - &GlobalTransform, - &Handle, - Option<&NotShadowReceiver>, - ), - Without, - >, - not_caster_query: Query< - ( - Entity, - &ComputedVisibility, - &GlobalTransform, - &Handle, - Option<&NotShadowReceiver>, - ), - With, - >, + mut prev_caster_commands_len: Local, + mut prev_not_caster_commands_len: Local, + meshes_query: Query<( + Entity, + &ComputedVisibility, + &GlobalTransform, + &Handle, + Option>, + Option>, + )>, ) { - let mut caster_values = Vec::with_capacity(*previous_caster_len); - for (entity, computed_visibility, transform, handle, not_receiver) in caster_query.iter() { - if !computed_visibility.is_visible { - continue; - } - let transform = transform.compute_matrix(); - caster_values.push(( - entity, - ( - handle.clone_weak(), - MeshUniform { - flags: if not_receiver.is_some() { - MeshFlags::empty().bits - } else { - MeshFlags::SHADOW_RECEIVER.bits - }, - transform, - inverse_transpose_model: transform.inverse().transpose(), - }, - ), - )); - } - *previous_caster_len = caster_values.len(); - commands.insert_or_spawn_batch(caster_values); + let mut caster_commands = Vec::with_capacity(*prev_caster_commands_len); + let mut not_caster_commands = Vec::with_capacity(*prev_not_caster_commands_len); + let visible_meshes = meshes_query.iter().filter(|(_, vis, ..)| vis.is_visible); - let mut not_caster_values = Vec::with_capacity(*previous_not_caster_len); - for (entity, computed_visibility, transform, mesh, not_receiver) in not_caster_query.iter() { - if !computed_visibility.is_visible { - continue; - } + for (entity, _, transform, handle, not_receiver, not_caster) in visible_meshes { let transform = transform.compute_matrix(); - not_caster_values.push(( - entity, - ( - mesh.clone_weak(), - MeshUniform { - flags: if not_receiver.is_some() { - MeshFlags::empty().bits - } else { - MeshFlags::SHADOW_RECEIVER.bits - }, - transform, - inverse_transpose_model: transform.inverse().transpose(), - }, - NotShadowCaster, - ), - )); + let shadow_receiver_flags = if not_receiver.is_some() { + MeshFlags::empty().bits + } else { + MeshFlags::SHADOW_RECEIVER.bits + }; + let uniform = MeshUniform { + flags: shadow_receiver_flags, + transform, + inverse_transpose_model: transform.inverse().transpose(), + }; + if not_caster.is_some() { + not_caster_commands.push((entity, (handle.clone_weak(), uniform, NotShadowCaster))); + } else { + caster_commands.push((entity, (handle.clone_weak(), uniform))); + } } - *previous_not_caster_len = not_caster_values.len(); - commands.insert_or_spawn_batch(not_caster_values); + *prev_caster_commands_len = caster_commands.len(); + *prev_not_caster_commands_len = not_caster_commands.len(); + commands.insert_or_spawn_batch(caster_commands); + commands.insert_or_spawn_batch(not_caster_commands); } #[derive(Debug, Default)]