mirror of
https://github.com/bevyengine/bevy
synced 2024-11-22 20:53:53 +00:00
1bd390806f
# Objective There was issue #191 requesting subdivisions on the shape::Plane. I also could have used this recently. I then write the solution. Fixes #191 ## Solution I changed the shape::Plane to include subdivisions field and the code to create the subdivisions. I don't know how people are counting subdivisions so as I put in the doc comments 0 subdivisions results in the original geometry of the Plane. Greater then 0 results in the number of lines dividing the plane. I didn't know if it would be better to create a new struct that implemented this feature, say SubdivisionPlane or change Plane. I decided on changing Plane as that was what the original issue was. It would be trivial to alter this to use another struct instead of altering Plane. The issues of migration, although small, would be eliminated if a new struct was implemented. ## Changelog ### Added Added subdivisions field to shape::Plane ## Migration Guide All the examples needed to be updated to initalize the subdivisions field. Also there were two tests in tests/window that need to be updated. A user would have to update all their uses of shape::Plane to initalize the subdivisions field.
119 lines
4.3 KiB
Rust
119 lines
4.3 KiB
Rust
//! Demonstrates how to use transparency in 3D.
|
|
//! Shows the effects of different blend modes.
|
|
//! The `fade_transparency` system smoothly changes the transparency over time.
|
|
|
|
use bevy::prelude::*;
|
|
|
|
fn main() {
|
|
App::new()
|
|
.insert_resource(Msaa::default())
|
|
.add_plugins(DefaultPlugins)
|
|
.add_startup_system(setup)
|
|
.add_system(fade_transparency)
|
|
.run();
|
|
}
|
|
|
|
fn setup(
|
|
mut commands: Commands,
|
|
mut meshes: ResMut<Assets<Mesh>>,
|
|
mut materials: ResMut<Assets<StandardMaterial>>,
|
|
) {
|
|
// opaque plane, uses `alpha_mode: Opaque` by default
|
|
commands.spawn(PbrBundle {
|
|
mesh: meshes.add(shape::Plane::from_size(6.0).into()),
|
|
material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()),
|
|
..default()
|
|
});
|
|
// transparent sphere, uses `alpha_mode: Mask(f32)`
|
|
commands.spawn(PbrBundle {
|
|
mesh: meshes.add(
|
|
Mesh::try_from(shape::Icosphere {
|
|
radius: 0.5,
|
|
subdivisions: 3,
|
|
})
|
|
.unwrap(),
|
|
),
|
|
material: materials.add(StandardMaterial {
|
|
// Alpha channel of the color controls transparency.
|
|
// We set it to 0.0 here, because it will be changed over time in the
|
|
// `fade_transparency` function.
|
|
// Note that the transparency has no effect on the objects shadow.
|
|
base_color: Color::rgba(0.2, 0.7, 0.1, 0.0),
|
|
// Mask sets a cutoff for transparency. Alpha values below are fully transparent,
|
|
// alpha values above are fully opaque.
|
|
alpha_mode: AlphaMode::Mask(0.5),
|
|
..default()
|
|
}),
|
|
transform: Transform::from_xyz(1.0, 0.5, -1.5),
|
|
..default()
|
|
});
|
|
// transparent unlit sphere, uses `alpha_mode: Mask(f32)`
|
|
commands.spawn(PbrBundle {
|
|
mesh: meshes.add(
|
|
Mesh::try_from(shape::Icosphere {
|
|
radius: 0.5,
|
|
subdivisions: 3,
|
|
})
|
|
.unwrap(),
|
|
),
|
|
material: materials.add(StandardMaterial {
|
|
base_color: Color::rgba(0.2, 0.7, 0.1, 0.0),
|
|
alpha_mode: AlphaMode::Mask(0.5),
|
|
unlit: true,
|
|
..default()
|
|
}),
|
|
transform: Transform::from_xyz(-1.0, 0.5, -1.5),
|
|
..default()
|
|
});
|
|
// transparent cube, uses `alpha_mode: Blend`
|
|
commands.spawn(PbrBundle {
|
|
mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })),
|
|
// Notice how there is no need to set the `alpha_mode` explicitly here.
|
|
// When converting a color to a material using `into()`, the alpha mode is
|
|
// automatically set to `Blend` if the alpha channel is anything lower than 1.0.
|
|
material: materials.add(Color::rgba(0.5, 0.5, 1.0, 0.0).into()),
|
|
transform: Transform::from_xyz(0.0, 0.5, 0.0),
|
|
..default()
|
|
});
|
|
// opaque sphere
|
|
commands.spawn(PbrBundle {
|
|
mesh: meshes.add(
|
|
Mesh::try_from(shape::Icosphere {
|
|
radius: 0.5,
|
|
subdivisions: 3,
|
|
})
|
|
.unwrap(),
|
|
),
|
|
material: materials.add(Color::rgb(0.7, 0.2, 0.1).into()),
|
|
transform: Transform::from_xyz(0.0, 0.5, -1.5),
|
|
..default()
|
|
});
|
|
// light
|
|
commands.spawn(PointLightBundle {
|
|
point_light: PointLight {
|
|
intensity: 1500.0,
|
|
shadows_enabled: true,
|
|
..default()
|
|
},
|
|
transform: Transform::from_xyz(4.0, 8.0, 4.0),
|
|
..default()
|
|
});
|
|
// camera
|
|
commands.spawn(Camera3dBundle {
|
|
transform: Transform::from_xyz(-2.0, 3.0, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
|
|
..default()
|
|
});
|
|
}
|
|
|
|
/// Fades the alpha channel of all materials between 0 and 1 over time.
|
|
/// Each blend mode responds differently to this:
|
|
/// - `Opaque`: Ignores alpha channel altogether, these materials stay completely opaque.
|
|
/// - `Mask(f32)`: Object appears when the alpha value goes above the mask's threshold, disappears
|
|
/// when the alpha value goes back below the threshold.
|
|
/// - `Blend`: Object fades in and out smoothly.
|
|
pub fn fade_transparency(time: Res<Time>, mut materials: ResMut<Assets<StandardMaterial>>) {
|
|
let alpha = (time.elapsed_seconds().sin() / 2.0) + 0.5;
|
|
for (_, material) in materials.iter_mut() {
|
|
material.base_color.set_a(alpha);
|
|
}
|
|
}
|