@@ -159,36 +159,32 @@ struct InstanceBuffer {
159159fn prepare_instance_buffers (
160160 mut commands : Commands ,
161161 query : Query < ( Entity , & InstanceMaterialData ) > ,
162- cameras : Query < & ExtractedView > ,
163162 render_device : Res < RenderDevice > ,
163+ views : Query < & GlobalTransform , With < Camera > > ,
164164) {
165- let Some ( camera) = cameras. iter ( ) . next ( ) else {
166- return ;
167- } ;
168- let cam_pos = camera. world_from_view . transform_point ( Vec3 :: ZERO ) ;
165+ // Get the first camera's position, or use a default if none exist
166+ let camera_pos = views
167+ . iter ( )
168+ . next ( )
169+ . map ( |transform| transform. translation ( ) )
170+ . unwrap_or ( Vec3 :: ZERO ) ;
169171
170172 for ( entity, instance_data) in & query {
171- let mut sorted_instances = instance_data. instances . clone ( ) ;
172-
173- if sorted_instances. is_empty ( ) {
173+ if instance_data. instances . is_empty ( ) {
174174 commands. entity ( entity) . remove :: < InstanceBuffer > ( ) ;
175175 continue ;
176176 }
177177
178- // Sort back-to-front for proper alpha blending
178+ // Sort back-to-front by distance from camera
179+ let mut sorted_instances = instance_data. instances . clone ( ) ;
179180 sorted_instances. sort_by ( |a, b| {
180- let a_pos = Vec3 :: new ( a. pos_scale [ 0 ] , a. pos_scale [ 1 ] , a. pos_scale [ 2 ] ) ;
181- let b_pos = Vec3 :: new ( b. pos_scale [ 0 ] , b. pos_scale [ 1 ] , b. pos_scale [ 2 ] ) ;
182- let a_dist = cam_pos. distance_squared ( a_pos) ;
183- let b_dist = cam_pos. distance_squared ( b_pos) ;
184-
185- b_dist
186- . partial_cmp ( & a_dist)
187- . unwrap_or ( std:: cmp:: Ordering :: Equal )
181+ let dist_a = camera_pos. distance_squared ( Vec3 :: from_slice ( & a. pos_scale [ 0 ..3 ] ) ) ;
182+ let dist_b = camera_pos. distance_squared ( Vec3 :: from_slice ( & b. pos_scale [ 0 ..3 ] ) ) ;
183+ dist_b. partial_cmp ( & dist_a) . unwrap_or ( std:: cmp:: Ordering :: Equal )
188184 } ) ;
189185
190186 let buffer = render_device. create_buffer_with_data ( & BufferInitDescriptor {
191- label : Some ( "sorted instance data buffer" ) ,
187+ label : Some ( "instance data buffer" ) ,
192188 contents : bytemuck:: cast_slice ( sorted_instances. as_slice ( ) ) ,
193189 usage : BufferUsages :: VERTEX | BufferUsages :: COPY_DST ,
194190 } ) ;
@@ -200,6 +196,7 @@ fn prepare_instance_buffers(
200196 }
201197}
202198
199+
203200/// Custom pipeline for instanced mesh rendering.
204201#[ derive( Resource ) ]
205202struct CustomPipeline {
0 commit comments