From 88cd679fa7e8159bd53d363f78d82f55ca161b50 Mon Sep 17 00:00:00 2001 From: Elijah Voigt Date: Tue, 9 Sep 2025 22:38:57 -0700 Subject: [PATCH] Parallax 2d (sans wraparound) working --- examples/parallax2d.rs | 47 +++++++++++++++++++++++++++++++++++------- examples/parallax3d.rs | 17 +++++++-------- 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/examples/parallax2d.rs b/examples/parallax2d.rs index ebf6f01..83e82f1 100644 --- a/examples/parallax2d.rs +++ b/examples/parallax2d.rs @@ -4,8 +4,9 @@ fn main() { App::new() .add_plugins(DefaultPlugins) .insert_resource(ClearColor(WHITE.into())) + .add_event::() .add_systems(Startup, setup_2d) - .add_systems(Update, move_camera) + .add_systems(Update, (move_camera, track_camera_movement, parallax)) .run(); } @@ -28,32 +29,64 @@ fn setup_2d( commands.spawn(( Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))), MeshMaterial2d(materials.add(Color::from(RED))), + Transform::from_xyz(0.0, 0.0, -1.0), ParallaxDistance(1.0), + children![(Text2d::new("Parallax Distance: 1"), TextColor(BLACK.into()), Transform::from_xyz(150.0, 50.0, 0.0))], )); commands.spawn(( Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))), MeshMaterial2d(materials.add(Color::from(GREEN))), + Transform::from_xyz(0.0, 0.0, -5.0), ParallaxDistance(5.0), + children![(Text2d::new("Parallax Distance: 5"), TextColor(BLACK.into()), Transform::from_xyz(150.0, 0.0, 0.0))], )); commands.spawn(( Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))), MeshMaterial2d(materials.add(Color::from(BLUE))), + Transform::from_xyz(0.0, 0.0, -10.0), ParallaxDistance(10.0), + children![(Text2d::new("Parallax Distance: 10"), TextColor(BLACK.into()), Transform::from_xyz(150.0, -50.0, 0.0))], )); } fn move_camera(keys: Res>, mut camera: Single<&mut Transform, With>) { - const SPEED: f32 = 0.1; + const SPEED: f32 = 5.0; if keys.pressed(KeyCode::ArrowLeft) { - camera.translation.z += SPEED; + camera.translation.x += SPEED; } else if keys.pressed(KeyCode::ArrowRight) { - camera.translation.z -= SPEED; - } else if keys.pressed(KeyCode::ArrowUp) { camera.translation.x -= SPEED; + } + + if keys.pressed(KeyCode::ArrowUp) { + camera.translation.y -= SPEED; } else if keys.pressed(KeyCode::ArrowDown) { - camera.translation.x += SPEED; + camera.translation.y += SPEED; } - info!("Position: {:?}", camera.translation); +} + +#[derive(Event)] +struct CameraMovement(Vec3); + +fn track_camera_movement( + mut events: EventWriter, + camera: Query<&Transform, (With, Changed)>, + mut last: Local +) { + camera.iter().for_each(|Transform { translation, .. }| { + events.write(CameraMovement(*last - *translation)); + *last = *translation; + }); +} + +fn parallax( + mut events: EventReader, + mut query: Query<(&mut Transform, &ParallaxDistance)>, +) { + events.read().for_each(|CameraMovement(v)| { + query.iter_mut().for_each(|(mut t, ParallaxDistance(d))| { + t.translation -= v / (20.0 / d); + }); + }); } diff --git a/examples/parallax3d.rs b/examples/parallax3d.rs index 5d89593..eeb1109 100644 --- a/examples/parallax3d.rs +++ b/examples/parallax3d.rs @@ -17,9 +17,8 @@ fn setup_3d( commands.spawn(( Camera::default(), Camera3d::default(), - Transform::default().looking_at(Vec3::new(0.0, -1.0, 0.0), Vec3::Y), AmbientLight { - brightness: 160.0, + brightness: 1280.0, ..default() }, )); @@ -30,7 +29,7 @@ fn setup_3d( base_color: RED.into(), ..Default::default() })), - Transform::from_xyz(0.0, -10.0, 0.0), + Transform::from_xyz(0.0, 0.0, -10.0), )); commands.spawn(( @@ -39,7 +38,7 @@ fn setup_3d( base_color: GREEN.into(), ..Default::default() })), - Transform::from_xyz(0.0, -50.0, 0.0), + Transform::from_xyz(0.0, 0.0, -50.0), )); commands.spawn(( @@ -48,21 +47,21 @@ fn setup_3d( base_color: BLUE.into(), ..Default::default() })), - Transform::from_xyz(0.0, -100.0, 0.0), + Transform::from_xyz(0.0, 0.0, -100.0), )); } fn move_camera(keys: Res>, mut camera: Single<&mut Transform, With>) { const SPEED: f32 = 0.1; if keys.pressed(KeyCode::ArrowLeft) { - camera.translation.z += SPEED; + camera.translation.x += SPEED; } else if keys.pressed(KeyCode::ArrowRight) { - camera.translation.z -= SPEED; + camera.translation.x -= SPEED; } if keys.pressed(KeyCode::ArrowUp) { - camera.translation.x -= SPEED; + camera.translation.y -= SPEED; } else if keys.pressed(KeyCode::ArrowDown) { - camera.translation.x += SPEED; + camera.translation.y += SPEED; } }