@@ -108,79 +108,42 @@ bitflags::bitflags! {
108108
109109pub fn extract_meshes (
110110 mut commands : Commands ,
111- mut previous_caster_len : Local < usize > ,
112- mut previous_not_caster_len : Local < usize > ,
113- caster_query : Query <
114- (
115- Entity ,
116- & ComputedVisibility ,
117- & GlobalTransform ,
118- & Handle < Mesh > ,
119- Option < & NotShadowReceiver > ,
120- ) ,
121- Without < NotShadowCaster > ,
122- > ,
123- not_caster_query : Query <
124- (
125- Entity ,
126- & ComputedVisibility ,
127- & GlobalTransform ,
128- & Handle < Mesh > ,
129- Option < & NotShadowReceiver > ,
130- ) ,
131- With < NotShadowCaster > ,
132- > ,
111+ mut prev_len_shadow_caster : Local < usize > ,
112+ mut prev_len_not_shadow_caster : Local < usize > ,
113+ meshes_query : Query < (
114+ Entity ,
115+ & ComputedVisibility ,
116+ & GlobalTransform ,
117+ & Handle < Mesh > ,
118+ Option < Without < NotShadowReceiver > > ,
119+ Option < Without < NotShadowCaster > > ,
120+ ) > ,
133121) {
134- let mut caster_values = Vec :: with_capacity ( * previous_caster_len) ;
135- for ( entity, computed_visibility, transform, handle, not_receiver) in caster_query. iter ( ) {
136- if !computed_visibility. is_visible {
137- continue ;
138- }
122+ let mut caster_commands = Vec :: with_capacity ( * prev_len_shadow_caster) ;
123+ let mut not_caster_commands = Vec :: with_capacity ( * prev_len_not_shadow_caster) ;
124+ let visible_meshes = meshes_query. iter ( ) . filter ( |( _, vis, ..) | vis. is_visible ) ;
125+ for ( entity, _, transform, handle, is_receiver, is_caster) in visible_meshes {
139126 let transform = transform. compute_matrix ( ) ;
140- caster_values. push ( (
141- entity,
142- (
143- handle. clone_weak ( ) ,
144- MeshUniform {
145- flags : if not_receiver. is_some ( ) {
146- MeshFlags :: empty ( ) . bits
147- } else {
148- MeshFlags :: SHADOW_RECEIVER . bits
149- } ,
150- transform,
151- inverse_transpose_model : transform. inverse ( ) . transpose ( ) ,
152- } ,
153- ) ,
154- ) ) ;
155- }
156- * previous_caster_len = caster_values. len ( ) ;
157- commands. insert_or_spawn_batch ( caster_values) ;
158-
159- let mut not_caster_values = Vec :: with_capacity ( * previous_not_caster_len) ;
160- for ( entity, computed_visibility, transform, mesh, not_receiver) in not_caster_query. iter ( ) {
161- if !computed_visibility. is_visible {
162- continue ;
127+ let shadow_receiver_flags = if is_receiver. is_some ( ) {
128+ MeshFlags :: SHADOW_RECEIVER . bits
129+ } else {
130+ MeshFlags :: empty ( ) . bits
131+ } ;
132+ let uniform = MeshUniform {
133+ flags : shadow_receiver_flags,
134+ transform,
135+ inverse_transpose_model : transform. inverse ( ) . transpose ( ) ,
136+ } ;
137+ if is_caster. is_some ( ) {
138+ caster_commands. push ( ( entity, ( handle. clone_weak ( ) , uniform) ) ) ;
139+ } else {
140+ not_caster_commands. push ( ( entity, ( handle. clone_weak ( ) , uniform, NotShadowCaster ) ) ) ;
163141 }
164- let transform = transform. compute_matrix ( ) ;
165- not_caster_values. push ( (
166- entity,
167- (
168- mesh. clone_weak ( ) ,
169- MeshUniform {
170- flags : if not_receiver. is_some ( ) {
171- MeshFlags :: empty ( ) . bits
172- } else {
173- MeshFlags :: SHADOW_RECEIVER . bits
174- } ,
175- transform,
176- inverse_transpose_model : transform. inverse ( ) . transpose ( ) ,
177- } ,
178- NotShadowCaster ,
179- ) ,
180- ) ) ;
181142 }
182- * previous_not_caster_len = not_caster_values. len ( ) ;
183- commands. insert_or_spawn_batch ( not_caster_values) ;
143+ * prev_len_shadow_caster = caster_commands. len ( ) ;
144+ * prev_len_not_shadow_caster = not_caster_commands. len ( ) ;
145+ commands. insert_or_spawn_batch ( caster_commands) ;
146+ commands. insert_or_spawn_batch ( not_caster_commands) ;
184147}
185148
186149#[ derive( Debug , Default ) ]
0 commit comments