mirror of
https://github.com/bevyengine/bevy
synced 2025-01-27 20:35:21 +00:00
c2da7800e3
# Objective The current 2d rendering is specialized to render sprites, we need a generic way to render 2d items, using meshes and materials like we have for 3d. ## Solution I cloned a good part of `bevy_pbr` into `bevy_sprite/src/mesh2d`, removed lighting and pbr itself, adapted it to 2d rendering, added a `ColorMaterial`, and modified the sprite rendering to break batches around 2d meshes. ~~The PR is a bit crude; I tried to change as little as I could in both the parts copied from 3d and the current sprite rendering to make reviewing easier. In the future, I expect we could make the sprite rendering a normal 2d material, cleanly integrated with the rest.~~ _edit: see <https://github.com/bevyengine/bevy/pull/3460#issuecomment-1003605194>_ ## Remaining work - ~~don't require mesh normals~~ _out of scope_ - ~~add an example~~ _done_ - support 2d meshes & materials in the UI? - bikeshed names (I didn't think hard about naming, please check if it's fine) ## Remaining questions - ~~should we add a depth buffer to 2d now that there are 2d meshes?~~ _let's revisit that when we have an opaque render phase_ - ~~should we add MSAA support to the sprites, or remove it from the 2d meshes?~~ _I added MSAA to sprites since it's really needed for 2d meshes_ - ~~how to customize vertex attributes?~~ _#3120_ Co-authored-by: Carter Anderson <mcanders1@gmail.com>
47 lines
1.5 KiB
Rust
47 lines
1.5 KiB
Rust
use crate::{
|
|
texture_atlas::{TextureAtlas, TextureAtlasSprite},
|
|
Sprite,
|
|
};
|
|
use bevy_asset::Handle;
|
|
use bevy_ecs::bundle::Bundle;
|
|
use bevy_render::{
|
|
texture::{Image, DEFAULT_IMAGE_HANDLE},
|
|
view::Visibility,
|
|
};
|
|
use bevy_transform::components::{GlobalTransform, Transform};
|
|
|
|
#[derive(Bundle, Clone)]
|
|
pub struct SpriteBundle {
|
|
pub sprite: Sprite,
|
|
pub transform: Transform,
|
|
pub global_transform: GlobalTransform,
|
|
pub texture: Handle<Image>,
|
|
/// User indication of whether an entity is visible
|
|
pub visibility: Visibility,
|
|
}
|
|
|
|
impl Default for SpriteBundle {
|
|
fn default() -> Self {
|
|
Self {
|
|
sprite: Default::default(),
|
|
transform: Default::default(),
|
|
global_transform: Default::default(),
|
|
texture: DEFAULT_IMAGE_HANDLE.typed(),
|
|
visibility: Default::default(),
|
|
}
|
|
}
|
|
}
|
|
/// A Bundle of components for drawing a single sprite from a sprite sheet (also referred
|
|
/// to as a `TextureAtlas`)
|
|
#[derive(Bundle, Clone, Default)]
|
|
pub struct SpriteSheetBundle {
|
|
/// The specific sprite from the texture atlas to be drawn
|
|
pub sprite: TextureAtlasSprite,
|
|
/// A handle to the texture atlas that holds the sprite images
|
|
pub texture_atlas: Handle<TextureAtlas>,
|
|
/// Data pertaining to how the sprite is drawn on the screen
|
|
pub transform: Transform,
|
|
pub global_transform: GlobalTransform,
|
|
/// User indication of whether an entity is visible
|
|
pub visibility: Visibility,
|
|
}
|