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