You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.8 KiB
Rust
81 lines
1.8 KiB
Rust
use bevy::pbr::OpaqueRendererMethod;
|
|
use bevy::prelude::*;
|
|
use bevy::pbr::ExtendedMaterial;
|
|
use bevy::pbr::MaterialExtension;
|
|
use bevy::pbr::MaterialMeshBundle;
|
|
use bevy::render::render_resource::*;
|
|
|
|
type MyMat = ExtendedMaterial<StandardMaterial, MatExt>;
|
|
|
|
fn main() {
|
|
App::new()
|
|
.add_plugins((
|
|
DefaultPlugins.set(ImagePlugin::default_nearest()),
|
|
MaterialPlugin::<MyMat>::default(),
|
|
))
|
|
.add_systems(Startup, setup)
|
|
.add_systems(Update, rotate)
|
|
.run();
|
|
}
|
|
|
|
fn setup(
|
|
mut commands: Commands,
|
|
mut meshes: ResMut<Assets<Mesh>>,
|
|
mut materials: ResMut<Assets<MyMat>>,
|
|
) {
|
|
commands.spawn(MaterialMeshBundle {
|
|
mesh: meshes.add(
|
|
Mesh::try_from(shape::Box {
|
|
..default()
|
|
}).unwrap(),
|
|
),
|
|
transform: Transform::from_xyz(0.0, 0.5, 0.0),
|
|
material: materials.add(ExtendedMaterial {
|
|
base: StandardMaterial {
|
|
base_color: Color::RED,
|
|
opaque_render_method: OpaqueRendererMethod::Auto,
|
|
alpha_mode: AlphaMode::Mask(0.5),
|
|
..default()
|
|
},
|
|
extension: MatExt { step: 3 },
|
|
}),
|
|
..default()
|
|
});
|
|
|
|
commands.spawn(PointLightBundle {
|
|
point_light: PointLight {
|
|
intensity: 10.0,
|
|
..default()
|
|
},
|
|
transform: Transform::from_xyz(-1.0, 4.5, 4.0).looking_at(Vec3::ZERO, Vec3::Y),
|
|
..default()
|
|
});
|
|
|
|
commands.spawn(Camera3dBundle {
|
|
transform: Transform::from_xyz(-1.0, 1.5, 4.0).looking_at(Vec3::ZERO, Vec3::Y),
|
|
..default()
|
|
});
|
|
}
|
|
|
|
#[derive(Asset, AsBindGroup, Reflect, Debug, Clone)]
|
|
struct MatExt {
|
|
#[uniform(100)]
|
|
step: u32,
|
|
}
|
|
|
|
impl MaterialExtension for MatExt {
|
|
fn fragment_shader() -> ShaderRef {
|
|
"examples/shaders/dissolve.wgsl".into()
|
|
}
|
|
}
|
|
|
|
fn rotate(
|
|
mut query: Query<&mut Transform, With<Handle<Mesh>>>,
|
|
time: Res<Time>,
|
|
) {
|
|
query.iter_mut().for_each(|mut t| {
|
|
t.rotate_local_y(time.delta_seconds() / 2.0);
|
|
t.rotate_local_z(time.delta_seconds() / 2.0);
|
|
t.rotate_local_x(time.delta_seconds() / 2.0);
|
|
})
|
|
} |