bevy_entitiles/render/
mod.rs

1use bevy::{
2    app::{App, PostUpdate, Update},
3    asset::load_internal_asset,
4    ecs::schedule::IntoSystemConfigs,
5    prelude::{Handle, Plugin, Shader},
6    render::{
7        extract_instances::ExtractInstancesPlugin, mesh::MeshVertexAttribute,
8        render_asset::RenderAssetPlugin, render_resource::VertexFormat, view::VisibilitySystems,
9        ExtractSchedule, Render, RenderApp, RenderSet,
10    },
11};
12
13use crate::{
14    render::{
15        buffer::TilemapBuffers,
16        chunk::{ChunkUnload, RenderChunkSort, RenderChunkStorage, UnloadRenderChunk},
17        cull::FrustumCulling,
18        extract::ExtractedTilemap,
19        texture::TilemapTexturesStorage,
20    },
21    tilemap::map::TilemapTextures,
22};
23
24#[cfg(feature = "baking")]
25pub mod bake;
26pub mod binding;
27pub mod buffer;
28pub mod chunk;
29pub mod cull;
30pub mod draw;
31pub mod extract;
32pub mod material;
33pub mod pipeline;
34pub mod prepare;
35pub mod queue;
36pub mod texture;
37
38pub const SQUARE: Handle<Shader> = Handle::weak_from_u128(54311635145631);
39pub const ISOMETRIC: Handle<Shader> = Handle::weak_from_u128(45522415151365135);
40pub const HEXAGONAL: Handle<Shader> = Handle::weak_from_u128(341658413214563135);
41pub const COMMON: Handle<Shader> = Handle::weak_from_u128(1321023135616351);
42pub const TILEMAP_SHADER: Handle<Shader> = Handle::weak_from_u128(89646584153215);
43
44pub const TILEMAP_MESH_ATTR_INDEX: MeshVertexAttribute =
45    MeshVertexAttribute::new("GridIndex", 51541631, VertexFormat::Sint32x4);
46pub const TILEMAP_MESH_ATTR_COLOR: MeshVertexAttribute =
47    MeshVertexAttribute::new("Color", 51541632, VertexFormat::Float32x4);
48pub const TILEMAP_MESH_ATTR_ATLAS_INDICES: MeshVertexAttribute =
49    MeshVertexAttribute::new("AtlasIndex", 51541633, VertexFormat::Sint32x4);
50#[cfg(feature = "atlas")]
51pub const TILEMAP_MESH_ATTR_TEX_INDICES: MeshVertexAttribute =
52    MeshVertexAttribute::new("TextureIndex", 51541634, VertexFormat::Sint32x4);
53
54#[derive(Default)]
55pub struct EntiTilesRendererPlugin;
56
57impl Plugin for EntiTilesRendererPlugin {
58    fn build(&self, app: &mut App) {
59        load_internal_asset!(app, SQUARE, "shaders/square.wgsl", Shader::from_wgsl);
60        load_internal_asset!(app, ISOMETRIC, "shaders/isometric.wgsl", Shader::from_wgsl);
61        load_internal_asset!(app, HEXAGONAL, "shaders/hexagonal.wgsl", Shader::from_wgsl);
62        load_internal_asset!(app, COMMON, "shaders/common.wgsl", Shader::from_wgsl);
63
64        load_internal_asset!(
65            app,
66            TILEMAP_SHADER,
67            "shaders/tilemap.wgsl",
68            Shader::from_wgsl
69        );
70
71        app.add_systems(
72            Update,
73            (
74                texture::set_texture_usage,
75                #[cfg(feature = "baking")]
76                bake::tilemap_baker,
77            ),
78        )
79        .add_systems(
80            PostUpdate,
81            cull::cull_tilemaps
82                .in_set(VisibilitySystems::CheckVisibility)
83                .after(bevy::render::view::check_visibility::<()>),
84        )
85        .init_resource::<FrustumCulling>()
86        .init_resource::<RenderChunkSort>()
87        .register_type::<UnloadRenderChunk>()
88        .add_event::<ChunkUnload>()
89        .add_plugins((
90            RenderAssetPlugin::<TilemapTextures>::default(),
91            ExtractInstancesPlugin::<ExtractedTilemap>::new(),
92        ));
93
94        #[cfg(feature = "baking")]
95        {
96            use bake::{BakedTilemap, TilemapBaker};
97
98            app.register_type::<TilemapBaker>()
99                .register_type::<BakedTilemap>();
100        }
101
102        let render_app = app.sub_app_mut(RenderApp);
103
104        render_app
105            .add_systems(
106                ExtractSchedule,
107                (
108                    extract::extract_tiles,
109                    extract::extract_view,
110                    extract::extract_unloaded_chunks,
111                    extract::extract_resources,
112                    extract::extract_despawned_tilemaps,
113                    extract::extract_despawned_tiles,
114                ),
115            )
116            .add_systems(
117                Render,
118                (
119                    texture::schedule_tilemap_texture_preparation,
120                    texture::prepare_tilemap_textures,
121                    texture::queue_tilemap_textures,
122                    buffer::prepare_tilemap_buffers,
123                    cull::cull_chunks,
124                )
125                    .chain()
126                    .in_set(RenderSet::PrepareResources),
127            )
128            .init_resource::<RenderChunkSort>()
129            .init_resource::<RenderChunkStorage>()
130            .init_resource::<TilemapTexturesStorage>()
131            .init_resource::<TilemapBuffers>();
132    }
133}