bevy_sprite_render/
lib.rs

1#![expect(missing_docs, reason = "Not all docs are written yet, see #3492.")]
2#![cfg_attr(docsrs, feature(doc_cfg))]
3#![forbid(unsafe_code)]
4#![doc(
5    html_logo_url = "https://bevy.org/assets/icon.png",
6    html_favicon_url = "https://bevy.org/assets/icon.png"
7)]
8
9//! Provides 2D sprite rendering functionality.
10
11extern crate alloc;
12
13mod mesh2d;
14mod render;
15#[cfg(feature = "bevy_text")]
16mod text2d;
17mod texture_slice;
18mod tilemap_chunk;
19
20/// The sprite prelude.
21///
22/// This includes the most common types in this crate, re-exported for your convenience.
23pub mod prelude {
24    #[doc(hidden)]
25    pub use crate::{ColorMaterial, MeshMaterial2d};
26}
27
28use bevy_shader::load_shader_library;
29pub use mesh2d::*;
30pub use render::*;
31pub(crate) use texture_slice::*;
32pub use tilemap_chunk::*;
33
34use bevy_app::prelude::*;
35use bevy_asset::{embedded_asset, AssetEventSystems};
36use bevy_core_pipeline::core_2d::{AlphaMask2d, Opaque2d, Transparent2d};
37use bevy_ecs::prelude::*;
38use bevy_image::{prelude::*, TextureAtlasPlugin};
39use bevy_mesh::Mesh2d;
40use bevy_render::{
41    batching::sort_binned_render_phase, render_phase::AddRenderCommand,
42    render_resource::SpecializedRenderPipelines, sync_world::SyncToRenderWorld, ExtractSchedule,
43    Render, RenderApp, RenderStartup, RenderSystems,
44};
45use bevy_sprite::Sprite;
46
47#[cfg(feature = "bevy_text")]
48pub use crate::text2d::extract_text2d_sprite;
49
50/// Adds support for 2D sprite rendering.
51#[derive(Default)]
52pub struct SpriteRenderPlugin;
53
54/// System set for sprite rendering.
55#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
56pub enum SpriteSystems {
57    ExtractSprites,
58    ComputeSlices,
59}
60
61/// Deprecated alias for [`SpriteSystems`].
62#[deprecated(since = "0.17.0", note = "Renamed to `SpriteSystems`.")]
63pub type SpriteSystem = SpriteSystems;
64
65impl Plugin for SpriteRenderPlugin {
66    fn build(&self, app: &mut App) {
67        load_shader_library!(app, "render/sprite_view_bindings.wgsl");
68
69        embedded_asset!(app, "render/sprite.wgsl");
70
71        if !app.is_plugin_added::<TextureAtlasPlugin>() {
72            app.add_plugins(TextureAtlasPlugin);
73        }
74
75        app.add_plugins((
76            Mesh2dRenderPlugin,
77            ColorMaterialPlugin,
78            TilemapChunkPlugin,
79            TilemapChunkMaterialPlugin,
80        ))
81        .add_systems(
82            PostUpdate,
83            (
84                compute_slices_on_asset_event.before(AssetEventSystems),
85                compute_slices_on_sprite_change,
86            )
87                .in_set(SpriteSystems::ComputeSlices),
88        );
89
90        app.register_required_components::<Sprite, SyncToRenderWorld>();
91
92        if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
93            render_app
94                .init_resource::<ImageBindGroups>()
95                .init_resource::<SpecializedRenderPipelines<SpritePipeline>>()
96                .init_resource::<SpriteMeta>()
97                .init_resource::<ExtractedSprites>()
98                .init_resource::<ExtractedSlices>()
99                .init_resource::<SpriteAssetEvents>()
100                .init_resource::<SpriteBatches>()
101                .add_render_command::<Transparent2d, DrawSprite>()
102                .add_systems(RenderStartup, init_sprite_pipeline)
103                .add_systems(
104                    ExtractSchedule,
105                    (
106                        extract_sprites.in_set(SpriteSystems::ExtractSprites),
107                        extract_sprite_events,
108                        #[cfg(feature = "bevy_text")]
109                        extract_text2d_sprite.after(SpriteSystems::ExtractSprites),
110                    ),
111                )
112                .add_systems(
113                    Render,
114                    (
115                        queue_sprites
116                            .in_set(RenderSystems::Queue)
117                            .ambiguous_with(queue_material2d_meshes::<ColorMaterial>),
118                        prepare_sprite_image_bind_groups.in_set(RenderSystems::PrepareBindGroups),
119                        prepare_sprite_view_bind_groups.in_set(RenderSystems::PrepareBindGroups),
120                        sort_binned_render_phase::<Opaque2d>.in_set(RenderSystems::PhaseSort),
121                        sort_binned_render_phase::<AlphaMask2d>.in_set(RenderSystems::PhaseSort),
122                    ),
123                );
124        };
125    }
126}