# Objective Fixes #17098 It seems that it's not totally obvious how to fix this, but that reverting might be part of the solution anyway. Let's get the repo back into a working state. ## Solution Revert the [recent optimization](https://github.com/bevyengine/bevy/pull/17078) that broke "many-to-one main->render world entities" for 2d. ## Testing `cargo run --example text2d` `cargo run --example sprite_slice`
This commit is contained in:
		
							parent
							
								
									39f38a191e
								
							
						
					
					
						commit
						859c2d77f9
					
				| @ -19,6 +19,7 @@ use bevy_ecs::{ | ||||
| }; | ||||
| use bevy_image::{BevyDefault, Image, ImageSampler, TextureFormatPixelInfo}; | ||||
| use bevy_math::{Affine3A, FloatOrd, Quat, Rect, Vec2, Vec4}; | ||||
| use bevy_render::sync_world::MainEntity; | ||||
| use bevy_render::view::RenderVisibleEntities; | ||||
| use bevy_render::{ | ||||
|     render_asset::RenderAssets, | ||||
| @ -31,7 +32,7 @@ use bevy_render::{ | ||||
|         *, | ||||
|     }, | ||||
|     renderer::{RenderDevice, RenderQueue}, | ||||
|     sync_world::{MainEntityHashMap, RenderEntity, TemporaryRenderEntity}, | ||||
|     sync_world::{RenderEntity, TemporaryRenderEntity}, | ||||
|     texture::{DefaultImageSampler, FallbackImage, GpuImage}, | ||||
|     view::{ | ||||
|         ExtractedView, Msaa, ViewTarget, ViewUniform, ViewUniformOffset, ViewUniforms, | ||||
| @ -340,12 +341,11 @@ pub struct ExtractedSprite { | ||||
|     /// For cases where additional [`ExtractedSprites`] are created during extraction, this stores the
 | ||||
|     /// entity that caused that creation for use in determining visibility.
 | ||||
|     pub original_entity: Option<Entity>, | ||||
|     pub render_entity: Entity, | ||||
| } | ||||
| 
 | ||||
| #[derive(Resource, Default)] | ||||
| pub struct ExtractedSprites { | ||||
|     pub sprites: MainEntityHashMap<ExtractedSprite>, | ||||
|     pub sprites: HashMap<(Entity, MainEntity), ExtractedSprite>, | ||||
| } | ||||
| 
 | ||||
| #[derive(Resource, Default)] | ||||
| @ -390,13 +390,16 @@ pub fn extract_sprites( | ||||
|         if let Some(slices) = slices { | ||||
|             extracted_sprites.sprites.extend( | ||||
|                 slices | ||||
|                     .extract_sprites( | ||||
|                         transform, | ||||
|                         original_entity, | ||||
|                         commands.spawn(TemporaryRenderEntity).id(), | ||||
|                         sprite, | ||||
|                     ) | ||||
|                     .map(|e| (original_entity.into(), e)), | ||||
|                     .extract_sprites(transform, original_entity, sprite) | ||||
|                     .map(|e| { | ||||
|                         ( | ||||
|                             ( | ||||
|                                 commands.spawn(TemporaryRenderEntity).id(), | ||||
|                                 original_entity.into(), | ||||
|                             ), | ||||
|                             e, | ||||
|                         ) | ||||
|                     }), | ||||
|             ); | ||||
|         } else { | ||||
|             let atlas_rect = sprite | ||||
| @ -417,7 +420,7 @@ pub fn extract_sprites( | ||||
| 
 | ||||
|             // PERF: we don't check in this function that the `Image` asset is ready, since it should be in most cases and hashing the handle is expensive
 | ||||
|             extracted_sprites.sprites.insert( | ||||
|                 original_entity.into(), | ||||
|                 (entity, original_entity.into()), | ||||
|                 ExtractedSprite { | ||||
|                     color: sprite.color.into(), | ||||
|                     transform: *transform, | ||||
| @ -429,7 +432,6 @@ pub fn extract_sprites( | ||||
|                     image_handle_id: sprite.image.id(), | ||||
|                     anchor: sprite.anchor.as_vec(), | ||||
|                     original_entity: Some(original_entity), | ||||
|                     render_entity: entity, | ||||
|                 }, | ||||
|             ); | ||||
|         } | ||||
| @ -556,11 +558,8 @@ pub fn queue_sprites( | ||||
|             .items | ||||
|             .reserve(extracted_sprites.sprites.len()); | ||||
| 
 | ||||
|         for (main_entity, extracted_sprite) in extracted_sprites.sprites.iter() { | ||||
|             let index = extracted_sprite | ||||
|                 .original_entity | ||||
|                 .unwrap_or(extracted_sprite.render_entity) | ||||
|                 .index(); | ||||
|         for ((entity, main_entity), extracted_sprite) in extracted_sprites.sprites.iter() { | ||||
|             let index = extracted_sprite.original_entity.unwrap_or(*entity).index(); | ||||
| 
 | ||||
|             if !view_entities.contains(index as usize) { | ||||
|                 continue; | ||||
| @ -573,7 +572,7 @@ pub fn queue_sprites( | ||||
|             transparent_phase.add(Transparent2d { | ||||
|                 draw_function: draw_sprite_function, | ||||
|                 pipeline, | ||||
|                 entity: (extracted_sprite.render_entity, *main_entity), | ||||
|                 entity: (*entity, *main_entity), | ||||
|                 sort_key, | ||||
|                 // batch_range and dynamic_offset will be calculated in prepare_sprites
 | ||||
|                 batch_range: 0..0, | ||||
| @ -663,7 +662,7 @@ pub fn prepare_sprite_image_bind_groups( | ||||
|         // Compatible items share the same entity.
 | ||||
|         for item_index in 0..transparent_phase.items.len() { | ||||
|             let item = &transparent_phase.items[item_index]; | ||||
|             let Some(extracted_sprite) = extracted_sprites.sprites.get(&item.entity.1) else { | ||||
|             let Some(extracted_sprite) = extracted_sprites.sprites.get(&item.entity) else { | ||||
|                 // If there is a phase item that is not a sprite, then we must start a new
 | ||||
|                 // batch to draw the other phase item(s) and to respect draw order. This can be
 | ||||
|                 // done by invalidating the batch_image_handle
 | ||||
|  | ||||
| @ -28,7 +28,6 @@ impl ComputedTextureSlices { | ||||
|         &'a self, | ||||
|         transform: &'a GlobalTransform, | ||||
|         original_entity: Entity, | ||||
|         render_entity: Entity, | ||||
|         sprite: &'a Sprite, | ||||
|     ) -> impl ExactSizeIterator<Item = ExtractedSprite> + 'a { | ||||
|         let mut flip = Vec2::ONE; | ||||
| @ -54,7 +53,6 @@ impl ComputedTextureSlices { | ||||
|                 flip_y, | ||||
|                 image_handle_id: sprite.image.id(), | ||||
|                 anchor: Self::redepend_anchor_from_sprite_to_slice(sprite, slice), | ||||
|                 render_entity, | ||||
|             } | ||||
|         }) | ||||
|     } | ||||
|  | ||||
| @ -206,7 +206,10 @@ pub fn extract_text2d_sprite( | ||||
|             let atlas = texture_atlases.get(&atlas_info.texture_atlas).unwrap(); | ||||
| 
 | ||||
|             extracted_sprites.sprites.insert( | ||||
|                 original_entity.into(), | ||||
|                 ( | ||||
|                     commands.spawn(TemporaryRenderEntity).id(), | ||||
|                     original_entity.into(), | ||||
|                 ), | ||||
|                 ExtractedSprite { | ||||
|                     transform: transform * GlobalTransform::from_translation(position.extend(0.)), | ||||
|                     color, | ||||
| @ -217,7 +220,6 @@ pub fn extract_text2d_sprite( | ||||
|                     flip_y: false, | ||||
|                     anchor: Anchor::Center.as_vec(), | ||||
|                     original_entity: Some(original_entity), | ||||
|                     render_entity: commands.spawn(TemporaryRenderEntity).id(), | ||||
|                 }, | ||||
|             ); | ||||
|         } | ||||
|  | ||||
| @ -13,7 +13,7 @@ use bevy::{ | ||||
|         render_asset::RenderAssetUsages, | ||||
|         render_resource::{Extent3d, TextureDimension, TextureFormat}, | ||||
|     }, | ||||
|     sprite::{AlphaMode2d, SpritePlugin}, | ||||
|     sprite::AlphaMode2d, | ||||
|     utils::Duration, | ||||
|     window::{PresentMode, WindowResolution}, | ||||
|     winit::{UpdateMode, WinitSettings}, | ||||
| @ -132,21 +132,16 @@ fn main() { | ||||
| 
 | ||||
|     App::new() | ||||
|         .add_plugins(( | ||||
|             DefaultPlugins | ||||
|                 .set(WindowPlugin { | ||||
|                     primary_window: Some(Window { | ||||
|                         title: "BevyMark".into(), | ||||
|                         resolution: WindowResolution::new(1920.0, 1080.0) | ||||
|                             .with_scale_factor_override(1.0), | ||||
|                         present_mode: PresentMode::AutoNoVsync, | ||||
|                         ..default() | ||||
|                     }), | ||||
|             DefaultPlugins.set(WindowPlugin { | ||||
|                 primary_window: Some(Window { | ||||
|                     title: "BevyMark".into(), | ||||
|                     resolution: WindowResolution::new(1920.0, 1080.0) | ||||
|                         .with_scale_factor_override(1.0), | ||||
|                     present_mode: PresentMode::AutoNoVsync, | ||||
|                     ..default() | ||||
|                 }) | ||||
|                 .set(SpritePlugin { | ||||
|                     #[cfg(feature = "bevy_sprite_picking_backend")] | ||||
|                     add_picking: false, | ||||
|                 }), | ||||
|                 ..default() | ||||
|             }), | ||||
|             FrameTimeDiagnosticsPlugin, | ||||
|             LogDiagnosticsPlugin::default(), | ||||
|         )) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Rob Parrett
						Rob Parrett