bevy_aabb_instancing/vertex_pulling/
plugin.rs1use 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#[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}