# Bundles ## `SpriteBundle` ```rust pub struct SpriteBundle { /// Specifies the rendering properties of the sprite, such as color tint and flip. pub sprite: Sprite, /// The local transform of the sprite, relative to its parent. pub transform: Transform, /// The absolute transform of the sprite. This should generally not be written to directly. pub global_transform: GlobalTransform, /// A reference-counted handle to the image asset to be drawn. pub texture: Handle<Image>, /// User indication of whether an entity is visible pub visibility: Visibility, /// Inherited visibility of an entity. pub inherited_visibility: InheritedVisibility, /// Algorithmically-computed indication of whether an entity is visible and should be extracted for rendering pub view_visibility: ViewVisibility, } // Intended to be used in combination with a TextureAtlas component to use a "sprite sheet" #[derive(Component)] pub struct TextureAtlas { /// Texture atlas layout handle pub layout: Handle<TextureAtlasLayout>, /// Texture atlas section index pub index: usize, } // We should think about if / how TextureAtlas and Handle<Image> will relate to each other in the event // that we use a wrapper component for Handle<Image>. Should we merge Handle<Image> into Sprite? ``` ### Proposal 1 (Selected) ```rust #[derive(Component)] #[require(Transform, Visibility)] pub struct Sprite { /// Handle of the sprite to render, or the atlas image if `atlas` is some. image: Handle<Image>, /// Optional texture atlas information atlas: Option<TextureAtlas>, ... } pub struct TextureAtlas { /// Texture atlas layout handle pub layout: Handle<TextureAtlasLayout>, /// Texture atlas section index pub index: usize, } ``` Simplest to just smush them together? ### Proposal 2 ```rust #[derive(Component)] #[require(Sprite)] pub struct ImageSprite { pub image: Handle<Image>, } #[derive(Component)] #[require(Sprite)] pub struct AtlasSprite { pub image: Handle<Image>, pub layout: Handle<TextureAtlasLayout>, pub index: usize, } #[derive(Component)] #[require(Transform, Visibility)] pub struct Sprite; ``` We could also pull the common sprite data out into it's own component. ### Proposal 3 ```rust #[derive(Component)] #[require(Transform, Visibility)] pub struct Sprite { /// Handle of the sprite to render, or the atlas image if `atlas` is some. image: Handle<Image>, // other sprite fields here } #[derive(Component)] #[require(Sprite)] pub struct AtlasSprite { /// Texture atlas layout handle pub layout: Handle<TextureAtlasLayout>, /// Texture atlas section index pub index: usize, } ```