@@ -108,79 +108,42 @@ bitflags::bitflags! {
108
108
109
109
pub fn extract_meshes (
110
110
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
+ ) > ,
133
121
) {
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 {
139
126
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 ) ) ) ;
163
141
}
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
- ) ) ;
181
142
}
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) ;
184
147
}
185
148
186
149
#[ derive( Debug , Default ) ]
0 commit comments