use bevy::{ prelude::*, reflect::TypeUuid, render::{ mesh::shape, pipeline::{PipelineDescriptor, RenderPipeline}, render_graph::{base, AssetRenderResourcesNode, RenderGraph}, renderer::RenderResources, shader::ShaderStages, }, }; /// This example illustrates how to load shaders such that they can be /// edited while the example is still running. fn main() { App::new() .add_plugins(DefaultPlugins) .add_asset::() .add_startup_system(setup.system()) .run(); } #[derive(RenderResources, Default, TypeUuid)] #[uuid = "3bf9e364-f29d-4d6c-92cf-93298466c620"] struct MyMaterial { pub color: Color, } fn setup( mut commands: Commands, asset_server: ResMut, mut pipelines: ResMut>, mut meshes: ResMut>, mut materials: ResMut>, mut render_graph: ResMut, ) { // Watch for changes asset_server.watch_for_changes().unwrap(); // Create a new shader pipeline with shaders loaded from the asset directory let pipeline_handle = pipelines.add(PipelineDescriptor::default_config(ShaderStages { vertex: asset_server.load::("shaders/hot.vert"), fragment: Some(asset_server.load::("shaders/hot.frag")), })); // Add an AssetRenderResourcesNode to our Render Graph. This will bind MyMaterial resources to // our shader render_graph.add_system_node( "my_material", AssetRenderResourcesNode::::new(true), ); // Add a Render Graph edge connecting our new "my_material" node to the main pass node. This // ensures "my_material" runs before the main pass render_graph .add_node_edge("my_material", base::node::MAIN_PASS) .unwrap(); // Create a new material let material = materials.add(MyMaterial { color: Color::rgb(0.0, 0.8, 0.0), }); // cube commands .spawn_bundle(MeshBundle { mesh: meshes.add(Mesh::from(shape::Cube { size: 2.0 })), render_pipelines: RenderPipelines::from_pipelines(vec![RenderPipeline::new( pipeline_handle, )]), transform: Transform::from_xyz(0.0, 0.0, 0.0), ..Default::default() }) .insert(material); // camera commands.spawn_bundle(PerspectiveCameraBundle { transform: Transform::from_xyz(3.0, 5.0, -8.0).looking_at(Vec3::ZERO, Vec3::Y), ..Default::default() }); }