|
|
|
@ -15,30 +15,16 @@ fn main() {
|
|
|
|
))
|
|
|
|
))
|
|
|
|
.add_systems(Startup, setup)
|
|
|
|
.add_systems(Startup, setup)
|
|
|
|
.add_systems(Update, rotate)
|
|
|
|
.add_systems(Update, rotate)
|
|
|
|
|
|
|
|
.add_systems(Update, setup_material)
|
|
|
|
.run();
|
|
|
|
.run();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn setup(
|
|
|
|
fn setup(
|
|
|
|
mut commands: Commands,
|
|
|
|
mut commands: Commands,
|
|
|
|
mut meshes: ResMut<Assets<Mesh>>,
|
|
|
|
assets: Res<AssetServer>,
|
|
|
|
mut materials: ResMut<Assets<MyMat>>,
|
|
|
|
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
commands.spawn(MaterialMeshBundle {
|
|
|
|
commands.spawn(SceneBundle {
|
|
|
|
mesh: meshes.add(
|
|
|
|
scene: assets.load("models/Martian Chess.glb#Scene0"),
|
|
|
|
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 { cutoff: 0.5 },
|
|
|
|
|
|
|
|
}),
|
|
|
|
|
|
|
|
..default()
|
|
|
|
..default()
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
@ -69,6 +55,30 @@ impl MaterialExtension for MatExt {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn setup_material(
|
|
|
|
|
|
|
|
events: Query<(Entity, &Handle<StandardMaterial>), Added<Handle<StandardMaterial>>>,
|
|
|
|
|
|
|
|
standard_materials: Res<Assets<StandardMaterial>>,
|
|
|
|
|
|
|
|
mut materials: ResMut<Assets<MyMat>>,
|
|
|
|
|
|
|
|
mut commands: Commands,
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
events.iter().for_each(|(entity, handle)| {
|
|
|
|
|
|
|
|
// Extension we will add to existing gltf-sourced materials
|
|
|
|
|
|
|
|
let extension = MatExt { cutoff: 1.0 };
|
|
|
|
|
|
|
|
// Base material we will extend for the duration of the dissolve effect
|
|
|
|
|
|
|
|
let mut base = standard_materials.get(handle).expect("Resolve material data").clone();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
base.opaque_render_method = OpaqueRendererMethod::Auto;
|
|
|
|
|
|
|
|
base.alpha_mode = AlphaMode::Mask(0.5);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
commands.entity(entity).insert(
|
|
|
|
|
|
|
|
materials.add(ExtendedMaterial {
|
|
|
|
|
|
|
|
base,
|
|
|
|
|
|
|
|
extension,
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
).remove::<Handle<StandardMaterial>>();
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn rotate(
|
|
|
|
fn rotate(
|
|
|
|
mut query: Query<&mut Transform, With<Handle<Mesh>>>,
|
|
|
|
mut query: Query<&mut Transform, With<Handle<Mesh>>>,
|
|
|
|
time: Res<Time>,
|
|
|
|
time: Res<Time>,
|
|
|
|
@ -76,8 +86,8 @@ fn rotate(
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
query.iter_mut().for_each(|mut t| {
|
|
|
|
query.iter_mut().for_each(|mut t| {
|
|
|
|
t.rotate_local_y(time.delta_seconds() / 2.0);
|
|
|
|
t.rotate_local_y(time.delta_seconds() / 2.0);
|
|
|
|
t.rotate_local_z(time.delta_seconds() / 2.0);
|
|
|
|
// t.rotate_local_z(time.delta_seconds() / 2.0);
|
|
|
|
t.rotate_local_x(time.delta_seconds() / 2.0);
|
|
|
|
// t.rotate_local_x(time.delta_seconds() / 2.0);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
materials.iter_mut().for_each(|(_id, m)| {
|
|
|
|
materials.iter_mut().for_each(|(_id, m)| {
|
|
|
|
m.extension.cutoff = time.elapsed_seconds().sin().abs();
|
|
|
|
m.extension.cutoff = time.elapsed_seconds().sin().abs();
|
|
|
|
|