#![expect(missing_docs, reason = "Not all docs are written yet, see #3492.")]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![forbid(unsafe_code)]
#![doc(
html_logo_url = "https://bevy.org/assets/icon.png",
html_favicon_url = "https://bevy.org/assets/icon.png"
)]
extern crate alloc;
mod mesh2d;
mod render;
mod sprite_mesh;
#[cfg(feature = "bevy_text")]
mod text2d;
mod tilemap_chunk;
pub mod prelude {
#[doc(hidden)]
pub use crate::{
ColorMaterial, ExtendedMaterial2d, MaterialExtension2d, MeshMaterial2d, SpriteMaterial,
SpriteMaterialPlugin, SpriteMeshMaterial,
};
}
use bevy_shader::load_shader_library;
pub use mesh2d::*;
pub use render::*;
pub use sprite_mesh::*;
pub use tilemap_chunk::*;
use bevy_app::prelude::*;
use bevy_asset::embedded_asset;
use bevy_core_pipeline::core_2d::{AlphaMask2d, Opaque2d, Transparent2d};
use bevy_ecs::prelude::*;
use bevy_image::TextureAtlasPlugin;
use bevy_mesh::Mesh2d;
use bevy_render::{
batching::sort_binned_render_phase, render_phase::AddRenderCommand,
render_resource::SpecializedRenderPipelines, sync_world::SyncToRenderWorld, ExtractSchedule,
GpuResourceAppExt, Render, RenderApp, RenderStartup, RenderSystems,
};
use bevy_sprite::Sprite;
#[cfg(feature = "bevy_text")]
pub use crate::text2d::extract_text2d_sprite;
#[derive(Default)]
pub struct SpriteRenderPlugin;
impl Plugin for SpriteRenderPlugin {
fn build(&self, app: &mut App) {
load_shader_library!(app, "render/sprite_view_bindings.wesl");
embedded_asset!(app, "render/sprite.wesl");
if !app.is_plugin_added::<TextureAtlasPlugin>() {
app.add_plugins(TextureAtlasPlugin);
}
app.add_plugins((
Mesh2dRenderPlugin,
Materials2dPlugin,
ColorMaterialPlugin,
SpriteMeshPlugin,
TilemapChunkPlugin,
TilemapChunkMaterialPlugin,
));
app.register_required_components::<Sprite, SyncToRenderWorld>();
if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
render_app
.init_resource::<ImageBindGroups>()
.init_gpu_resource::<SpecializedRenderPipelines<SpritePipeline>>()
.init_resource::<SpriteMeta>()
.init_resource::<ExtractedSprites>()
.init_resource::<ExtractedSlices>()
.init_resource::<SpriteAssetEvents>()
.init_resource::<SpriteBatches>()
.add_render_command::<Transparent2d, DrawSprite>()
.add_systems(RenderStartup, init_sprite_pipeline)
.add_systems(
ExtractSchedule,
(
extract_sprite_events,
#[cfg(feature = "bevy_text")]
extract_text2d_sprite,
),
)
.add_systems(
Render,
(
queue_sprites
.in_set(RenderSystems::Queue)
.ambiguous_with(queue_material2d_meshes),
prepare_sprite_image_bind_groups.in_set(RenderSystems::PrepareBindGroups),
prepare_sprite_view_bind_groups.in_set(RenderSystems::PrepareBindGroups),
sort_binned_render_phase::<Opaque2d>.in_set(RenderSystems::PhaseSort),
sort_binned_render_phase::<AlphaMask2d>.in_set(RenderSystems::PhaseSort),
),
);
};
}
}