Update example
This commit is contained in:
parent
ab8d3abcbc
commit
4f28f38f14
@ -25,6 +25,8 @@ struct AppStatus {
|
|||||||
reflection_mode: ReflectionMode,
|
reflection_mode: ReflectionMode,
|
||||||
// Whether the user has requested the scene to rotate.
|
// Whether the user has requested the scene to rotate.
|
||||||
rotating: bool,
|
rotating: bool,
|
||||||
|
// The current roughness of the central sphere
|
||||||
|
sphere_roughness: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Which environment maps the user has requested to display.
|
// Which environment maps the user has requested to display.
|
||||||
@ -73,6 +75,7 @@ fn main() {
|
|||||||
.add_systems(PreUpdate, add_environment_map_to_camera)
|
.add_systems(PreUpdate, add_environment_map_to_camera)
|
||||||
.add_systems(Update, change_reflection_type)
|
.add_systems(Update, change_reflection_type)
|
||||||
.add_systems(Update, toggle_rotation)
|
.add_systems(Update, toggle_rotation)
|
||||||
|
.add_systems(Update, change_sphere_roughness)
|
||||||
.add_systems(
|
.add_systems(
|
||||||
Update,
|
Update,
|
||||||
rotate_camera
|
rotate_camera
|
||||||
@ -95,7 +98,7 @@ fn setup(
|
|||||||
) {
|
) {
|
||||||
spawn_scene(&mut commands, &asset_server);
|
spawn_scene(&mut commands, &asset_server);
|
||||||
spawn_camera(&mut commands);
|
spawn_camera(&mut commands);
|
||||||
spawn_sphere(&mut commands, &mut meshes, &mut materials);
|
spawn_sphere(&mut commands, &mut meshes, &mut materials, &app_status);
|
||||||
spawn_reflection_probe(&mut commands, &cubemaps);
|
spawn_reflection_probe(&mut commands, &cubemaps);
|
||||||
spawn_text(&mut commands, &app_status);
|
spawn_text(&mut commands, &app_status);
|
||||||
}
|
}
|
||||||
@ -121,6 +124,7 @@ fn spawn_sphere(
|
|||||||
commands: &mut Commands,
|
commands: &mut Commands,
|
||||||
meshes: &mut Assets<Mesh>,
|
meshes: &mut Assets<Mesh>,
|
||||||
materials: &mut Assets<StandardMaterial>,
|
materials: &mut Assets<StandardMaterial>,
|
||||||
|
app_status: &AppStatus,
|
||||||
) {
|
) {
|
||||||
// Create a sphere mesh.
|
// Create a sphere mesh.
|
||||||
let sphere_mesh = meshes.add(Sphere::new(1.0).mesh().ico(7).unwrap());
|
let sphere_mesh = meshes.add(Sphere::new(1.0).mesh().ico(7).unwrap());
|
||||||
@ -131,9 +135,10 @@ fn spawn_sphere(
|
|||||||
MeshMaterial3d(materials.add(StandardMaterial {
|
MeshMaterial3d(materials.add(StandardMaterial {
|
||||||
base_color: Srgba::hex("#ffd891").unwrap().into(),
|
base_color: Srgba::hex("#ffd891").unwrap().into(),
|
||||||
metallic: 1.0,
|
metallic: 1.0,
|
||||||
perceptual_roughness: 0.0,
|
perceptual_roughness: app_status.sphere_roughness,
|
||||||
..StandardMaterial::default()
|
..StandardMaterial::default()
|
||||||
})),
|
})),
|
||||||
|
SphereMaterial,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,21 +190,13 @@ fn add_environment_map_to_camera(
|
|||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
query: Query<Entity, Added<Camera3d>>,
|
query: Query<Entity, Added<Camera3d>>,
|
||||||
cubemaps: Res<Cubemaps>,
|
cubemaps: Res<Cubemaps>,
|
||||||
app_status: Res<AppStatus>,
|
|
||||||
) {
|
) {
|
||||||
for camera_entity in query.iter() {
|
for camera_entity in query.iter() {
|
||||||
let image = match app_status.reflection_mode {
|
|
||||||
ReflectionMode::PrefilteredEnvironmentMap => {
|
|
||||||
cubemaps.unfiltered_environment_map.clone()
|
|
||||||
}
|
|
||||||
_ => cubemaps.skybox.clone(),
|
|
||||||
};
|
|
||||||
|
|
||||||
commands
|
commands
|
||||||
.entity(camera_entity)
|
.entity(camera_entity)
|
||||||
.insert(create_camera_environment_map_light(&cubemaps))
|
.insert(create_camera_environment_map_light(&cubemaps))
|
||||||
.insert(Skybox {
|
.insert(Skybox {
|
||||||
image,
|
image: cubemaps.skybox.clone(),
|
||||||
brightness: 5000.0,
|
brightness: 5000.0,
|
||||||
..default()
|
..default()
|
||||||
});
|
});
|
||||||
@ -236,7 +233,7 @@ fn change_reflection_type(
|
|||||||
ReflectionMode::None | ReflectionMode::EnvironmentMap => {}
|
ReflectionMode::None | ReflectionMode::EnvironmentMap => {}
|
||||||
ReflectionMode::ReflectionProbe => spawn_reflection_probe(&mut commands, &cubemaps),
|
ReflectionMode::ReflectionProbe => spawn_reflection_probe(&mut commands, &cubemaps),
|
||||||
ReflectionMode::PrefilteredEnvironmentMap => {
|
ReflectionMode::PrefilteredEnvironmentMap => {
|
||||||
spawn_prefiltered_environment_map(&mut commands, &cubemaps)
|
spawn_prefiltered_environment_map(&mut commands, &cubemaps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,8 +316,11 @@ impl AppStatus {
|
|||||||
};
|
};
|
||||||
|
|
||||||
format!(
|
format!(
|
||||||
"{}\n{}\n{}",
|
"{}\n{}\nRoughness: {:.2}\n{}\nUp/Down arrows to change roughness",
|
||||||
self.reflection_mode, rotation_help_text, REFLECTION_MODE_HELP_TEXT
|
self.reflection_mode,
|
||||||
|
rotation_help_text,
|
||||||
|
self.sphere_roughness,
|
||||||
|
REFLECTION_MODE_HELP_TEXT
|
||||||
)
|
)
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
@ -392,6 +392,39 @@ impl Default for AppStatus {
|
|||||||
Self {
|
Self {
|
||||||
reflection_mode: ReflectionMode::ReflectionProbe,
|
reflection_mode: ReflectionMode::ReflectionProbe,
|
||||||
rotating: true,
|
rotating: true,
|
||||||
|
sphere_roughness: 0.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Component)]
|
||||||
|
struct SphereMaterial;
|
||||||
|
|
||||||
|
// A system that changes the sphere's roughness with up/down arrow keys
|
||||||
|
fn change_sphere_roughness(
|
||||||
|
keyboard: Res<ButtonInput<KeyCode>>,
|
||||||
|
mut app_status: ResMut<AppStatus>,
|
||||||
|
mut materials: ResMut<Assets<StandardMaterial>>,
|
||||||
|
sphere_query: Query<&MeshMaterial3d<StandardMaterial>, With<SphereMaterial>>,
|
||||||
|
) {
|
||||||
|
let roughness_delta = if keyboard.pressed(KeyCode::ArrowUp) {
|
||||||
|
0.01 // Decrease roughness
|
||||||
|
} else if keyboard.pressed(KeyCode::ArrowDown) {
|
||||||
|
-0.01 // Increase roughness
|
||||||
|
} else {
|
||||||
|
0.0 // No change
|
||||||
|
};
|
||||||
|
|
||||||
|
if roughness_delta != 0.0 {
|
||||||
|
// Update the app status
|
||||||
|
app_status.sphere_roughness =
|
||||||
|
(app_status.sphere_roughness + roughness_delta).clamp(0.0, 1.0);
|
||||||
|
|
||||||
|
// Update the sphere material
|
||||||
|
for material_handle in sphere_query.iter() {
|
||||||
|
if let Some(material) = materials.get_mut(&material_handle.0) {
|
||||||
|
material.perceptual_roughness = app_status.sphere_roughness;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user