moria/src/rendering/mod.rs

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);
}