//! A shader that uses the WESL shading language. use bevy::{ pbr::{MaterialPipeline, MaterialPipelineKey}, prelude::*, reflect::TypePath, render::{ mesh::MeshVertexBufferLayoutRef, render_resource::{ AsBindGroup, RenderPipelineDescriptor, ShaderDefVal, ShaderRef, SpecializedMeshPipelineError, }, }, }; /// This example uses shader source files from the assets subdirectory const FRAGMENT_SHADER_ASSET_PATH: &str = "shaders/custom_material.wesl"; fn main() { App::new() .add_plugins(( DefaultPlugins, MaterialPlugin::::default(), CustomMaterialPlugin, )) .add_systems(Startup, setup) .add_systems(Update, update) .run(); } /// A plugin that loads the custom material shader pub struct CustomMaterialPlugin; /// An example utility shader that is used by the custom material #[expect( dead_code, reason = "used to kept a strong handle, shader is referenced by the material" )] #[derive(Resource)] struct UtilityShader(Handle); impl Plugin for CustomMaterialPlugin { fn build(&self, app: &mut App) { let handle = app .world_mut() .resource_mut::() .load::("shaders/util.wesl"); app.insert_resource(UtilityShader(handle)); } } /// set up a simple 3D scene fn setup( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, ) { // cube commands.spawn(( Mesh3d(meshes.add(Cuboid::default())), MeshMaterial3d(materials.add(CustomMaterial { time: Vec4::ZERO, party_mode: false, })), Transform::from_xyz(0.0, 0.5, 0.0), )); // camera commands.spawn(( Camera3d::default(), Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y), )); } fn update( time: Res