Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use bevy::{
prelude::*,
render::{
extract_component::ExtractComponentPlugin, render_asset::prepare_assets,
render_phase::AddRenderCommand, render_resource::SpecializedRenderPipelines, Render,
RenderApp, RenderSet,
},
};
use std::hash::Hash;
use std::marker::PhantomData;
use crate::render::ui_pass::{TransparentOpacityUI, TransparentUI};
use super::{
pipeline::{
extract_materials_ui, prepare_materials_ui, queue_material_ui_quads, DrawMaterialUI,
ExtractedMaterialsUI, MaterialUIPipeline, RenderMaterialsUI,
},
DrawMaterialUITransparent, MaterialUI,
};
/// Adds the necessary ECS resources and render logic to enable rendering entities using the given [`MaterialUI`]
/// asset type (which includes [`MaterialUI`] types).
pub struct MaterialUIPlugin<M: MaterialUI>(PhantomData<M>);
impl<M: MaterialUI> Default for MaterialUIPlugin<M> {
fn default() -> Self {
Self(Default::default())
}
}
impl<M: MaterialUI> Plugin for MaterialUIPlugin<M>
where
M::Data: PartialEq + Eq + Hash + Clone,
{
fn build(&self, app: &mut App) {
app.init_asset::<M>()
.add_plugins(ExtractComponentPlugin::<Handle<M>>::extract_visible());
}
fn finish(&self, app: &mut App) {
app.sub_app_mut(RenderApp)
.init_resource::<MaterialUIPipeline<M>>()
.add_render_command::<TransparentUI, DrawMaterialUI<M>>()
.add_render_command::<TransparentOpacityUI, DrawMaterialUITransparent<M>>()
.init_resource::<ExtractedMaterialsUI<M>>()
.init_resource::<RenderMaterialsUI<M>>()
.init_resource::<SpecializedRenderPipelines<MaterialUIPipeline<M>>>()
.add_systems(ExtractSchedule, extract_materials_ui::<M>)
.add_systems(
Render,
(
prepare_materials_ui::<M>
.in_set(RenderSet::Prepare)
.after(prepare_assets::<Image>),
queue_material_ui_quads::<M>
.in_set(RenderSet::Queue)
.after(crate::render::unified::pipeline::queue_quads),
),
);
}
}