use bevy::{ color::palettes::css::RED, pbr::{ExtendedMaterial, MaterialExtension}, prelude::*, render::{render_resource::*, storage::ShaderStorageBuffer}, }; const SHADER_ASSET_PATH: &str = "shaders/material.wgsl"; type VoluMaterial = ExtendedMaterial; fn main() { App::new() .add_plugins(DefaultPlugins) .add_plugins(MaterialPlugin::::default()) .add_systems(Startup, setup) .add_systems(Update, (rotate_things, update_volu_material)) .run(); } fn setup( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, mut buffers: ResMut>, ) { let transform = Transform::from_xyz(0.0, 0.0, 0.0); let storage = buffers.add(ShaderStorageBuffer::from(VoluStorage { mesh_translation: transform.translation, sphere_radius: 1.0, color: Vec4::default(), })); commands.spawn(( Mesh3d(meshes.add(Cuboid::new(2.0, 2.0, 2.0))), MeshMaterial3d(materials.add(ExtendedMaterial { base: StandardMaterial { base_color: RED.into(), alpha_mode: AlphaMode::Blend, ..default() }, extension: VoluExtension { storage }, })), transform, Rotate, )); commands.spawn(( DirectionalLight::default(), Transform::from_xyz(1.0, 1.0, 1.0).looking_at(Vec3::ZERO, Vec3::Y), )); commands.spawn(( Camera3d::default(), Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y), )); } #[derive(Component)] struct Rotate; fn rotate_things(mut q: Query<&mut Transform, With>, time: Res