diff --git a/examples/3d/parallax_mapping.rs b/examples/3d/parallax_mapping.rs
index bf0dcbed95d7b..f7bf65c1b3660 100644
--- a/examples/3d/parallax_mapping.rs
+++ b/examples/3d/parallax_mapping.rs
@@ -1,6 +1,8 @@
//! A simple 3D scene with a spinning cube with a normal map and depth map to demonstrate parallax mapping.
//! Press left mouse button to cycle through different views.
+use std::fmt;
+
use bevy::{prelude::*, render::render_resource::TextureFormat, window::close_on_esc};
fn main() {
@@ -48,6 +50,34 @@ impl Default for TargetLayers {
TargetLayers(5.0)
}
}
+struct CurrentMethod(ParallaxMappingMethod);
+impl Default for CurrentMethod {
+ fn default() -> Self {
+ CurrentMethod(ParallaxMappingMethod::Relief { max_steps: 4 })
+ }
+}
+impl fmt::Display for CurrentMethod {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self.0 {
+ ParallaxMappingMethod::Occlusion => write!(f, "Parallax Occlusion Mapping"),
+ ParallaxMappingMethod::Relief { max_steps } => {
+ write!(f, "Relief Mapping with {max_steps} steps")
+ }
+ }
+ }
+}
+impl CurrentMethod {
+ fn next_method(&mut self) {
+ use ParallaxMappingMethod::*;
+ self.0 = match self.0 {
+ Occlusion => Relief { max_steps: 2 },
+ Relief { max_steps } if max_steps < 3 => Relief { max_steps: 4 },
+ Relief { max_steps } if max_steps < 5 => Relief { max_steps: 8 },
+ Relief { .. } => Occlusion,
+ }
+ }
+}
+
fn update_parallax_depth_scale(
input: Res>,
mut materials: ResMut>,
@@ -57,7 +87,7 @@ fn update_parallax_depth_scale(
) {
if input.just_pressed(KeyCode::Key1) {
target_depth.0 -= DEPTH_UPDATE_STEP;
- target_depth.0 = target_depth.0.max(-MAX_DEPTH);
+ target_depth.0 = target_depth.0.max(0.0);
*depth_update = true;
}
if input.just_pressed(KeyCode::Key2) {
@@ -84,25 +114,18 @@ fn switch_method(
input: Res>,
mut materials: ResMut>,
mut text: Query<&mut Text>,
- mut current: Local,
+ mut current: Local,
) {
if input.just_pressed(KeyCode::Space) {
- *current = match *current {
- ParallaxMappingMethod::Relief { .. } => ParallaxMappingMethod::Occlusion,
- ParallaxMappingMethod::Occlusion => ParallaxMappingMethod::Relief { max_steps: 5 },
- }
+ current.next_method();
} else {
return;
}
- let method_name = match *current {
- ParallaxMappingMethod::Relief { .. } => "Relief Mapping",
- ParallaxMappingMethod::Occlusion => "Parallax Occlusion Mapping",
- };
let mut text = text.single_mut();
- text.sections[2].value = format!("Method: {method_name}\n");
+ text.sections[2].value = format!("Method: {}\n", *current);
for (_, mat) in materials.iter_mut() {
- mat.parallax_mapping_method = *current;
+ mat.parallax_mapping_method = current.0;
}
}
@@ -133,7 +156,7 @@ fn spin(time: Res