Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_sprite_render/src/lib.rs
6598 views
1
#![expect(missing_docs, reason = "Not all docs are written yet, see #3492.")]
2
#![cfg_attr(docsrs, feature(doc_auto_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
11
extern crate alloc;
12
13
mod mesh2d;
14
mod render;
15
#[cfg(feature = "bevy_text")]
16
mod text2d;
17
mod texture_slice;
18
mod tilemap_chunk;
19
20
/// The sprite prelude.
21
///
22
/// This includes the most common types in this crate, re-exported for your convenience.
23
pub mod prelude {
24
#[doc(hidden)]
25
pub use crate::{ColorMaterial, MeshMaterial2d};
26
}
27
28
use bevy_shader::load_shader_library;
29
pub use mesh2d::*;
30
pub use render::*;
31
pub(crate) use texture_slice::*;
32
pub use tilemap_chunk::*;
33
34
use bevy_app::prelude::*;
35
use bevy_asset::{embedded_asset, AssetEventSystems};
36
use bevy_core_pipeline::core_2d::{AlphaMask2d, Opaque2d, Transparent2d};
37
use bevy_ecs::prelude::*;
38
use bevy_image::{prelude::*, TextureAtlasPlugin};
39
use bevy_mesh::Mesh2d;
40
use 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
};
45
use bevy_sprite::Sprite;
46
47
#[cfg(feature = "bevy_text")]
48
use crate::text2d::extract_text2d_sprite;
49
50
/// Adds support for 2D sprite rendering.
51
#[derive(Default)]
52
pub struct SpriteRenderPlugin;
53
54
/// System set for sprite rendering.
55
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
56
pub enum SpriteSystems {
57
ExtractSprites,
58
ComputeSlices,
59
}
60
61
/// Deprecated alias for [`SpriteSystems`].
62
#[deprecated(since = "0.17.0", note = "Renamed to `SpriteSystems`.")]
63
pub type SpriteSystem = SpriteSystems;
64
65
impl 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
}
127
128