@@ -116,79 +116,43 @@ bitflags::bitflags! {
116
116
117
117
pub fn extract_meshes (
118
118
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
+ ) > ,
141
129
) {
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 ) ;
166
133
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 {
172
135
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
+ }
189
151
}
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) ;
192
156
}
193
157
194
158
#[ derive( Debug , Default ) ]
0 commit comments