Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_sprite_render/src/lib.rs
9351 views
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
11
extern crate alloc;
12
13
mod mesh2d;
14
mod render;
15
mod sprite_mesh;
16
#[cfg(feature = "bevy_text")]
17
mod text2d;
18
mod texture_slice;
19
mod tilemap_chunk;
20
21
/// The sprite prelude.
22
///
23
/// This includes the most common types in this crate, re-exported for your convenience.
24
pub mod prelude {
25
#[doc(hidden)]
26
pub use crate::{ColorMaterial, MeshMaterial2d, SpriteMaterial};
27
}
28
29
use bevy_shader::load_shader_library;
30
pub use mesh2d::*;
31
pub use render::*;
32
pub use sprite_mesh::*;
33
pub(crate) use texture_slice::*;
34
pub use tilemap_chunk::*;
35
36
use bevy_app::prelude::*;
37
use bevy_asset::{embedded_asset, AssetEventSystems};
38
use bevy_core_pipeline::core_2d::{AlphaMask2d, Opaque2d, Transparent2d};
39
use bevy_ecs::prelude::*;
40
use bevy_image::{prelude::*, TextureAtlasPlugin};
41
use bevy_mesh::Mesh2d;
42
use bevy_render::{
43
batching::sort_binned_render_phase, render_phase::AddRenderCommand,
44
render_resource::SpecializedRenderPipelines, sync_world::SyncToRenderWorld, ExtractSchedule,
45
Render, RenderApp, RenderStartup, RenderSystems,
46
};
47
use bevy_sprite::Sprite;
48
49
#[cfg(feature = "bevy_text")]
50
pub use crate::text2d::extract_text2d_sprite;
51
52
/// Adds support for 2D sprite rendering.
53
#[derive(Default)]
54
pub struct SpriteRenderPlugin;
55
56
/// System set for sprite rendering.
57
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
58
pub enum SpriteSystems {
59
ExtractSprites,
60
ComputeSlices,
61
}
62
63
impl Plugin for SpriteRenderPlugin {
64
fn build(&self, app: &mut App) {
65
load_shader_library!(app, "render/sprite_view_bindings.wgsl");
66
67
embedded_asset!(app, "render/sprite.wgsl");
68
69
if !app.is_plugin_added::<TextureAtlasPlugin>() {
70
app.add_plugins(TextureAtlasPlugin);
71
}
72
73
app.add_plugins((
74
Mesh2dRenderPlugin,
75
ColorMaterialPlugin,
76
SpriteMeshPlugin,
77
TilemapChunkPlugin,
78
TilemapChunkMaterialPlugin,
79
))
80
.add_systems(
81
PostUpdate,
82
(
83
compute_slices_on_asset_event.before(AssetEventSystems),
84
compute_slices_on_sprite_change,
85
)
86
.in_set(SpriteSystems::ComputeSlices),
87
);
88
89
app.register_required_components::<Sprite, SyncToRenderWorld>();
90
91
if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
92
render_app
93
.init_resource::<ImageBindGroups>()
94
.init_resource::<SpecializedRenderPipelines<SpritePipeline>>()
95
.init_resource::<SpriteMeta>()
96
.init_resource::<ExtractedSprites>()
97
.init_resource::<ExtractedSlices>()
98
.init_resource::<SpriteAssetEvents>()
99
.init_resource::<SpriteBatches>()
100
.add_render_command::<Transparent2d, DrawSprite>()
101
.add_systems(RenderStartup, init_sprite_pipeline)
102
.add_systems(
103
ExtractSchedule,
104
(
105
extract_sprites.in_set(SpriteSystems::ExtractSprites),
106
extract_sprite_events,
107
#[cfg(feature = "bevy_text")]
108
extract_text2d_sprite.after(SpriteSystems::ExtractSprites),
109
),
110
)
111
.add_systems(
112
Render,
113
(
114
queue_sprites
115
.in_set(RenderSystems::Queue)
116
.ambiguous_with(queue_material2d_meshes::<ColorMaterial>),
117
prepare_sprite_image_bind_groups.in_set(RenderSystems::PrepareBindGroups),
118
prepare_sprite_view_bind_groups.in_set(RenderSystems::PrepareBindGroups),
119
sort_binned_render_phase::<Opaque2d>.in_set(RenderSystems::PhaseSort),
120
sort_binned_render_phase::<AlphaMask2d>.in_set(RenderSystems::PhaseSort),
121
),
122
);
123
};
124
}
125
}
126
127