@@ -116,79 +116,43 @@ bitflags::bitflags! {
116116
117117pub fn extract_meshes (
118118 mut commands : Commands ,
119- mut previous_caster_len : Local < usize > ,
120- mut previous_not_caster_len : Local < usize > ,
121- caster_query : Query <
122- (
123- Entity ,
124- & ComputedVisibility ,
125- & GlobalTransform ,
126- & Handle < Mesh > ,
127- Option < & NotShadowReceiver > ,
128- ) ,
129- Without < NotShadowCaster > ,
130- > ,
131- not_caster_query : Query <
132- (
133- Entity ,
134- & ComputedVisibility ,
135- & GlobalTransform ,
136- & Handle < Mesh > ,
137- Option < & NotShadowReceiver > ,
138- ) ,
139- With < NotShadowCaster > ,
140- > ,
119+ mut prev_len_shadow_caster : Local < usize > ,
120+ mut prev_len_not_shadow_caster : Local < usize > ,
121+ meshes_query : Query < (
122+ Entity ,
123+ & ComputedVisibility ,
124+ & GlobalTransform ,
125+ & Handle < Mesh > ,
126+ Option < Without < NotShadowReceiver > > ,
127+ Option < Without < NotShadowCaster > > ,
128+ ) > ,
141129) {
142- let mut caster_values = Vec :: with_capacity ( * previous_caster_len) ;
143- for ( entity, computed_visibility, transform, handle, not_receiver) in caster_query. iter ( ) {
144- if !computed_visibility. is_visible {
145- continue ;
146- }
147- let transform = transform. compute_matrix ( ) ;
148- caster_values. push ( (
149- entity,
150- (
151- handle. clone_weak ( ) ,
152- MeshUniform {
153- flags : if not_receiver. is_some ( ) {
154- MeshFlags :: empty ( ) . bits
155- } else {
156- MeshFlags :: SHADOW_RECEIVER . bits
157- } ,
158- transform,
159- inverse_transpose_model : transform. inverse ( ) . transpose ( ) ,
160- } ,
161- ) ,
162- ) ) ;
163- }
164- * previous_caster_len = caster_values. len ( ) ;
165- commands. insert_or_spawn_batch ( caster_values) ;
130+ let mut caster_commands = Vec :: with_capacity ( * prev_len_shadow_caster) ;
131+ let mut not_caster_commands = Vec :: with_capacity ( * prev_len_not_shadow_caster) ;
132+ let visible_meshes = meshes_query. iter ( ) . filter ( |( _, vis, ..) | vis. is_visible ) ;
166133
167- let mut not_caster_values = Vec :: with_capacity ( * previous_not_caster_len) ;
168- for ( entity, computed_visibility, transform, mesh, not_receiver) in not_caster_query. iter ( ) {
169- if !computed_visibility. is_visible {
170- continue ;
171- }
134+ for ( entity, _, transform, handle, is_receiver, is_caster) in visible_meshes {
172135 let transform = transform. compute_matrix ( ) ;
173- not_caster_values. push ( (
174- entity,
175- (
176- mesh. clone_weak ( ) ,
177- MeshUniform {
178- flags : if not_receiver. is_some ( ) {
179- MeshFlags :: empty ( ) . bits
180- } else {
181- MeshFlags :: SHADOW_RECEIVER . bits
182- } ,
183- transform,
184- inverse_transpose_model : transform. inverse ( ) . transpose ( ) ,
185- } ,
186- NotShadowCaster ,
187- ) ,
188- ) ) ;
136+ let shadow_receiver_flags = if is_receiver. is_some ( ) {
137+ MeshFlags :: SHADOW_RECEIVER . bits
138+ } else {
139+ MeshFlags :: empty ( ) . bits
140+ } ;
141+ let uniform = MeshUniform {
142+ flags : shadow_receiver_flags,
143+ transform,
144+ inverse_transpose_model : transform. inverse ( ) . transpose ( ) ,
145+ } ;
146+ if is_caster. is_some ( ) {
147+ caster_commands. push ( ( entity, ( handle. clone_weak ( ) , uniform) ) ) ;
148+ } else {
149+ not_caster_commands. push ( ( entity, ( handle. clone_weak ( ) , uniform, NotShadowCaster ) ) ) ;
150+ }
189151 }
190- * previous_not_caster_len = not_caster_values. len ( ) ;
191- commands. insert_or_spawn_batch ( not_caster_values) ;
152+ * prev_len_shadow_caster = caster_commands. len ( ) ;
153+ * prev_len_not_shadow_caster = not_caster_commands. len ( ) ;
154+ commands. insert_or_spawn_batch ( caster_commands) ;
155+ commands. insert_or_spawn_batch ( not_caster_commands) ;
192156}
193157
194158#[ derive( Debug , Default ) ]
0 commit comments