Skip to main content

bevy_aabb_instancing/vertex_pulling/
plugin.rs

1use super::buffers::*;
2use super::cuboid_cache::CuboidBufferCache;
3use super::draw::{AuxiliaryMeta, DrawCuboids, TransformsMeta, ViewMeta};
4use super::extract::{extract_clipping_planes, extract_cuboids};
5use super::pipeline::{CuboidsPipelines, CuboidsShaderDefs, VERTEX_PULLING_SHADER_HANDLE};
6use super::prepare::{
7    prepare_auxiliary_bind_group, prepare_clipping_planes, prepare_cuboid_transforms,
8    prepare_cuboids, prepare_cuboids_view_bind_group, prepare_materials,
9};
10use super::queue::queue_cuboids;
11use crate::CuboidMaterialMap;
12use bevy::asset::load_internal_asset;
13use bevy::core_pipeline::core_3d::Opaque3d;
14use bevy::prelude::*;
15use bevy::render::view::prepare_view_uniforms;
16use bevy::render::{render_phase::AddRenderCommand, RenderApp};
17use bevy::render::{Render, RenderSet};
18
19/// Renders the [`Cuboids`](crate::Cuboids) component using the "vertex pulling" technique.
20#[derive(Default)]
21pub struct VertexPullingRenderPlugin {
22    pub outlines: bool,
23}
24
25impl Plugin for VertexPullingRenderPlugin {
26    fn build(&self, app: &mut App) {
27        app.init_resource::<CuboidMaterialMap>();
28
29        load_internal_asset!(
30            app,
31            VERTEX_PULLING_SHADER_HANDLE,
32            "vertex_pulling.wgsl",
33            Shader::from_wgsl
34        );
35        {
36            use super::index_buffer::{CuboidsIndexBuffer, CUBE_INDICES_HANDLE};
37            use bevy::render::render_asset::RenderAssetPlugin;
38            app.init_asset::<CuboidsIndexBuffer>()
39                .add_plugins(RenderAssetPlugin::<CuboidsIndexBuffer>::default());
40            app.world
41                .resource_mut::<Assets<CuboidsIndexBuffer>>()
42                .insert(CUBE_INDICES_HANDLE, CuboidsIndexBuffer);
43        }
44    }
45
46    fn finish(&self, app: &mut App) {
47        let maybe_msaa = app.world.get_resource::<Msaa>().cloned();
48        let render_app = app.sub_app_mut(RenderApp);
49
50        if let Some(msaa) = maybe_msaa {
51            render_app.insert_resource(msaa);
52        }
53        let mut shader_defs = CuboidsShaderDefs::default();
54        if self.outlines {
55            shader_defs.enable_outlines();
56        }
57        render_app.insert_resource(shader_defs);
58
59        render_app
60            .add_render_command::<Opaque3d, DrawCuboids>()
61            .init_resource::<AuxiliaryMeta>()
62            .init_resource::<CuboidBufferCache>()
63            .init_resource::<CuboidsPipelines>()
64            .init_resource::<DynamicUniformBufferOfCuboidMaterial>()
65            .init_resource::<DynamicUniformBufferOfCuboidTransforms>()
66            .init_resource::<TransformsMeta>()
67            .init_resource::<UniformBufferOfGpuClippingPlaneRanges>()
68            .init_resource::<ViewMeta>()
69            .add_systems(ExtractSchedule, (extract_cuboids, extract_clipping_planes))
70            .add_systems(
71                Render,
72                (
73                    prepare_materials,
74                    prepare_clipping_planes,
75                    prepare_auxiliary_bind_group
76                        .after(prepare_materials)
77                        .after(prepare_clipping_planes),
78                    prepare_cuboid_transforms,
79                    prepare_cuboids,
80                    prepare_cuboids_view_bind_group.after(prepare_view_uniforms),
81                )
82                    .in_set(RenderSet::Prepare),
83            )
84            .add_systems(Render, queue_cuboids.in_set(RenderSet::Queue));
85    }
86}