103 lines
3.6 KiB
Rust
103 lines
3.6 KiB
Rust
use bevy::app::{PluginGroup, PluginGroupBuilder};
|
|
use bevy::pbr::render_graph::{LightsNode, PBR_PIPELINE_HANDLE};
|
|
use bevy::prelude::*;
|
|
use bevy::render::{
|
|
pipeline::PipelineDescriptor,
|
|
render_graph::{base, AssetRenderResourcesNode, RenderGraph, RenderResourcesNode},
|
|
shader::Shader,
|
|
};
|
|
|
|
mod pipeline;
|
|
use pipeline::build_pbr_pipeline;
|
|
|
|
pub struct CustomPlugins;
|
|
impl PluginGroup for CustomPlugins {
|
|
fn build(&mut self, group: &mut PluginGroupBuilder) {
|
|
group.add(bevy::log::LogPlugin::default());
|
|
group.add(bevy::core::CorePlugin::default());
|
|
group.add(bevy::transform::TransformPlugin::default());
|
|
group.add(bevy::diagnostic::DiagnosticsPlugin::default());
|
|
group.add(bevy::input::InputPlugin::default());
|
|
group.add(bevy::window::WindowPlugin::default());
|
|
group.add(bevy::asset::AssetPlugin::default());
|
|
group.add(bevy::scene::ScenePlugin::default());
|
|
|
|
group.add(bevy::render::RenderPlugin::default());
|
|
group.add(bevy::sprite::SpritePlugin::default());
|
|
group.add(CustomPbrPlugin::default());
|
|
group.add(bevy::ui::UiPlugin::default());
|
|
group.add(bevy::text::TextPlugin::default());
|
|
group.add(bevy::gilrs::GilrsPlugin::default());
|
|
group.add(bevy::gltf::GltfPlugin::default());
|
|
group.add(bevy::winit::WinitPlugin::default());
|
|
group.add(bevy::wgpu::WgpuPlugin::default());
|
|
}
|
|
}
|
|
|
|
#[derive(Default)]
|
|
pub struct CustomPbrPlugin;
|
|
impl Plugin for CustomPbrPlugin {
|
|
fn build(&self, app: &mut AppBuilder) {
|
|
app.add_asset::<StandardMaterial>()
|
|
.register_type::<Light>()
|
|
.add_system_to_stage(
|
|
CoreStage::PostUpdate,
|
|
bevy::render::shader::asset_shader_defs_system::<StandardMaterial>.system(),
|
|
)
|
|
.init_resource::<bevy::pbr::AmbientLight>();
|
|
add_pbr_graph(app.world_mut());
|
|
|
|
// add default StandardMaterial
|
|
let mut materials = app
|
|
.world_mut()
|
|
.get_resource_mut::<Assets<StandardMaterial>>()
|
|
.unwrap();
|
|
materials.set_untracked(
|
|
Handle::<StandardMaterial>::default(),
|
|
StandardMaterial {
|
|
base_color: Color::PINK,
|
|
unlit: true,
|
|
..Default::default()
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
/// the names of pbr graph nodes
|
|
mod node {
|
|
pub const TRANSFORM: &str = "transform";
|
|
pub const STANDARD_MATERIAL: &str = "standard_material";
|
|
pub const LIGHTS: &str = "lights";
|
|
}
|
|
|
|
fn add_pbr_graph(world: &mut World) {
|
|
{
|
|
let mut graph = world.get_resource_mut::<RenderGraph>().unwrap();
|
|
graph.add_system_node(
|
|
node::TRANSFORM,
|
|
RenderResourcesNode::<GlobalTransform>::new(true),
|
|
);
|
|
graph.add_system_node(
|
|
node::STANDARD_MATERIAL,
|
|
AssetRenderResourcesNode::<StandardMaterial>::new(true),
|
|
);
|
|
graph.add_system_node(node::LIGHTS, LightsNode::new(30));
|
|
|
|
// TODO: replace these with "autowire" groups
|
|
graph
|
|
.add_node_edge(node::STANDARD_MATERIAL, base::node::MAIN_PASS)
|
|
.unwrap();
|
|
graph
|
|
.add_node_edge(node::TRANSFORM, base::node::MAIN_PASS)
|
|
.unwrap();
|
|
graph
|
|
.add_node_edge(node::LIGHTS, base::node::MAIN_PASS)
|
|
.unwrap();
|
|
}
|
|
let pipeline = build_pbr_pipeline(&mut world.get_resource_mut::<Assets<Shader>>().unwrap());
|
|
let mut pipelines = world
|
|
.get_resource_mut::<Assets<PipelineDescriptor>>()
|
|
.unwrap();
|
|
pipelines.set_untracked(PBR_PIPELINE_HANDLE, pipeline);
|
|
}
|