Skip to main content

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::{TerrainChunkArrayBg, TerrainComputeArrayBg, TerrainRendererGPU}
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, TerrainPassesPlugin, TerrainExtractorPlugin));
22
23        // Extract dirty tiles from Terrain → TerrainRenderer each frame.
24        app.add_systems(Update, TerrainRenderer::extract_dirty);
25
26        // Register the single-instance bind group types (created on demand).
27        app.add_plugins((
28            RenderBindingRegisterPlugin::<TerrainChunkArrayBg>::without_init(),
29            RenderBindingRegisterPlugin::<TerrainComputeArrayBg>::without_init()
30        ));
31
32        // GPU-side systems: upload dirty tiles, then create bind groups if needed.
33        app.get_sub_app_mut(RenderApp)
34            .unwrap()
35            .init_resource::<TerrainRendererGPU>()
36            .add_systems(
37                Render,
38                (
39                    TerrainRendererGPU::upload_dirty,
40                    TerrainRendererGPU::prepare_bind_groups
41                )
42                    .chain()
43                    .in_set(RenderSet::Prepare)
44            );
45    }
46}