wde_terrain/render/
mod.rs

1use bevy::prelude::*;
2use wde_renderer::prelude::*;
3
4use crate::render::{
5    dependencies::BuffersPlugin,
6    extractor::TerrainExtractorPlugin,
7    passes::TerrainPassesPlugin,
8    renderer::TerrainRenderer,
9    renderer_gpu::{TerrainRendererGPU, TerrainTileBgCompute, TerrainTileBgRender}
10};
11
12pub mod dependencies;
13pub mod extractor;
14mod passes;
15pub mod renderer;
16pub mod renderer_gpu;
17
18pub struct TerrainRenderPlugin;
19impl Plugin for TerrainRenderPlugin {
20    fn build(&self, app: &mut App) {
21        app.add_plugins(BuffersPlugin)
22            .add_plugins(TerrainPassesPlugin)
23            .add_plugins(TerrainExtractorPlugin);
24
25        // Add the terrain renderer resource and its systems
26        // Note that using Update, the dirty tiles will be extracted to the GPU renderer resource one frame after they are marked as dirty. This is to ensure that the main world is not locked for too long while the GPU renderer resource is being updated.
27        app.add_systems(Update, TerrainRenderer::extract_dirty);
28        app.init_asset::<TerrainTileBgRender>()
29            .init_asset::<TerrainTileBgCompute>()
30            .add_plugins((
31                RenderBindingRegisterPlugin::<TerrainTileBgRender>::default(),
32                RenderBindingRegisterPlugin::<TerrainTileBgCompute>::default()
33            ));
34
35        // Add the terrain renderer GPU resource and its systems
36        app.get_sub_app_mut(RenderApp)
37            .unwrap()
38            .init_resource::<TerrainRendererGPU>()
39            .add_systems(
40                Render,
41                (TerrainRendererGPU::upload_dirty, TerrainRendererGPU::prepare_bind_groups).chain().in_set(RenderSet::Prepare)
42            );
43    }
44}