Week 16 of 2024

Development log of Otterhide

17 items
  1. Prototype camera movement by pointer dragging
  2. Use a gizmo to show camera focus, allow to toggle
  3. Implement camera panning by world space dragging
  4. Implement scroll to zoom
  5. Implement horizontal scroll to rotate
  6. Implement shift + drag to rotate
  7. Implement continuous pan and rotate by dragging
  8. Prevent rotation very close to the pivot
  9. Make scroll sensitivity configurable
  10. Make the forest floor darker
  11. Fix a misaligned district model
  12. Account for more than 1000 parcels in districts
  13. Improve roads and districts models
  14. Prevent depth fighting artifacts on far objects
  15. When scrolling to zoom, consider pointer position
  16. Update Cargo dependencies
  17. Update Nix dependencies

Prototype camera movement by pointer dragging

On by Tad Lispy

It's a very naive first implementation. It works by mapping pointer movement in screen space (x, y) to camera focus (with primary button pressed), zoom (with middle button) and rotation (with secondary button). There are some ad-hoc calculations to make the movements somewhat correspond to the size of things on screen, but we need something much better. Ideally dragging should be done in world space (3d).

The bevy_mod_picking crate is used to provide dragging information. In principle it should be possible to get a 3d dragging working with the APIs it provides.

index 20a548d..264dcd6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -692,6 +692,30 @@ dependencies = [
= "encase_derive_impl",
=]
=
+[[package]]
+name = "bevy_eventlistener"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9d65c75b4f81818cacdc8a4302c5413910c5fb7727564deaf95e56e0dea4bd0"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_eventlistener_derive",
+ "bevy_hierarchy",
+ "bevy_utils",
+]
+
+[[package]]
+name = "bevy_eventlistener_derive"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa29be733a02a5d7ca4507ef15f294711c1a0884b9a9a2730640ff4e7d0200ab"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
=[[package]]
=name = "bevy_gilrs"
=version = "0.13.0"
@@ -889,6 +913,35 @@ dependencies = [
= "glam",
=]
=
+[[package]]
+name = "bevy_mod_picking"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d79f17a34025d95e2e3525207ec73090647c6f40c3136fc674f87e167a9ae6be"
+dependencies = [
+ "bevy_app",
+ "bevy_core",
+ "bevy_core_pipeline",
+ "bevy_ecs",
+ "bevy_egui",
+ "bevy_eventlistener",
+ "bevy_math",
+ "bevy_picking_core",
+ "bevy_picking_egui",
+ "bevy_picking_highlight",
+ "bevy_picking_input",
+ "bevy_picking_raycast",
+ "bevy_picking_selection",
+ "bevy_picking_sprite",
+ "bevy_picking_ui",
+ "bevy_reflect",
+ "bevy_render",
+ "bevy_text",
+ "bevy_ui",
+ "bevy_utils",
+ "bevy_window",
+]
+
=[[package]]
=name = "bevy_mod_raycast"
=version = "0.17.0"
@@ -935,6 +988,141 @@ dependencies = [
= "thread_local",
=]
=
+[[package]]
+name = "bevy_picking_core"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41c8cdca408508a7d006bf077c6cbb6660a65895323333f206b7cce7b801a8e2"
+dependencies = [
+ "bevy_app",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_eventlistener",
+ "bevy_math",
+ "bevy_reflect",
+ "bevy_render",
+ "bevy_transform",
+ "bevy_utils",
+ "bevy_window",
+]
+
+[[package]]
+name = "bevy_picking_egui"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfc4196736e2a5d7ce709eab3e19ff4cf62e8f175f8a29d5e1a9ffe4ab6fe93b"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_egui",
+ "bevy_picking_core",
+ "bevy_picking_selection",
+ "bevy_reflect",
+ "bevy_render",
+]
+
+[[package]]
+name = "bevy_picking_highlight"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e684569b5f7dae06d1ff66e2287cee808b3862d9ae0d01dbe114d7d199d40cfd"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_ecs",
+ "bevy_pbr",
+ "bevy_picking_core",
+ "bevy_picking_selection",
+ "bevy_reflect",
+ "bevy_render",
+ "bevy_sprite",
+]
+
+[[package]]
+name = "bevy_picking_input"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60182209f48943de6c8bc3305a70f52012a18ef26f92f460f9436441b8badf0b"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_hierarchy",
+ "bevy_input",
+ "bevy_math",
+ "bevy_picking_core",
+ "bevy_picking_selection",
+ "bevy_reflect",
+ "bevy_render",
+ "bevy_utils",
+ "bevy_window",
+]
+
+[[package]]
+name = "bevy_picking_raycast"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2677d0a3402fea3327a216649c104f969685a5c01d969d274c89facba86c164d"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_mod_raycast",
+ "bevy_picking_core",
+ "bevy_reflect",
+ "bevy_render",
+ "bevy_transform",
+ "bevy_window",
+]
+
+[[package]]
+name = "bevy_picking_selection"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbc986eefd38058918322418d1e6ae398e74d48730e623a55dc20be78d5ee24b"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_eventlistener",
+ "bevy_input",
+ "bevy_picking_core",
+ "bevy_reflect",
+ "bevy_utils",
+]
+
+[[package]]
+name = "bevy_picking_sprite"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ac5309026e8c7f5aed2afec3aa2f21fb0a0487e9bb3d851860377891459df75"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_picking_core",
+ "bevy_render",
+ "bevy_sprite",
+ "bevy_transform",
+ "bevy_window",
+]
+
+[[package]]
+name = "bevy_picking_ui"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85ad6d40e33203115af38adc984341cf5637911baa940028b6a43a9917d64e79"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_hierarchy",
+ "bevy_math",
+ "bevy_picking_core",
+ "bevy_render",
+ "bevy_transform",
+ "bevy_ui",
+ "bevy_utils",
+ "bevy_window",
+]
+
=[[package]]
=name = "bevy_ptr"
=version = "0.13.1"
@@ -3404,6 +3592,7 @@ dependencies = [
= "bevy-inspector-egui",
= "bevy_args",
= "bevy_egui",
+ "bevy_mod_picking",
= "bevy_rts_camera",
= "clap",
= "derive_more",
index 2cd8908..1fe7227 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,6 +11,7 @@ bevy = { version = "0.13", features = ["wayland", "serialize"] }
=bevy-inspector-egui = { git = "https://github.com/jakobhellermann/bevy-inspector-egui", rev = "1563fe9", version = "0.23.4" }
=bevy_args = "=1.3.0"
=bevy_egui = "0.25.0"
+bevy_mod_picking = { version = "0.18.2", features = ["backend_egui"] }
=bevy_rts_camera = "0.4.0"
=clap = { version = "4.5.4", features = ["derive"] }
=derive_more = "0.99.17"
index 96c0ac0..8f95c58 100644
--- a/src/camera.rs
+++ b/src/camera.rs
@@ -2,7 +2,10 @@ use crate::major_state::MajorState;
=use crate::simulation;
=use crate::simulation::SimulationParameters;
=use bevy::prelude::*;
-use bevy_rts_camera::{RtsCamera, RtsCameraControls, RtsCameraPlugin};
+use bevy_mod_picking::events::{Drag, Pointer};
+use bevy_mod_picking::pointer::PointerButton;
+use bevy_rts_camera::{RtsCamera, RtsCameraPlugin};
+use std::ops::Add;
=
=pub struct CameraPlugin;
=
@@ -15,10 +18,41 @@ impl Plugin for CameraPlugin {
=                    .chain()
=                    .after(simulation::get_ready),
=            )
+            .add_systems(Update, handle_drag)
=            .add_systems(OnExit(MajorState::GettingReady), enable_camera);
=    }
=}
=
+#[derive(Resource, Debug)]
+struct DragStartPosition(Vec3);
+
+fn handle_drag(mut dragging: EventReader<Pointer<Drag>>, mut camera: Query<&mut RtsCamera>) {
+    let Ok(mut camera) = camera.get_single_mut() else {
+        return;
+    };
+
+    for drag in dragging.read() {
+        if drag.button == PointerButton::Primary {
+            // The closer the camera, the slower the pan
+            let speed = 4.0 / (10.0 as f32).powf(camera.zoom);
+            let delta = camera.focus.rotation * drag.delta.extend(0.0).xzy();
+            camera.target_focus.translation -= delta * speed;
+        };
+
+        if drag.button == PointerButton::Middle {
+            camera.target_zoom = camera.target_zoom.add(drag.delta.y / 500.0).clamp(0.0, 1.0);
+        }
+
+        if drag.button == PointerButton::Secondary {
+            // The closer the camera, the slower the turn
+            // TODO: Calculate the angle around the center of the screen and rotate the camera the same angle in reverse
+            let speed = 0.002 / (10.0 as f32).powf(camera.zoom);
+
+            camera.target_focus.rotate_y(drag.delta.x * speed);
+        }
+    }
+}
+
=fn setup_camera(mut commands: Commands, parameters: Res<SimulationParameters>) {
=    commands.spawn((
=        Camera3dBundle::default(),
@@ -42,11 +76,6 @@ fn setup_camera(mut commands: Commands, parameters: Res<SimulationParameters>) {
=            },
=            ..default()
=        },
-        RtsCameraControls {
-            pan_speed: 200.,
-            edge_pan_width: 0.2,
-            ..default()
-        },
=    ));
=}
=
index 0d9813d..94f1f26 100644
--- a/src/ground.rs
+++ b/src/ground.rs
@@ -5,6 +5,7 @@ use bevy::ecs::system::SystemId;
=use bevy::gltf::Gltf;
=use bevy::math::bounding::{Aabb3d, IntersectsVolume};
=use bevy::prelude::*;
+use bevy_mod_picking::prelude::*;
=use bevy_rts_camera::Ground;
=use itertools::Itertools;
=use serde::{Deserialize, Serialize};
@@ -170,17 +171,18 @@ fn setup_ground(
=        },
=        Ground,
=        Name::new("Ground"),
+        PickableBundle::default(),
=    ));
=}
=
=#[derive(Component, Debug)]
-struct SnowGlobe;
+pub struct SnowGlobe;
=
=#[derive(Debug, Clone, Serialize, Deserialize)]
=pub struct GroundSnapshot;
=
=impl Snapshot for GroundSnapshot {
-    fn capture(world: &mut World) -> Self {
+    fn capture(_world: &mut World) -> Self {
=        Self
=    }
=
index b5b16bf..4725958 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,6 +4,7 @@ use bevy::utils::Uuid;
=use bevy_egui::EguiPlugin;
=#[cfg(debug_assertions)]
=use bevy_inspector_egui::quick::WorldInspectorPlugin;
+use bevy_mod_picking::prelude::*;
=use otterhide::buildings::BuildingsPlugin;
=use otterhide::camera::CameraPlugin;
=use otterhide::configuration::ConfigurationPlugin;
@@ -31,6 +32,7 @@ fn main() {
=            ..default()
=        }))
=        .register_type::<Uuid>()
+        .add_plugins(DefaultPickingPlugins)
=        .add_plugins(ConfigurationPlugin)
=        .add_plugins(MajorStatePlugin)
=        .add_plugins(SimulationLoadingPlugin)

Use a gizmo to show camera focus, allow to toggle

On by Tad Lispy

Gizmos can now be turned on and off with a configuration parameter. Also at runtime with the world inspector.

index 8f95c58..09a679a 100644
--- a/src/camera.rs
+++ b/src/camera.rs
@@ -26,11 +26,22 @@ impl Plugin for CameraPlugin {
=#[derive(Resource, Debug)]
=struct DragStartPosition(Vec3);
=
-fn handle_drag(mut dragging: EventReader<Pointer<Drag>>, mut camera: Query<&mut RtsCamera>) {
+fn handle_drag(
+    mut dragging: EventReader<Pointer<Drag>>,
+    mut camera: Query<&mut RtsCamera>,
+    mut gizmos: Gizmos,
+) {
=    let Ok(mut camera) = camera.get_single_mut() else {
=        return;
=    };
=
+    // SEE: https://github.com/Plonq/bevy_rts_camera/issues/6
+    let ground_focus = camera.focus.translation.xz().extend(0.0).xzy();
+
+    debug!("Camera focused on the ground at {ground_focus:?}");
+    #[cfg(debug_assertions)]
+    gizmos.sphere(ground_focus, Quat::default(), 20.0, Color::BLUE);
+
=    for drag in dragging.read() {
=        if drag.button == PointerButton::Primary {
=            // The closer the camera, the slower the pan
index 4617f6e..d51d414 100644
--- a/src/configuration.rs
+++ b/src/configuration.rs
@@ -38,6 +38,10 @@ pub struct Configuration {
=    /// First year of the simulation
=    #[arg(long, default_value_t = DEFAULT_BEGINNING)]
=    pub beginning: u16,
+
+    /// Should gizmos be drawn for visual debugging
+    #[arg(long, default_value_t = false)]
+    pub gizmos: bool,
=}
=
=impl Default for Configuration {
@@ -47,6 +51,7 @@ impl Default for Configuration {
=            duration: DEFAULT_DURATION,
=            inspect: None,
=            load: None,
+            gizmos: false,
=        }
=    }
=}
index 94f1f26..4c2a1cd 100644
--- a/src/ground.rs
+++ b/src/ground.rs
@@ -17,7 +17,6 @@ impl Plugin for GroundPlugin {
=    fn build(&self, app: &mut App) {
=        app.add_systems(Startup, register_ground_systems)
=            .register_type::<Tree>()
-            // .add_systems(Update, draw_gizmos)
=            .add_systems(Startup, setup_assets)
=            .add_systems(
=                OnEnter(MajorState::GettingReady),
@@ -66,19 +65,6 @@ fn remove_obstacles(
=    debug!("Removed {removed} obstacles. Left {left}.")
=}
=
-fn draw_gizmos(mut gizmos: Gizmos, trees: Query<&GlobalTransform, With<Tree>>) {
-    for transform in trees.iter() {
-        gizmos.cuboid(
-            Transform::from_translation(transform.translation()).with_scale(Vec3 {
-                x: 3.0,
-                y: 20.0,
-                z: 3.0,
-            }),
-            Color::GREEN,
-        );
-    }
-}
-
=#[derive(Resource)]
=struct SnowglobeAssetHandle(Handle<Gltf>);
=
index 4725958..33e4079 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -7,7 +7,7 @@ use bevy_inspector_egui::quick::WorldInspectorPlugin;
=use bevy_mod_picking::prelude::*;
=use otterhide::buildings::BuildingsPlugin;
=use otterhide::camera::CameraPlugin;
-use otterhide::configuration::ConfigurationPlugin;
+use otterhide::configuration::{Configuration, ConfigurationPlugin};
=use otterhide::date::DatePlugin;
=use otterhide::districts::DistrictsPlugin;
=use otterhide::ground::GroundPlugin;
@@ -64,5 +64,11 @@ impl Plugin for DebugPlugin {
=        app.add_plugins(WorldInspectorPlugin::new());
=        #[cfg(not(debug_assertions))]
=        app.add_plugins(EguiPlugin);
+
+        app.add_systems(Update, toggle_gizmos);
=    }
=}
+
+fn toggle_gizmos(configuration: Res<Configuration>, mut gizmos: ResMut<GizmoConfigStore>) {
+    gizmos.config_mut::<DefaultGizmoConfigGroup>().0.enabled = configuration.gizmos;
+}
index e093f4a..623f167 100644
--- a/src/roads.rs
+++ b/src/roads.rs
@@ -21,7 +21,7 @@ pub struct RoadsPlugin;
=impl Plugin for RoadsPlugin {
=    fn build(&self, app: &mut App) {
=        app.init_resource::<Roads>()
-            // .add_systems(Update, draw_gizmos)
+            .add_systems(Update, draw_gizmos)
=            .add_systems(Startup, setup_assets)
=            .add_systems(Startup, register_road_systems)
=            .add_systems(
index 8fff634..94096de 100644
--- a/src/sun.rs
+++ b/src/sun.rs
@@ -26,8 +26,6 @@ struct Sun;
=
=fn draw_gizmos(mut gizmos: Gizmos, sun: Query<(&Transform, &DirectionalLight), With<Sun>>) {
=    let (position, light) = sun.single();
-
-    #[cfg(degug)]
=    gizmos.sphere(position.translation, Quat::default(), 100., light.color);
=}
=

Implement camera panning by world space dragging

On by Tad Lispy

The camera will pan so that the same ground position remains under the pointer. For this I use bevy_mod_raycast to locate the position of the pointer projected on the xz plane. While dragging the camera is continuously moved in a direction from the current (dragged) pointer position to the starting position. So on every frame the pointer gets closer to where it started.

index 264dcd6..ae30573 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3593,6 +3593,7 @@ dependencies = [
= "bevy_args",
= "bevy_egui",
= "bevy_mod_picking",
+ "bevy_mod_raycast",
= "bevy_rts_camera",
= "clap",
= "derive_more",
index 1fe7227..0fc0899 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,6 +12,7 @@ bevy-inspector-egui = { git = "https://github.com/jakobhellermann/bevy-inspector
=bevy_args = "=1.3.0"
=bevy_egui = "0.25.0"
=bevy_mod_picking = { version = "0.18.2", features = ["backend_egui"] }
+bevy_mod_raycast = "0.17.0"
=bevy_rts_camera = "0.4.0"
=clap = { version = "4.5.4", features = ["derive"] }
=derive_more = "0.99.17"
index 09a679a..feafd04 100644
--- a/src/camera.rs
+++ b/src/camera.rs
@@ -1,69 +1,42 @@
=use crate::major_state::MajorState;
=use crate::simulation;
=use crate::simulation::SimulationParameters;
+use bevy::input::common_conditions::{input_just_pressed, input_just_released, input_pressed};
=use bevy::prelude::*;
-use bevy_mod_picking::events::{Drag, Pointer};
-use bevy_mod_picking::pointer::PointerButton;
-use bevy_rts_camera::{RtsCamera, RtsCameraPlugin};
-use std::ops::Add;
+use bevy_mod_raycast::prelude::*;
+use bevy_rts_camera::{RtsCamera, RtsCameraPlugin, RtsCameraSystemSet};
=
=pub struct CameraPlugin;
=
=impl Plugin for CameraPlugin {
=    fn build(&self, app: &mut App) {
=        app.add_plugins(RtsCameraPlugin)
+            .add_plugins(DeferredRaycastingPlugin::<PointerRay>::default())
+            .insert_resource(RaycastPluginState::<PointerRay>::default().with_debug_cursor())
=            .add_systems(
=                OnEnter(MajorState::GettingReady),
=                (setup_camera, disable_camera)
=                    .chain()
=                    .after(simulation::get_ready),
=            )
-            .add_systems(Update, handle_drag)
+            .add_systems(
+                Update,
+                record_drag_start_markers.run_if(input_just_pressed(MouseButton::Middle)),
+            )
+            .add_systems(
+                Update,
+                drop_drag_start_markers.run_if(input_just_released(MouseButton::Middle)),
+            )
+            .add_systems(
+                Update,
+                handle_drag
+                    .run_if(input_pressed(MouseButton::Middle))
+                    .before(RtsCameraSystemSet),
+            )
=            .add_systems(OnExit(MajorState::GettingReady), enable_camera);
=    }
=}
=
-#[derive(Resource, Debug)]
-struct DragStartPosition(Vec3);
-
-fn handle_drag(
-    mut dragging: EventReader<Pointer<Drag>>,
-    mut camera: Query<&mut RtsCamera>,
-    mut gizmos: Gizmos,
-) {
-    let Ok(mut camera) = camera.get_single_mut() else {
-        return;
-    };
-
-    // SEE: https://github.com/Plonq/bevy_rts_camera/issues/6
-    let ground_focus = camera.focus.translation.xz().extend(0.0).xzy();
-
-    debug!("Camera focused on the ground at {ground_focus:?}");
-    #[cfg(debug_assertions)]
-    gizmos.sphere(ground_focus, Quat::default(), 20.0, Color::BLUE);
-
-    for drag in dragging.read() {
-        if drag.button == PointerButton::Primary {
-            // The closer the camera, the slower the pan
-            let speed = 4.0 / (10.0 as f32).powf(camera.zoom);
-            let delta = camera.focus.rotation * drag.delta.extend(0.0).xzy();
-            camera.target_focus.translation -= delta * speed;
-        };
-
-        if drag.button == PointerButton::Middle {
-            camera.target_zoom = camera.target_zoom.add(drag.delta.y / 500.0).clamp(0.0, 1.0);
-        }
-
-        if drag.button == PointerButton::Secondary {
-            // The closer the camera, the slower the turn
-            // TODO: Calculate the angle around the center of the screen and rotate the camera the same angle in reverse
-            let speed = 0.002 / (10.0 as f32).powf(camera.zoom);
-
-            camera.target_focus.rotate_y(drag.delta.x * speed);
-        }
-    }
-}
-
=fn setup_camera(mut commands: Commands, parameters: Res<SimulationParameters>) {
=    commands.spawn((
=        Camera3dBundle::default(),
@@ -87,6 +60,7 @@ fn setup_camera(mut commands: Commands, parameters: Res<SimulationParameters>) {
=            },
=            ..default()
=        },
+        RaycastSource::<PointerRay>::new_cursor(),
=    ));
=}
=
@@ -99,3 +73,78 @@ fn enable_camera(mut cameras: Query<&mut Camera>) {
=    let mut camera = cameras.single_mut();
=    camera.is_active = true;
=}
+
+#[derive(Reflect, Debug)]
+pub struct PointerRay;
+
+/// This resource stores the position of the camera focus and the oointer at the start of dragging
+///
+/// The positions are projected onto an xz plane. The resource may not exist while not dragging.
+#[derive(Resource, Reflect, Debug)]
+pub struct DragStartMarker {
+    position: Vec2,
+}
+
+fn record_drag_start_markers(sources: Query<&RaycastSource<PointerRay>>, mut commands: Commands) {
+    info!("Looking for intersections to place drag start marker");
+
+    let Ok(source) = sources.get_single() else {
+        return;
+    };
+    let Some(intersection) = ground_intersection(source) else {
+        return;
+    };
+
+    info!("Intersection at {intersection:?}");
+    let position = intersection.position().xz();
+
+    commands.insert_resource(DragStartMarker { position });
+}
+
+fn drop_drag_start_markers(mut commands: Commands) {
+    info!("Dropping drag start marker");
+
+    commands.remove_resource::<DragStartMarker>();
+}
+
+fn handle_drag(
+    mut sources: Query<(&RaycastSource<PointerRay>, &mut RtsCamera)>,
+    mut gizmos: Gizmos,
+    marker: Option<Res<DragStartMarker>>,
+) {
+    let Some(start) = marker else {
+        warn!("Dragging, but there are no drag start markers!");
+        return;
+    };
+
+    let Ok((source, mut camera)) = sources.get_single_mut() else {
+        warn!("Dragging, but there is not a single camera!");
+        return;
+    };
+
+    let Some(intersection) = ground_intersection(source) else {
+        warn!("Cannot get ground intersection of the pointer ray to calculate camera drag.");
+        return;
+    };
+    let dragged_position = intersection.position().xz();
+
+    gizmos.arrow(
+        start.position.extend(20.).xzy(),
+        dragged_position.extend(20.).xzy(),
+        Color::ORANGE,
+    );
+
+    // Keep moving the camera until the dragged pointer is back at the starting position
+    let drag_delta = dragged_position - start.position;
+
+    // Slow down the motion and prevent overshooting and wobbling
+    const DUMPING_FACTOR: f32 = 4.0;
+    camera.target_focus.translation -= drag_delta.extend(0.0).xzy() / DUMPING_FACTOR;
+}
+
+fn ground_intersection(source: &RaycastSource<PointerRay>) -> Option<IntersectionData> {
+    source.intersect_primitive(bevy_mod_raycast::primitives::Primitive3d::Plane {
+        point: Vec3::ZERO,
+        normal: Vec3::Y,
+    })
+}
index 4c2a1cd..7c869a0 100644
--- a/src/ground.rs
+++ b/src/ground.rs
@@ -5,7 +5,6 @@ use bevy::ecs::system::SystemId;
=use bevy::gltf::Gltf;
=use bevy::math::bounding::{Aabb3d, IntersectsVolume};
=use bevy::prelude::*;
-use bevy_mod_picking::prelude::*;
=use bevy_rts_camera::Ground;
=use itertools::Itertools;
=use serde::{Deserialize, Serialize};
@@ -157,7 +156,6 @@ fn setup_ground(
=        },
=        Ground,
=        Name::new("Ground"),
-        PickableBundle::default(),
=    ));
=}
=
index 33e4079..c5274c5 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,7 +4,6 @@ use bevy::utils::Uuid;
=use bevy_egui::EguiPlugin;
=#[cfg(debug_assertions)]
=use bevy_inspector_egui::quick::WorldInspectorPlugin;
-use bevy_mod_picking::prelude::*;
=use otterhide::buildings::BuildingsPlugin;
=use otterhide::camera::CameraPlugin;
=use otterhide::configuration::{Configuration, ConfigurationPlugin};
@@ -32,7 +31,6 @@ fn main() {
=            ..default()
=        }))
=        .register_type::<Uuid>()
-        .add_plugins(DefaultPickingPlugins)
=        .add_plugins(ConfigurationPlugin)
=        .add_plugins(MajorStatePlugin)
=        .add_plugins(SimulationLoadingPlugin)

Implement scroll to zoom

On by Tad Lispy

index feafd04..57bdf7f 100644
--- a/src/camera.rs
+++ b/src/camera.rs
@@ -2,6 +2,7 @@ use crate::major_state::MajorState;
=use crate::simulation;
=use crate::simulation::SimulationParameters;
=use bevy::input::common_conditions::{input_just_pressed, input_just_released, input_pressed};
+use bevy::input::mouse::MouseWheel;
=use bevy::prelude::*;
=use bevy_mod_raycast::prelude::*;
=use bevy_rts_camera::{RtsCamera, RtsCameraPlugin, RtsCameraSystemSet};
@@ -33,6 +34,7 @@ impl Plugin for CameraPlugin {
=                    .run_if(input_pressed(MouseButton::Middle))
=                    .before(RtsCameraSystemSet),
=            )
+            .add_systems(Update, handle_scroll.before(RtsCameraSystemSet))
=            .add_systems(OnExit(MajorState::GettingReady), enable_camera);
=    }
=}
@@ -142,6 +144,25 @@ fn handle_drag(
=    camera.target_focus.translation -= drag_delta.extend(0.0).xzy() / DUMPING_FACTOR;
=}
=
+fn handle_scroll(mut scroll: EventReader<MouseWheel>, mut camera: Query<&mut RtsCamera>) {
+    use bevy::input::mouse::MouseScrollUnit;
+
+    let Ok(mut camera) = camera.get_single_mut() else {
+        return;
+    };
+
+    for event in scroll.read() {
+        match event.unit {
+            MouseScrollUnit::Line => {
+                camera.target_zoom = (camera.target_zoom + event.y / 20.0).clamp(0.0, 1.0)
+            }
+            MouseScrollUnit::Pixel => {
+                camera.target_zoom = (camera.target_zoom + event.y / 500.0).clamp(0.0, 1.0)
+            }
+        };
+    }
+}
+
=fn ground_intersection(source: &RaycastSource<PointerRay>) -> Option<IntersectionData> {
=    source.intersect_primitive(bevy_mod_raycast::primitives::Primitive3d::Plane {
=        point: Vec3::ZERO,

Implement horizontal scroll to rotate

On by Tad Lispy

Also tweak zoom settings a bit.

index 57bdf7f..ac9b43a 100644
--- a/src/camera.rs
+++ b/src/camera.rs
@@ -48,7 +48,7 @@ fn setup_camera(mut commands: Commands, parameters: Res<SimulationParameters>) {
=            //
=            // This value compensates for the logical "Ground" entity being
=            // under the visual ground. See the ground.rs for more comments.
-            height_min: 20.,
+            height_min: 30.,
=
=            bounds: bevy::math::bounding::Aabb2d {
=                min: Vec2 {
@@ -154,10 +154,12 @@ fn handle_scroll(mut scroll: EventReader<MouseWheel>, mut camera: Query<&mut Rts
=    for event in scroll.read() {
=        match event.unit {
=            MouseScrollUnit::Line => {
-                camera.target_zoom = (camera.target_zoom + event.y / 20.0).clamp(0.0, 1.0)
+                camera.target_zoom = (camera.target_zoom + event.y / 40.0).clamp(0.0, 1.0);
+                camera.target_focus.rotate_axis(Vec3::Y, event.x / -10.0);
=            }
=            MouseScrollUnit::Pixel => {
-                camera.target_zoom = (camera.target_zoom + event.y / 500.0).clamp(0.0, 1.0)
+                camera.target_zoom = (camera.target_zoom + event.y / 500.0).clamp(0.0, 1.0);
+                camera.target_focus.rotate_axis(Vec3::Y, event.x / -500.0);
=            }
=        };
=    }

Implement shift + drag to rotate

On by Tad Lispy

Rotation happens around the camera focus position, in a kind of turn-table style.

index ac9b43a..24a2587 100644
--- a/src/camera.rs
+++ b/src/camera.rs
@@ -22,7 +22,7 @@ impl Plugin for CameraPlugin {
=            )
=            .add_systems(
=                Update,
-                record_drag_start_markers.run_if(input_just_pressed(MouseButton::Middle)),
+                record_drag_start_marker.run_if(input_just_pressed(MouseButton::Middle)),
=            )
=            .add_systems(
=                Update,
@@ -87,9 +87,7 @@ pub struct DragStartMarker {
=    position: Vec2,
=}
=
-fn record_drag_start_markers(sources: Query<&RaycastSource<PointerRay>>, mut commands: Commands) {
-    info!("Looking for intersections to place drag start marker");
-
+fn record_drag_start_marker(sources: Query<&RaycastSource<PointerRay>>, mut commands: Commands) {
=    let Ok(source) = sources.get_single() else {
=        return;
=    };
@@ -97,7 +95,6 @@ fn record_drag_start_markers(sources: Query<&RaycastSource<PointerRay>>, mut com
=        return;
=    };
=
-    info!("Intersection at {intersection:?}");
=    let position = intersection.position().xz();
=
=    commands.insert_resource(DragStartMarker { position });
@@ -105,13 +102,13 @@ fn record_drag_start_markers(sources: Query<&RaycastSource<PointerRay>>, mut com
=
=fn drop_drag_start_markers(mut commands: Commands) {
=    info!("Dropping drag start marker");
-
=    commands.remove_resource::<DragStartMarker>();
=}
=
=fn handle_drag(
=    mut sources: Query<(&RaycastSource<PointerRay>, &mut RtsCamera)>,
=    mut gizmos: Gizmos,
+    keys: Res<ButtonInput<KeyCode>>,
=    marker: Option<Res<DragStartMarker>>,
=) {
=    let Some(start) = marker else {
@@ -129,19 +126,43 @@ fn handle_drag(
=        return;
=    };
=    let dragged_position = intersection.position().xz();
-
-    gizmos.arrow(
-        start.position.extend(20.).xzy(),
-        dragged_position.extend(20.).xzy(),
-        Color::ORANGE,
-    );
-
-    // Keep moving the camera until the dragged pointer is back at the starting position
-    let drag_delta = dragged_position - start.position;
-
-    // Slow down the motion and prevent overshooting and wobbling
-    const DUMPING_FACTOR: f32 = 4.0;
-    camera.target_focus.translation -= drag_delta.extend(0.0).xzy() / DUMPING_FACTOR;
+    let focus_position = camera.focus.translation.xz();
+
+    if keys.pressed(KeyCode::ShiftLeft) {
+        gizmos.arrow(
+            focus_position.extend(20.).xzy(),
+            dragged_position.extend(20.).xzy(),
+            Color::VIOLET,
+        );
+        gizmos.arrow(
+            focus_position.extend(20.).xzy(),
+            start.position.extend(20.).xzy(),
+            Color::CRIMSON,
+        );
+
+        let a = start.position - focus_position;
+        let b = dragged_position - focus_position;
+        let angle = a.angle_between(b);
+
+        // Slow down the rotation to prevent wobbling
+        const DAMPENING_FACTOR: f32 = 4.0;
+        camera
+            .target_focus
+            .rotate_axis(Vec3::Y, angle / DAMPENING_FACTOR);
+    } else {
+        gizmos.arrow(
+            start.position.extend(20.).xzy(),
+            dragged_position.extend(20.).xzy(),
+            Color::ORANGE,
+        );
+
+        // Keep moving the camera until the dragged pointer is back at the starting position
+        let drag_delta = dragged_position - start.position;
+
+        // Slow down the motion and prevent overshooting and wobbling
+        const DAMPENING_FACTOR: f32 = 4.0;
+        camera.target_focus.translation -= drag_delta.extend(0.0).xzy() / DAMPENING_FACTOR;
+    }
=}
=
=fn handle_scroll(mut scroll: EventReader<MouseWheel>, mut camera: Query<&mut RtsCamera>) {

Implement continuous pan and rotate by dragging

On by Tad Lispy

When a user toggles the shift key, the program should act as if dragging was restarted from whatever the current position of the pointer.

index 24a2587..3f5e147 100644
--- a/src/camera.rs
+++ b/src/camera.rs
@@ -110,6 +110,7 @@ fn handle_drag(
=    mut gizmos: Gizmos,
=    keys: Res<ButtonInput<KeyCode>>,
=    marker: Option<Res<DragStartMarker>>,
+    mut commands: Commands,
=) {
=    let Some(start) = marker else {
=        warn!("Dragging, but there are no drag start markers!");
@@ -128,6 +129,11 @@ fn handle_drag(
=    let dragged_position = intersection.position().xz();
=    let focus_position = camera.focus.translation.xz();
=
+    if keys.just_pressed(KeyCode::ShiftLeft) || keys.just_released(KeyCode::ShiftLeft) {
+        commands.insert_resource(DragStartMarker {
+            position: dragged_position,
+        });
+    }
=    if keys.pressed(KeyCode::ShiftLeft) {
=        gizmos.arrow(
=            focus_position.extend(20.).xzy(),

Prevent rotation very close to the pivot

On by Tad Lispy

to avoid rapid twists.

Also bring the gizmos closer to the ground so they are more useful when camera is low. I considered making them always on top with depth bias, but it created a lot of visual noise.

index 3f5e147..0d5247d 100644
--- a/src/camera.rs
+++ b/src/camera.rs
@@ -136,29 +136,47 @@ fn handle_drag(
=    }
=    if keys.pressed(KeyCode::ShiftLeft) {
=        gizmos.arrow(
-            focus_position.extend(20.).xzy(),
-            dragged_position.extend(20.).xzy(),
+            focus_position.extend(5.).xzy(),
+            dragged_position.extend(5.).xzy(),
=            Color::VIOLET,
=        );
=        gizmos.arrow(
-            focus_position.extend(20.).xzy(),
-            start.position.extend(20.).xzy(),
+            focus_position.extend(5.).xzy(),
+            start.position.extend(5.).xzy(),
=            Color::CRIMSON,
=        );
=
=        let a = start.position - focus_position;
=        let b = dragged_position - focus_position;
+
+        // Prevent rotation when pointer is very close to the pivot point
+        // to avoid rapid twists.
+        const DEAD_ZONE_RADIUS: f32 = 100.0;
+        let length = b.length();
+        let limit = DEAD_ZONE_RADIUS * (1.0 - camera.zoom.clamp(0.05, 0.95));
+        gizmos.circle(
+            focus_position.extend(5.0).xzy(),
+            Direction3d::Y,
+            limit,
+            Color::CRIMSON,
+        );
+        if length < limit {
+            commands.insert_resource(DragStartMarker {
+                position: dragged_position,
+            });
+            return;
+        }
=        let angle = a.angle_between(b);
=
=        // Slow down the rotation to prevent wobbling
-        const DAMPENING_FACTOR: f32 = 4.0;
+        const DAMPING_FACTOR: f32 = 4.0;
=        camera
=            .target_focus
-            .rotate_axis(Vec3::Y, angle / DAMPENING_FACTOR);
+            .rotate_axis(Vec3::Y, angle / DAMPING_FACTOR);
=    } else {
=        gizmos.arrow(
-            start.position.extend(20.).xzy(),
-            dragged_position.extend(20.).xzy(),
+            start.position.extend(5.).xzy(),
+            dragged_position.extend(5.).xzy(),
=            Color::ORANGE,
=        );
=
@@ -166,8 +184,8 @@ fn handle_drag(
=        let drag_delta = dragged_position - start.position;
=
=        // Slow down the motion and prevent overshooting and wobbling
-        const DAMPENING_FACTOR: f32 = 4.0;
-        camera.target_focus.translation -= drag_delta.extend(0.0).xzy() / DAMPENING_FACTOR;
+        const DAMPING_FACTOR: f32 = 4.0;
+        camera.target_focus.translation -= drag_delta.extend(0.0).xzy() / DAMPING_FACTOR;
=    }
=}
=
index c5274c5..d7b9207 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -68,5 +68,6 @@ impl Plugin for DebugPlugin {
=}
=
=fn toggle_gizmos(configuration: Res<Configuration>, mut gizmos: ResMut<GizmoConfigStore>) {
-    gizmos.config_mut::<DefaultGizmoConfigGroup>().0.enabled = configuration.gizmos;
+    let gizmo_config = gizmos.config_mut::<DefaultGizmoConfigGroup>().0;
+    gizmo_config.enabled = configuration.gizmos;
=}

Make scroll sensitivity configurable

On by Tad Lispy

Apparently different platforms can report scrolling very differently. This is apparent in web browsers. In my case scrolling was way more sensitive than on my Linux desktop. I don't think we can find any values that will be guaranteed to work for everybody, so now there are two new configuration parameters:

--vertical-scroll-sensitivity ?vertical_scroll_sensitivity

and

--horizontal-scroll-sensitivity ?horizontal_scroll_sensitivity

They are in logarithmic scale. Values can be set to 0 (for 10 times less sensitive scrolling than default) and even negative, for example -1 gives 100 times less sensitive scrolling.

index 0d5247d..4720860 100644
--- a/src/camera.rs
+++ b/src/camera.rs
@@ -1,3 +1,4 @@
+use crate::configuration::Configuration;
=use crate::major_state::MajorState;
=use crate::simulation;
=use crate::simulation::SimulationParameters;
@@ -6,6 +7,7 @@ use bevy::input::mouse::MouseWheel;
=use bevy::prelude::*;
=use bevy_mod_raycast::prelude::*;
=use bevy_rts_camera::{RtsCamera, RtsCameraPlugin, RtsCameraSystemSet};
+use std::ops::{Div, Mul, Neg};
=
=pub struct CameraPlugin;
=
@@ -189,22 +191,35 @@ fn handle_drag(
=    }
=}
=
-fn handle_scroll(mut scroll: EventReader<MouseWheel>, mut camera: Query<&mut RtsCamera>) {
+fn handle_scroll(
+    mut scroll: EventReader<MouseWheel>,
+    mut camera: Query<&mut RtsCamera>,
+    configuration: Res<Configuration>,
+) {
=    use bevy::input::mouse::MouseScrollUnit;
=
=    let Ok(mut camera) = camera.get_single_mut() else {
=        return;
=    };
=
+    let vertical_multiplier = (10.0_f32).powf(configuration.vertical_scroll_sensitivity);
+    let horizontal_multiplier = (10.0_f32).powf(configuration.horizontal_scroll_sensitivity);
+
=    for event in scroll.read() {
=        match event.unit {
=            MouseScrollUnit::Line => {
+                debug!("Scrolling by lines {:03.3}", event.y);
=                camera.target_zoom = (camera.target_zoom + event.y / 40.0).clamp(0.0, 1.0);
=                camera.target_focus.rotate_axis(Vec3::Y, event.x / -10.0);
=            }
=            MouseScrollUnit::Pixel => {
-                camera.target_zoom = (camera.target_zoom + event.y / 500.0).clamp(0.0, 1.0);
-                camera.target_focus.rotate_axis(Vec3::Y, event.x / -500.0);
+                debug!("Scrolling by pixels {:03.3}", event.y);
+
+                let zoom_delta = event.y.mul(vertical_multiplier).div(10000.0);
+                let angle = event.x.mul(horizontal_multiplier).div(2500.0).neg();
+
+                camera.target_zoom = (camera.target_zoom + zoom_delta).clamp(0.0, 1.0);
+                camera.target_focus.rotate_axis(Vec3::Y, angle);
=            }
=        };
=    }
index d51d414..2b97bf0 100644
--- a/src/configuration.rs
+++ b/src/configuration.rs
@@ -13,11 +13,24 @@ impl Plugin for ConfigurationPlugin {
=}
=
=const DEFAULT_BEGINNING: u16 = 1840;
+
=#[cfg(debug_assertions)]
=const DEFAULT_DURATION: u16 = 10;
=#[cfg(not(debug_assertions))]
=const DEFAULT_DURATION: u16 = 150;
=
+// In web browsers the scrolling is reported differently than on desktop
+//
+// Those defaults work for my browser and laptop.
+#[cfg(not(target_arch = "wasm32"))]
+const DEFAULT_VERTICAL_SCROLL_SENSITIVITY: f32 = 1.0;
+#[cfg(not(target_arch = "wasm32"))]
+const DEFAULT_HORIZONTAL_SCROLL_SENSITIVITY: f32 = 1.0;
+#[cfg(target_arch = "wasm32")]
+const DEFAULT_VERTICAL_SCROLL_SENSITIVITY: f32 = 0.2;
+#[cfg(target_arch = "wasm32")]
+const DEFAULT_HORIZONTAL_SCROLL_SENSITIVITY: f32 = 0.2;
+
=#[derive(Resource, Clone, Debug, Serialize, Deserialize, Parser, Reflect)]
=#[reflect(Resource)]
=#[serde(default)]
@@ -42,6 +55,14 @@ pub struct Configuration {
=    /// Should gizmos be drawn for visual debugging
=    #[arg(long, default_value_t = false)]
=    pub gizmos: bool,
+
+    /// Vertical scroll sensitivity
+    #[arg(long, default_value_t = DEFAULT_VERTICAL_SCROLL_SENSITIVITY)]
+    pub vertical_scroll_sensitivity: f32,
+
+    /// Horizontal scroll sensitivity
+    #[arg(long, default_value_t = DEFAULT_HORIZONTAL_SCROLL_SENSITIVITY)]
+    pub horizontal_scroll_sensitivity: f32,
=}
=
=impl Default for Configuration {
@@ -52,6 +73,8 @@ impl Default for Configuration {
=            inspect: None,
=            load: None,
=            gizmos: false,
+            vertical_scroll_sensitivity: DEFAULT_VERTICAL_SCROLL_SENSITIVITY,
+            horizontal_scroll_sensitivity: DEFAULT_HORIZONTAL_SCROLL_SENSITIVITY,
=        }
=    }
=}

Make the forest floor darker

On by Tad Lispy

For better aesthetic effect.

index 2062eba..5ad1971 100644
Binary files a/art/snowglobe.blend and b/art/snowglobe.blend differ
index e9096b1..d1dee4a 100644
Binary files a/assets/snowglobe.glb and b/assets/snowglobe.glb differ

Fix a misaligned district model

On by Tad Lispy

index f6ddc99..f037562 100644
Binary files a/art/districts.blend and b/art/districts.blend differ
index 2b92be5..7ae30a9 100644
Binary files a/assets/districts.glb and b/assets/districts.glb differ

Account for more than 1000 parcels in districts

On by Tad Lispy

The regular expression used to detect parcels assumed 3 digits suffix, but we had more than 1000 parcels in districts.blend, so some of them had 4 digits. Now any number of digits is allowed.

index b1fcaaa..25a3f92 100644
--- a/src/buildings.rs
+++ b/src/buildings.rs
@@ -360,7 +360,7 @@ impl FromStr for BuildingVariant {
=
=    fn from_str(s: &str) -> Result<Self, Self::Err> {
=        // TODO: Make invalid regexp a compile time error
-        let pattern = Regex::new(r"^building-(?<class>.+)\.(?<appearance>\d{3})$").unwrap();
+        let pattern = Regex::new(r"^building-(?<class>.+)\.(?<appearance>\d+)$").unwrap();
=
=        pattern
=            .captures(s)

Improve roads and districts models

On by Tad Lispy

index f037562..7fa3d8d 100644
Binary files a/art/districts.blend and b/art/districts.blend differ
index 8c9141e..9c5fb09 100644
Binary files a/art/roads.blend and b/art/roads.blend differ
index 7ae30a9..2f39e4c 100644
Binary files a/assets/districts.glb and b/assets/districts.glb differ
index c14c76f..b09a6c4 100644
Binary files a/assets/roads.glb and b/assets/roads.glb differ

Prevent depth fighting artifacts on far objects

On by Tad Lispy

by increasing the far value of the camera projection

index 4720860..3eca72b 100644
--- a/src/camera.rs
+++ b/src/camera.rs
@@ -43,7 +43,14 @@ impl Plugin for CameraPlugin {
=
=fn setup_camera(mut commands: Commands, parameters: Res<SimulationParameters>) {
=    commands.spawn((
-        Camera3dBundle::default(),
+        Camera3dBundle {
+            projection: Projection::Perspective(PerspectiveProjection {
+                far: 5000.0,
+                near: 5.0,
+                ..default()
+            }),
+            ..default()
+        },
=        RtsCamera {
=            height_max: 3000.,
=            // TODO: Lower the camera once ground position is back a 0

When scrolling to zoom, consider pointer position

On by Tad Lispy

When zooming in, move toward the pointer. When zooming out, away. So that the pointer remains roughly above the same place on the ground, the way it usually works in maps software. It doesn't stay exactly above the same place because of changing angle. But it's good enough.

index 3eca72b..cdc77fc 100644
--- a/src/camera.rs
+++ b/src/camera.rs
@@ -200,12 +200,12 @@ fn handle_drag(
=
=fn handle_scroll(
=    mut scroll: EventReader<MouseWheel>,
-    mut camera: Query<&mut RtsCamera>,
+    mut camera: Query<(&mut RtsCamera, &RaycastSource<PointerRay>)>,
=    configuration: Res<Configuration>,
=) {
=    use bevy::input::mouse::MouseScrollUnit;
=
-    let Ok(mut camera) = camera.get_single_mut() else {
+    let Ok((mut camera, source)) = camera.get_single_mut() else {
=        return;
=    };
=
@@ -213,11 +213,13 @@ fn handle_scroll(
=    let horizontal_multiplier = (10.0_f32).powf(configuration.horizontal_scroll_sensitivity);
=
=    for event in scroll.read() {
-        match event.unit {
+        let (zoom_delta, angle) = match event.unit {
=            MouseScrollUnit::Line => {
=                debug!("Scrolling by lines {:03.3}", event.y);
-                camera.target_zoom = (camera.target_zoom + event.y / 40.0).clamp(0.0, 1.0);
-                camera.target_focus.rotate_axis(Vec3::Y, event.x / -10.0);
+
+                let zoom_delta = event.y / 40.0;
+                let angle = event.x / -10.0;
+                (zoom_delta, angle)
=            }
=            MouseScrollUnit::Pixel => {
=                debug!("Scrolling by pixels {:03.3}", event.y);
@@ -225,10 +227,21 @@ fn handle_scroll(
=                let zoom_delta = event.y.mul(vertical_multiplier).div(10000.0);
=                let angle = event.x.mul(horizontal_multiplier).div(2500.0).neg();
=
-                camera.target_zoom = (camera.target_zoom + zoom_delta).clamp(0.0, 1.0);
-                camera.target_focus.rotate_axis(Vec3::Y, angle);
+                (zoom_delta, angle)
=            }
=        };
+        camera.target_zoom = (camera.target_zoom + zoom_delta).clamp(0.0, 1.0);
+        camera.target_focus.rotate_axis(Vec3::Y, angle);
+
+        // Move focus toward the intersection
+        let Some(intersection) = ground_intersection(source) else {
+            warn!("Cannot get ground intersection of the pointer ray to calculate camera drag.");
+            return;
+        };
+
+        let focus_distance = intersection.position() - camera.focus.translation;
+        let current_zoom = camera.zoom;
+        camera.target_focus.translation += focus_distance * zoom_delta * (current_zoom + 1.0);
=    }
=}
=

Update Cargo dependencies

On by Tad Lispy

index ae30573..5d70a4c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
=
=[[package]]
=name = "ab_glyph"
-version = "0.2.23"
+version = "0.2.25"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225"
+checksum = "6f90148830dac590fac7ccfe78ec4a8ea404c60f75a24e16407a71f0f40de775"
=dependencies = [
= "ab_glyph_rasterizer",
= "owned_ttf_parser",
@@ -102,18 +102,18 @@ dependencies = [
=
=[[package]]
=name = "aho-corasick"
-version = "1.1.2"
+version = "1.1.3"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
=dependencies = [
= "memchr",
=]
=
=[[package]]
=name = "allocator-api2"
-version = "0.2.16"
+version = "0.2.18"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
+checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
=
=[[package]]
=name = "alsa"
@@ -122,7 +122,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "37fe60779335388a88c01ac6c3be40304d1e349de3ada3b15f7808bb90fa9dce"
=dependencies = [
= "alsa-sys",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "libc",
=]
=
@@ -143,7 +143,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289"
=dependencies = [
= "android-properties",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "cc",
= "cesu8",
= "jni",
@@ -228,9 +228,9 @@ dependencies = [
=
=[[package]]
=name = "anyhow"
-version = "1.0.81"
+version = "1.0.82"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247"
+checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519"
=
=[[package]]
=name = "approx"
@@ -299,24 +299,23 @@ dependencies = [
=
=[[package]]
=name = "async-channel"
-version = "2.2.0"
+version = "2.2.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3"
+checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928"
=dependencies = [
= "concurrent-queue",
- "event-listener 5.2.0",
- "event-listener-strategy 0.5.0",
+ "event-listener 5.3.0",
+ "event-listener-strategy 0.5.1",
= "futures-core",
= "pin-project-lite",
=]
=
=[[package]]
=name = "async-executor"
-version = "1.8.0"
+version = "1.11.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c"
+checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a"
=dependencies = [
- "async-lock",
= "async-task",
= "concurrent-queue",
= "fastrand",
@@ -369,9 +368,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
=
=[[package]]
=name = "autocfg"
-version = "1.1.0"
+version = "1.2.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
=
=[[package]]
=name = "backtrace"
@@ -402,9 +401,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
=
=[[package]]
=name = "bevy"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "611dd99f412e862610adb43e2243b16436c6d8009f6d9dbe8ce3d6d840b34029"
+checksum = "65b9eadaacf8fe971331bc3f250f35c18bc9dace3f96b483062f38ac07e3a1b4"
=dependencies = [
= "bevy_internal",
=]
@@ -444,14 +443,14 @@ source = "git+https://github.com/jakobhellermann/bevy-inspector-egui?rev=1563fe9
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
=name = "bevy_a11y"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6192db480a04d4a0ad5d89a2fbd78ccca5ce902829a49ec2d1dbc213222ed8b1"
+checksum = "cd8ef2795f7f5c816a4eda04834083eb5a92e8fef603bc21d2091c6e3b63621a"
=dependencies = [
= "accesskit",
= "bevy_app",
@@ -461,9 +460,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_animation"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa4ef4c35533df3f0c4e938cf6a831456ea563775bab799336f74331140c7665"
+checksum = "e553d68bc937586010ed2194ac66b751bc6238cf622b3ed5a86f4e1581e94509"
=dependencies = [
= "bevy_app",
= "bevy_asset",
@@ -480,9 +479,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_app"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b508824497f3a3a2fab8398dc3944a4d4adddcc30ee25cd6d45b0a57336549ce"
+checksum = "ab348a32e46d21c5d61794294a92d415a770d26c7ba8951830b127b40b53ccc4"
=dependencies = [
= "bevy_derive",
= "bevy_ecs",
@@ -511,9 +510,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_asset"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccf224b57fb65e1cde921afe0b343c2d595531dbf882c41abad01bbc665a05c4"
+checksum = "50028e0d4f28a9f6aab48f61b688ba2793141188f88cdc9aa6c2bca2cc02ad35"
=dependencies = [
= "async-broadcast",
= "async-fs",
@@ -543,21 +542,21 @@ dependencies = [
=
=[[package]]
=name = "bevy_asset_macros"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "684c855651e7734740b76ada0e7daed116c46d393f9031cc45c4fe9ad5829548"
+checksum = "6617475908368418d815360148fdbb82f879dc255a70d2d7baa3766f0cd4bfd7"
=dependencies = [
= "bevy_macro_utils",
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
=name = "bevy_audio"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4fe7f952e5e0a343fbde43180db7b8e719ad78594480c91b26876623944a3a1"
+checksum = "b0f12495e230cd5cf59c6051cdd820c97d7fe4f0597d4d9c3240c62e9c65b485"
=dependencies = [
= "bevy_app",
= "bevy_asset",
@@ -567,15 +566,15 @@ dependencies = [
= "bevy_reflect",
= "bevy_transform",
= "bevy_utils",
- "oboe 0.5.0",
+ "cpal",
= "rodio",
=]
=
=[[package]]
=name = "bevy_core"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1a8f4722fb978d308b6311f3dd61f6885165055ad05ce3dfc1b2fd001bb017e"
+checksum = "12b0042f241ba7cd61487aadd8addfb56f7eeb662d713ac1577026704508fc6c"
=dependencies = [
= "bevy_app",
= "bevy_ecs",
@@ -589,9 +588,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_core_pipeline"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "626a5aaadbdd69eae020c5856575d2d0113423ae1ae1351377e20956d940052c"
+checksum = "48b7a471cb8ba665f12f7a167faa5566c11386f5bfc77d2e10bfde22b179f7b3"
=dependencies = [
= "bevy_app",
= "bevy_asset",
@@ -604,27 +603,27 @@ dependencies = [
= "bevy_render",
= "bevy_transform",
= "bevy_utils",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "radsort",
= "serde",
=]
=
=[[package]]
=name = "bevy_derive"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7de77523d154e220a740e568a89f52fac7de481374bdecbbbeb283a37580ba34"
+checksum = "f0e01f8343f391e2d6a63b368b82fb5b252ed43c8713fc87f9a8f2d59407dd00"
=dependencies = [
= "bevy_macro_utils",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
=name = "bevy_diagnostic"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01a104acfdc5280accd01a3524810daf3bda72924e3da0c8a9ec816a57eef4e3"
+checksum = "e1401cdccec7e49378d013dfb0ff62c251f85b3be19dcdf04cfd827f793d1ee9"
=dependencies = [
= "bevy_app",
= "bevy_core",
@@ -638,9 +637,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_ecs"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a027175613f630a51273c0f8ae909dd54ea3ce72eb573f456056553f79918ac"
+checksum = "98e612a8e7962ead849e370f3a7e972b88df879ced05cd9dad6a0286d14650cf"
=dependencies = [
= "async-channel",
= "bevy_ecs_macros",
@@ -658,14 +657,14 @@ dependencies = [
=
=[[package]]
=name = "bevy_ecs_macros"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55dbbb6300f08cef5983497970db8545d3cbda6ee4f410a6c6742b7b6bbfd3af"
+checksum = "807b5106c3410e58f4f523b55ea3c071e2a09e31e9510f3c22021c6a04732b5b"
=dependencies = [
= "bevy_macro_utils",
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
@@ -684,9 +683,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_encase_derive"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df72ac1273fcdb8105736c42815442ae1291f1f577e34cb7e9d18f732103e2f0"
+checksum = "887087a5e522d9f20733a84dd7e6e9ca04cd8fdfac659220ed87d675eebc83a7"
=dependencies = [
= "bevy_macro_utils",
= "encase_derive_impl",
@@ -713,14 +712,14 @@ checksum = "fa29be733a02a5d7ca4507ef15f294711c1a0884b9a9a2730640ff4e7d0200ab"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
=name = "bevy_gilrs"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96364a1875ee4545fcf825c78dc065ddb9a3b2a509083ef11142f9de0eb8aa17"
+checksum = "7d133c65ab756f130c65cf00f37dc293fb9a9336c891802baf006c63e300d0e2"
=dependencies = [
= "bevy_app",
= "bevy_ecs",
@@ -734,9 +733,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_gizmos"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdca80b7b4db340eb666d69374a0195b3935759120d0b990fcef8b27d0fb3680"
+checksum = "054df3550a9d423a961de65b459946ff23304f97f25af8a62c23f4259db8506d"
=dependencies = [
= "bevy_app",
= "bevy_asset",
@@ -756,21 +755,21 @@ dependencies = [
=
=[[package]]
=name = "bevy_gizmos_macros"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a949eb8b4538a6e4d875321cda2b63dc0fb0317cf18c8245ca5a32f24f6d26d"
+checksum = "abdcaf74d8cd34aa5c3293527e7a012826840886ad3496c1b963ed8b66b1619f"
=dependencies = [
= "bevy_macro_utils",
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
=name = "bevy_gltf"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "031d0c2a7c0353bb9ac08a5130e58b9a2de3cdaa3c31b5da00b22a9e4732a155"
+checksum = "21ecf404295055deb7fe037495891bc135ca10d46bc5b6c55f9ab7b7ebc61d31"
=dependencies = [
= "base64",
= "bevy_animation",
@@ -798,9 +797,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_hierarchy"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b2999d1e5bb877b475c9b2d17643d5fb47fc4cc49ea48ba3ab5a6b00ed850a6"
+checksum = "bbb3dfad24866a6713dafa3065a91c5cf5e355f6e1b191c25d704ae54185246c"
=dependencies = [
= "bevy_app",
= "bevy_core",
@@ -812,9 +811,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_input"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c22481e4290e2eca68b0c1f5f0a826f185d8f5e40e05c86bb6044dcfe3a04b3"
+checksum = "47f2b2b3df168c6ef661d25e09abf5bd4fecaacd400f27e5db650df1c3fa3a3b"
=dependencies = [
= "bevy_app",
= "bevy_ecs",
@@ -828,9 +827,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_internal"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7af89c7083830b1d65fcf0260c3d2537c397fe8ce871471b6e97198a4704f23e"
+checksum = "f58ec0ce77603df9474cde61f429126bfe06eb79094440e9141afb4217751c79"
=dependencies = [
= "bevy_a11y",
= "bevy_animation",
@@ -867,9 +866,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_log"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20c7b4e2443654d68b6f8c54e5f1ce3a16c8a9af10f4832390dcae36c1323307"
+checksum = "a5eea6c527fd828b7fef8d0f518167f27f405b904a16f227b644687d3f46a809"
=dependencies = [
= "android_log-sys",
= "bevy_app",
@@ -883,22 +882,22 @@ dependencies = [
=
=[[package]]
=name = "bevy_macro_utils"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3bbbf88fc577a21ee9994feed2253ee9838b63fb976783b7a549edfbe07c6764"
+checksum = "eb270c98a96243b29465139ed10bda2f675d00a11904f6588a5f7fc4774119c7"
=dependencies = [
= "proc-macro2",
= "quote",
= "rustc-hash",
- "syn 2.0.52",
+ "syn 2.0.60",
= "toml_edit",
=]
=
=[[package]]
=name = "bevy_math"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d30721f36a0b5f9ad39deb140c50b85cbbaefebab8d10bd20d9de1c9572f968"
+checksum = "f06daa26ffb82d90ba772256c0ba286f6c305c392f6976c9822717974805837c"
=dependencies = [
= "glam",
= "serde",
@@ -906,9 +905,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_mikktspace"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc081a695c3513f09fdc640bf7f66cd73c47eb479da50312bf9710ee6927729d"
+checksum = "a0d7ef7f2a826d0b19f059035831ce00a5e930435cc53c61e045773d0483f67a"
=dependencies = [
= "glam",
=]
@@ -965,9 +964,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_pbr"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31c72bf12e50ff76c9ed9a7c51ceb88bfea9865d00f24d95b12344fffe1e270"
+checksum = "75b29c80269fa6db55c9e33701edd3ecb73d8866ca8cb814d49a9d3fb72531b6"
=dependencies = [
= "bevy_app",
= "bevy_asset",
@@ -980,7 +979,7 @@ dependencies = [
= "bevy_transform",
= "bevy_utils",
= "bevy_window",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "bytemuck",
= "fixedbitset",
= "radsort",
@@ -1125,15 +1124,15 @@ dependencies = [
=
=[[package]]
=name = "bevy_ptr"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea003584000ef02b73800cc7cb62ee74792fff431e6a8df36863c43bf56fb491"
+checksum = "8050e2869fe341db6874203b5a01ff12673807a2c7c80cb829f6c7bea6997268"
=
=[[package]]
=name = "bevy_reflect"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1101dbd44ae35e5c66802e46cfba1182e49f6163c824bee380d4acab5b2f640"
+checksum = "ccbd7de21d586457a340a0962ad0747dc5098ff925eb6b27a918c4bdd8252f7b"
=dependencies = [
= "bevy_math",
= "bevy_ptr",
@@ -1149,22 +1148,22 @@ dependencies = [
=
=[[package]]
=name = "bevy_reflect_derive"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2a8791d5841a6db862571f709d7ee70c2a5eb1634c3a4329817d04f0e307c2d"
+checksum = "3ce33051bd49036d4a5a62aa3f2068672ec55f3ebe92aa0d003a341f15cc37ac"
=dependencies = [
= "bevy_macro_utils",
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
= "uuid",
=]
=
=[[package]]
=name = "bevy_render"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75bbb48471f8cd06f5253e271f9b793695f5b821fc9d39a875497905578d9867"
+checksum = "88b2c4b644c739c0b474b6f8f7b0bc68ac13d83b59688781e9a7753c52780177"
=dependencies = [
= "async-channel",
= "bevy_app",
@@ -1184,7 +1183,7 @@ dependencies = [
= "bevy_transform",
= "bevy_utils",
= "bevy_window",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "bytemuck",
= "codespan-reporting",
= "downcast-rs",
@@ -1207,21 +1206,21 @@ dependencies = [
=
=[[package]]
=name = "bevy_render_macros"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffd61a89e7a1b55c78a0aef1fcadd0247fe74a101c00f831791db73d63465051"
+checksum = "720b88406e786e378829b7d43c1ffb5300186912b99904d0d4d8ec6698a4f210"
=dependencies = [
= "bevy_macro_utils",
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
=name = "bevy_rts_camera"
-version = "0.4.0"
+version = "0.4.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b52a24bd525131eae1f27f60b9434ed4f449714ff545bdabdaeeeae67c20ecd"
+checksum = "d7e1784c11a86508988e3db12a52109a3fe3436c13386bbbc8e60de5646e1033"
=dependencies = [
= "bevy",
= "bevy_mod_raycast",
@@ -1229,9 +1228,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_scene"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c3c82eaff0b22949183a75a7e2d7fc4ece808235918b34c5b282aab52c3563a"
+checksum = "1f3d2caa1bfe7542dbe2c62e1bcc10791ba181fb744d2fe6711d1d373354da7c"
=dependencies = [
= "bevy_app",
= "bevy_asset",
@@ -1249,9 +1248,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_sprite"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ea977d7d7c48fc4ba283d449f09528c4e70db17c9048e32e99ecd9890d72223"
+checksum = "8cad1b555161f50e5d62b7fdf7ebeef1b24338aae7a88e51985da9553cd60ddf"
=dependencies = [
= "bevy_app",
= "bevy_asset",
@@ -1264,7 +1263,7 @@ dependencies = [
= "bevy_render",
= "bevy_transform",
= "bevy_utils",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "bytemuck",
= "fixedbitset",
= "guillotiere",
@@ -1275,9 +1274,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_tasks"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40be36aeec06b8f0eb87894922c6a7fbd8f2a5c8e77dcb9dcbf77641046988c0"
+checksum = "f07fcc4969b357de143509925b39c9a2c56eaa8750828d97f319ca9ed41897cb"
=dependencies = [
= "async-channel",
= "async-executor",
@@ -1289,9 +1288,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_text"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "006990d27551dbc339774178e833290952511621662fd5ca23a4e6e922ab2d9f"
+checksum = "c4e8456ae0bea7d6b7621e42c1c12bf66c0891381e62c948ab23920673ce611c"
=dependencies = [
= "ab_glyph",
= "bevy_app",
@@ -1311,9 +1310,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_time"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06fc48cf59acd2b1c52e61787b5bb3db1a0f923cc6ccc68c0d8ab2b5894cfd28"
+checksum = "38ea5ae9fe7f56f555dbb05a88d34931907873e3f0c7dc426591839eef72fe3e"
=dependencies = [
= "bevy_app",
= "bevy_ecs",
@@ -1326,9 +1325,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_transform"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b962ae4253f5413b64a839ab8e8d63bc3e3db45f41d06b6ddc7886acdcb5d0f5"
+checksum = "a0d51a1f332cc00939d2f19ed6b909e5ed7037e39c7e25cc86930d79d432163e"
=dependencies = [
= "bevy_app",
= "bevy_ecs",
@@ -1341,9 +1340,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_ui"
-version = "0.13.0"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fafe872906bac6d7fc8ecff166f56b4253465b2895ed88801499aa113548ccc6"
+checksum = "b6bbc30be39cfbfa3a073b541d22aea43ab14452dea12d7411ce201df17ff7b1"
=dependencies = [
= "bevy_a11y",
= "bevy_app",
@@ -1370,9 +1369,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_utils"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac758c2e8509a4a260b7a91f920be3beee6ab9e76e388494240ac5d672779159"
+checksum = "5a9f845a985c00e0ee8dc2d8af3f417be925fb52aad4bda5b96e2e58a2b4d2eb"
=dependencies = [
= "ahash",
= "bevy_utils_proc_macros",
@@ -1389,20 +1388,20 @@ dependencies = [
=
=[[package]]
=name = "bevy_utils_proc_macros"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "014c80f466ed01821a2e602d63cd5076915c1af5de5fa3c074cc4a9ca898ada7"
+checksum = "bef158627f30503d5c18c20c60b444829f698d343516eeaf6eeee078c9a45163"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
=name = "bevy_window"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa0c2a1e580b3b0ad0c928a5e250c8375c6a8a70d8b0f483b23d3bf5b670cc1a"
+checksum = "976202d2ed838176595b550ac654b15ae236e0178a6f19a94ca6d58f2a96ca60"
=dependencies = [
= "bevy_a11y",
= "bevy_app",
@@ -1418,9 +1417,9 @@ dependencies = [
=
=[[package]]
=name = "bevy_winit"
-version = "0.13.1"
+version = "0.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2c408d459172758a4cfa37e3452d4ea0898101ec2b6d92aa3eb698511bef389"
+checksum = "aa66539aa93d8522b146bf82de429714ea6370a6061fc1f1ff7bcacd4e64c6c4"
=dependencies = [
= "accesskit_winit",
= "approx",
@@ -1447,7 +1446,7 @@ version = "0.69.4"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "cexpr",
= "clang-sys",
= "itertools",
@@ -1458,7 +1457,7 @@ dependencies = [
= "regex",
= "rustc-hash",
= "shlex",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
@@ -1484,9 +1483,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
=
=[[package]]
=name = "bitflags"
-version = "2.4.2"
+version = "2.5.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
+checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
=dependencies = [
= "serde",
=]
@@ -1534,7 +1533,7 @@ version = "0.2.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7"
=dependencies = [
- "objc-sys 0.3.2",
+ "objc-sys 0.3.3",
=]
=
=[[package]]
@@ -1575,9 +1574,9 @@ dependencies = [
=
=[[package]]
=name = "bumpalo"
-version = "3.15.4"
+version = "3.16.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa"
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
=
=[[package]]
=name = "bytemuck"
@@ -1596,7 +1595,7 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
@@ -1607,9 +1606,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
=
=[[package]]
=name = "bytes"
-version = "1.5.0"
+version = "1.6.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
=
=[[package]]
=name = "calloop"
@@ -1617,7 +1616,7 @@ version = "0.12.4"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "log",
= "polling",
= "rustix",
@@ -1639,9 +1638,9 @@ dependencies = [
=
=[[package]]
=name = "cc"
-version = "1.0.90"
+version = "1.0.94"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5"
+checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7"
=dependencies = [
= "jobserver",
= "libc",
@@ -1716,7 +1715,7 @@ dependencies = [
= "heck 0.5.0",
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
@@ -1727,9 +1726,9 @@ checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
=
=[[package]]
=name = "clipboard-win"
-version = "5.2.0"
+version = "5.3.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12f9a0700e0127ba15d1d52dd742097f821cd9c65939303a44d970465040a297"
+checksum = "79f4473f5144e20d9aceaf2972478f06ddf687831eafeeb434fbaf0acc4144ad"
=dependencies = [
= "error-code",
=]
@@ -1789,9 +1788,9 @@ dependencies = [
=
=[[package]]
=name = "combine"
-version = "4.6.6"
+version = "4.6.7"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4"
+checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
=dependencies = [
= "bytes",
= "memchr",
@@ -1848,9 +1847,9 @@ checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2"
=
=[[package]]
=name = "constgebra"
-version = "0.1.3"
+version = "0.1.4"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edd23e864550e6dafc1e41ac78ce4f1ccddc8672b40c403524a04ff3f0518420"
+checksum = "e1aaf9b65849a68662ac6c0810c8893a765c960b907dd7cfab9c4a50bf764fbc"
=dependencies = [
= "const_soft_float",
=]
@@ -1879,9 +1878,9 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
=
=[[package]]
=name = "core-graphics"
-version = "0.23.1"
+version = "0.23.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212"
+checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"
=dependencies = [
= "bitflags 1.3.2",
= "core-foundation",
@@ -1937,7 +1936,7 @@ dependencies = [
= "mach2",
= "ndk",
= "ndk-context",
- "oboe 0.6.1",
+ "oboe",
= "wasm-bindgen",
= "wasm-bindgen-futures",
= "web-sys",
@@ -1955,9 +1954,9 @@ dependencies = [
=
=[[package]]
=name = "crc"
-version = "3.0.1"
+version = "3.2.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe"
+checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
=dependencies = [
= "crc-catalog",
=]
@@ -2023,7 +2022,7 @@ version = "0.19.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "libloading 0.8.3",
= "winapi",
=]
@@ -2042,9 +2041,9 @@ checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
=
=[[package]]
=name = "der"
-version = "0.7.8"
+version = "0.7.9"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c"
+checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0"
=dependencies = [
= "const-oid",
= "pem-rfc7468",
@@ -2099,9 +2098,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
=
=[[package]]
=name = "downcast-rs"
-version = "1.2.0"
+version = "1.2.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
+checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
=
=[[package]]
=name = "ecolor"
@@ -2125,9 +2124,9 @@ dependencies = [
=
=[[package]]
=name = "either"
-version = "1.10.0"
+version = "1.11.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"
+checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2"
=dependencies = [
= "serde",
=]
@@ -2170,7 +2169,7 @@ checksum = "92959a9e8d13eaa13b8ae8c7b583c3bf1669ca7a8e7708a088d12587ba86effc"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
@@ -2258,9 +2257,9 @@ dependencies = [
=
=[[package]]
=name = "event-listener"
-version = "5.2.0"
+version = "5.3.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91"
+checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24"
=dependencies = [
= "concurrent-queue",
= "parking",
@@ -2279,19 +2278,19 @@ dependencies = [
=
=[[package]]
=name = "event-listener-strategy"
-version = "0.5.0"
+version = "0.5.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291"
+checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3"
=dependencies = [
- "event-listener 5.2.0",
+ "event-listener 5.3.0",
= "pin-project-lite",
=]
=
=[[package]]
=name = "fastrand"
-version = "2.0.1"
+version = "2.0.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984"
=
=[[package]]
=name = "fdeflate"
@@ -2359,7 +2358,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
@@ -2423,9 +2422,9 @@ checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
=
=[[package]]
=name = "futures-lite"
-version = "2.2.0"
+version = "2.3.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba"
+checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5"
=dependencies = [
= "fastrand",
= "futures-core",
@@ -2484,9 +2483,9 @@ dependencies = [
=
=[[package]]
=name = "getrandom"
-version = "0.2.12"
+version = "0.2.14"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
+checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
=dependencies = [
= "cfg-if",
= "js-sys",
@@ -2497,9 +2496,9 @@ dependencies = [
=
=[[package]]
=name = "gilrs"
-version = "0.10.5"
+version = "0.10.6"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0510502768c64b944bf4d1518ba36e2431c638ac996ebacb543a297b145f8300"
+checksum = "499067aa54af19f88732dc418f61f23d5912de1518665bb0eca034ca0d07574c"
=dependencies = [
= "fnv",
= "gilrs-core",
@@ -2630,7 +2629,7 @@ dependencies = [
= "inflections",
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
@@ -2671,7 +2670,7 @@ version = "0.6.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "gpu-alloc-types",
=]
=
@@ -2681,7 +2680,7 @@ version = "0.3.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
=]
=
=[[package]]
@@ -2703,7 +2702,7 @@ version = "0.2.4"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "gpu-descriptor-types",
= "hashbrown",
=]
@@ -2714,7 +2713,7 @@ version = "0.1.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
=]
=
=[[package]]
@@ -2759,7 +2758,7 @@ version = "0.11.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "com",
= "libc",
= "libloading 0.8.3",
@@ -2783,6 +2782,12 @@ version = "0.5.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
=
+[[package]]
+name = "hermit-abi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+
=[[package]]
=name = "hex"
=version = "0.4.3"
@@ -2869,9 +2874,9 @@ dependencies = [
=
=[[package]]
=name = "indexmap"
-version = "2.2.5"
+version = "2.2.6"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4"
+checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
=dependencies = [
= "equivalent",
= "hashbrown",
@@ -2905,9 +2910,9 @@ dependencies = [
=
=[[package]]
=name = "io-kit-sys"
-version = "0.4.0"
+version = "0.4.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4769cb30e5dcf1710fc6730d3e94f78c47723a014a567de385e113c737394640"
+checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b"
=dependencies = [
= "core-foundation-sys",
= "mach2",
@@ -2924,9 +2929,9 @@ dependencies = [
=
=[[package]]
=name = "itoa"
-version = "1.0.10"
+version = "1.0.11"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
=
=[[package]]
=name = "jni"
@@ -2952,9 +2957,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
=
=[[package]]
=name = "jobserver"
-version = "0.1.28"
+version = "0.1.30"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6"
+checksum = "685a7d121ee3f65ae4fddd72b25a04bb36b6af81bc0828f7d5434c0fe60fa3a2"
=dependencies = [
= "libc",
=]
@@ -3049,7 +3054,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19"
=dependencies = [
= "cfg-if",
- "windows-targets 0.52.4",
+ "windows-targets 0.52.5",
=]
=
=[[package]]
@@ -3064,7 +3069,7 @@ version = "0.0.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "libc",
= "redox_syscall 0.4.1",
=]
@@ -3151,9 +3156,9 @@ dependencies = [
=
=[[package]]
=name = "memchr"
-version = "2.7.1"
+version = "2.7.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
+checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
=
=[[package]]
=name = "memmap2"
@@ -3170,7 +3175,7 @@ version = "0.27.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "block",
= "core-graphics-types",
= "foreign-types",
@@ -3197,9 +3202,9 @@ dependencies = [
=
=[[package]]
=name = "mio"
-version = "0.8.10"
+version = "0.8.11"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
+checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
=dependencies = [
= "libc",
= "wasi",
@@ -3213,7 +3218,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843"
=dependencies = [
= "bit-set",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "codespan-reporting",
= "hexf-parse",
= "indexmap",
@@ -3240,7 +3245,7 @@ dependencies = [
= "naga",
= "once_cell",
= "regex",
- "regex-syntax 0.8.2",
+ "regex-syntax 0.8.3",
= "rustc-hash",
= "thiserror",
= "tracing",
@@ -3253,7 +3258,7 @@ version = "0.8.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "jni-sys",
= "log",
= "ndk-sys",
@@ -3283,7 +3288,7 @@ version = "0.28.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "cfg-if",
= "cfg_aliases",
= "libc",
@@ -3347,17 +3352,6 @@ dependencies = [
= "zeroize",
=]
=
-[[package]]
-name = "num-derive"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
=[[package]]
=name = "num-derive"
=version = "0.4.2"
@@ -3366,7 +3360,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
@@ -3417,7 +3411,7 @@ dependencies = [
= "proc-macro-crate",
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
@@ -3449,9 +3443,9 @@ checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7"
=
=[[package]]
=name = "objc-sys"
-version = "0.3.2"
+version = "0.3.3"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7c71324e4180d0899963fc83d9d241ac39e699609fc1025a850aadac8257459"
+checksum = "da284c198fb9b7b0603f8635185e85fbd5b64ee154b1ed406d489077de2d6d60"
=
=[[package]]
=name = "objc2"
@@ -3470,7 +3464,7 @@ version = "0.4.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d"
=dependencies = [
- "objc-sys 0.3.2",
+ "objc-sys 0.3.3",
= "objc2-encode 3.0.0",
=]
=
@@ -3516,17 +3510,6 @@ dependencies = [
= "memchr",
=]
=
-[[package]]
-name = "oboe"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0"
-dependencies = [
- "num-derive 0.3.3",
- "num-traits",
- "oboe-sys 0.5.0",
-]
-
=[[package]]
=name = "oboe"
=version = "0.6.1"
@@ -3536,18 +3519,9 @@ dependencies = [
= "jni",
= "ndk",
= "ndk-context",
- "num-derive 0.4.2",
+ "num-derive",
= "num-traits",
- "oboe-sys 0.6.1",
-]
-
-[[package]]
-name = "oboe-sys"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2"
-dependencies = [
- "cc",
+ "oboe-sys",
=]
=
=[[package]]
@@ -3690,9 +3664,9 @@ dependencies = [
=
=[[package]]
=name = "pin-project-lite"
-version = "0.2.13"
+version = "0.2.14"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
=
=[[package]]
=name = "pin-utils"
@@ -3753,12 +3727,13 @@ dependencies = [
=
=[[package]]
=name = "polling"
-version = "3.5.0"
+version = "3.6.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9"
+checksum = "e0c976a60b2d7e99d6f229e414670a9b85d13ac305cc6d1e9c134de58c5aaaf6"
=dependencies = [
= "cfg-if",
= "concurrent-queue",
+ "hermit-abi",
= "pin-project-lite",
= "rustix",
= "tracing",
@@ -3803,9 +3778,9 @@ dependencies = [
=
=[[package]]
=name = "proc-macro2"
-version = "1.0.79"
+version = "1.0.81"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e"
+checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba"
=dependencies = [
= "unicode-ident",
=]
@@ -3827,9 +3802,9 @@ dependencies = [
=
=[[package]]
=name = "quote"
-version = "1.0.35"
+version = "1.0.36"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
=dependencies = [
= "proc-macro2",
=]
@@ -3914,14 +3889,14 @@ dependencies = [
=
=[[package]]
=name = "regex"
-version = "1.10.3"
+version = "1.10.4"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
+checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
=dependencies = [
= "aho-corasick",
= "memchr",
= "regex-automata 0.4.6",
- "regex-syntax 0.8.2",
+ "regex-syntax 0.8.3",
=]
=
=[[package]]
@@ -3941,7 +3916,7 @@ checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
=dependencies = [
= "aho-corasick",
= "memchr",
- "regex-syntax 0.8.2",
+ "regex-syntax 0.8.3",
=]
=
=[[package]]
@@ -3952,9 +3927,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
=
=[[package]]
=name = "regex-syntax"
-version = "0.8.2"
+version = "0.8.3"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
=
=[[package]]
=name = "renderdoc-sys"
@@ -3979,7 +3954,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
=dependencies = [
= "base64",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "serde",
= "serde_derive",
=]
@@ -4027,11 +4002,11 @@ dependencies = [
=
=[[package]]
=name = "rustix"
-version = "0.38.31"
+version = "0.38.32"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
+checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "errno",
= "libc",
= "linux-raw-sys",
@@ -4097,29 +4072,29 @@ checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
=
=[[package]]
=name = "serde"
-version = "1.0.197"
+version = "1.0.198"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
+checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc"
=dependencies = [
= "serde_derive",
=]
=
=[[package]]
=name = "serde_derive"
-version = "1.0.197"
+version = "1.0.198"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
+checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
=name = "serde_json"
-version = "1.0.114"
+version = "1.0.116"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0"
+checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813"
=dependencies = [
= "itoa",
= "ryu",
@@ -4210,9 +4185,9 @@ dependencies = [
=
=[[package]]
=name = "smallvec"
-version = "1.13.1"
+version = "1.13.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
=dependencies = [
= "serde",
=]
@@ -4223,7 +4198,7 @@ version = "0.18.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "calloop",
= "calloop-wayland-source",
= "cursor-icon",
@@ -4282,7 +4257,7 @@ version = "0.3.0+sdk-1.3.268.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
=]
=
=[[package]]
@@ -4404,7 +4379,7 @@ checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418"
=dependencies = [
= "atoi",
= "base64",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "byteorder",
= "bytes",
= "crc",
@@ -4446,7 +4421,7 @@ checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e"
=dependencies = [
= "atoi",
= "base64",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "byteorder",
= "crc",
= "dotenvy",
@@ -4524,9 +4499,9 @@ dependencies = [
=
=[[package]]
=name = "strsim"
-version = "0.11.0"
+version = "0.11.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
=
=[[package]]
=name = "subtle"
@@ -4553,9 +4528,9 @@ dependencies = [
=
=[[package]]
=name = "syn"
-version = "2.0.52"
+version = "2.0.60"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07"
+checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3"
=dependencies = [
= "proc-macro2",
= "quote",
@@ -4564,9 +4539,9 @@ dependencies = [
=
=[[package]]
=name = "sysinfo"
-version = "0.30.7"
+version = "0.30.11"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c385888ef380a852a16209afc8cfad22795dd8873d69c9a14d2e2088f118d18"
+checksum = "87341a165d73787554941cd5ef55ad728011566fe714e987d1b976c15dbc3a83"
=dependencies = [
= "cfg-if",
= "core-foundation-sys",
@@ -4578,9 +4553,9 @@ dependencies = [
=
=[[package]]
=name = "taffy"
-version = "0.3.18"
+version = "0.3.19"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c2287b6d7f721ada4cddf61ade5e760b2c6207df041cac9bfaa192897362fd3"
+checksum = "b1315457ccd9c3def787a18fae91914e623e4dcff019b64ce39f5268ded53d3d"
=dependencies = [
= "arrayvec",
= "grid",
@@ -4626,7 +4601,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
@@ -4714,14 +4689,14 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
=name = "tokio-stream"
-version = "0.1.14"
+version = "0.1.15"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
+checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
=dependencies = [
= "futures-core",
= "pin-project-lite",
@@ -4765,7 +4740,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]
@@ -4921,9 +4896,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
=
=[[package]]
=name = "uuid"
-version = "1.7.0"
+version = "1.8.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a"
+checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0"
=dependencies = [
= "getrandom",
= "serde",
@@ -4996,7 +4971,7 @@ dependencies = [
= "once_cell",
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
= "wasm-bindgen-shared",
=]
=
@@ -5030,7 +5005,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
= "wasm-bindgen-backend",
= "wasm-bindgen-shared",
=]
@@ -5061,7 +5036,7 @@ version = "0.31.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "rustix",
= "wayland-backend",
= "wayland-scanner",
@@ -5073,7 +5048,7 @@ version = "0.3.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "cursor-icon",
= "wayland-backend",
=]
@@ -5095,7 +5070,7 @@ version = "0.31.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "wayland-backend",
= "wayland-client",
= "wayland-scanner",
@@ -5107,7 +5082,7 @@ version = "0.2.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "wayland-backend",
= "wayland-client",
= "wayland-protocols",
@@ -5120,7 +5095,7 @@ version = "0.2.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "wayland-backend",
= "wayland-client",
= "wayland-protocols",
@@ -5171,9 +5146,9 @@ dependencies = [
=
=[[package]]
=name = "webbrowser"
-version = "0.8.13"
+version = "0.8.15"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1b04c569c83a9bb971dd47ec6fd48753315f4bf989b9b04a2e7ca4d7f0dc950"
+checksum = "db67ae75a9405634f5882791678772c94ff5f16a66535aae186e26aa0841fc8b"
=dependencies = [
= "core-foundation",
= "home",
@@ -5194,9 +5169,9 @@ checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
=
=[[package]]
=name = "wgpu"
-version = "0.19.3"
+version = "0.19.4"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4b1213b52478a7631d6e387543ed8f642bc02c578ef4e3b49aca2a29a7df0cb"
+checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01"
=dependencies = [
= "arrayvec",
= "cfg-if",
@@ -5219,13 +5194,13 @@ dependencies = [
=
=[[package]]
=name = "wgpu-core"
-version = "0.19.3"
+version = "0.19.4"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9f6b033c2f00ae0bc8ea872c5989777c60bc241aac4e58b24774faa8b391f78"
+checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a"
=dependencies = [
= "arrayvec",
= "bit-vec",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "cfg_aliases",
= "codespan-reporting",
= "indexmap",
@@ -5245,15 +5220,15 @@ dependencies = [
=
=[[package]]
=name = "wgpu-hal"
-version = "0.19.3"
+version = "0.19.4"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f972c280505ab52ffe17e94a7413d9d54b58af0114ab226b9fc4999a47082e"
+checksum = "fc1a4924366df7ab41a5d8546d6534f1f33231aa5b3f72b9930e300f254e39c3"
=dependencies = [
= "android_system_properties",
= "arrayvec",
= "ash",
= "bit-set",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "block",
= "cfg_aliases",
= "core-graphics-types",
@@ -5294,7 +5269,7 @@ version = "0.19.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "js-sys",
= "web-sys",
=]
@@ -5311,9 +5286,9 @@ dependencies = [
=
=[[package]]
=name = "widestring"
-version = "1.0.2"
+version = "1.1.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8"
+checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311"
=
=[[package]]
=name = "winapi"
@@ -5364,7 +5339,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
=dependencies = [
= "windows-core 0.52.0",
- "windows-targets 0.52.4",
+ "windows-targets 0.52.5",
=]
=
=[[package]]
@@ -5374,7 +5349,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49"
=dependencies = [
= "windows-core 0.54.0",
- "windows-targets 0.52.4",
+ "windows-targets 0.52.5",
=]
=
=[[package]]
@@ -5383,7 +5358,7 @@ version = "0.52.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
=dependencies = [
- "windows-targets 0.52.4",
+ "windows-targets 0.52.5",
=]
=
=[[package]]
@@ -5393,7 +5368,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65"
=dependencies = [
= "windows-result",
- "windows-targets 0.52.4",
+ "windows-targets 0.52.5",
=]
=
=[[package]]
@@ -5420,11 +5395,11 @@ dependencies = [
=
=[[package]]
=name = "windows-result"
-version = "0.1.0"
+version = "0.1.1"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd19df78e5168dfb0aedc343d1d1b8d422ab2db6756d2dc3fef75035402a3f64"
+checksum = "749f0da9cc72d82e600d8d2e44cadd0b9eedb9038f71a1c58556ac1c5791813b"
=dependencies = [
- "windows-targets 0.52.4",
+ "windows-targets 0.52.5",
=]
=
=[[package]]
@@ -5451,7 +5426,7 @@ version = "0.52.0"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
=dependencies = [
- "windows-targets 0.52.4",
+ "windows-targets 0.52.5",
=]
=
=[[package]]
@@ -5486,17 +5461,18 @@ dependencies = [
=
=[[package]]
=name = "windows-targets"
-version = "0.52.4"
+version = "0.52.5"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b"
+checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
=dependencies = [
- "windows_aarch64_gnullvm 0.52.4",
- "windows_aarch64_msvc 0.52.4",
- "windows_i686_gnu 0.52.4",
- "windows_i686_msvc 0.52.4",
- "windows_x86_64_gnu 0.52.4",
- "windows_x86_64_gnullvm 0.52.4",
- "windows_x86_64_msvc 0.52.4",
+ "windows_aarch64_gnullvm 0.52.5",
+ "windows_aarch64_msvc 0.52.5",
+ "windows_i686_gnu 0.52.5",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.5",
+ "windows_x86_64_gnu 0.52.5",
+ "windows_x86_64_gnullvm 0.52.5",
+ "windows_x86_64_msvc 0.52.5",
=]
=
=[[package]]
@@ -5513,9 +5489,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
=
=[[package]]
=name = "windows_aarch64_gnullvm"
-version = "0.52.4"
+version = "0.52.5"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9"
+checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
=
=[[package]]
=name = "windows_aarch64_msvc"
@@ -5531,9 +5507,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
=
=[[package]]
=name = "windows_aarch64_msvc"
-version = "0.52.4"
+version = "0.52.5"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675"
+checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
=
=[[package]]
=name = "windows_i686_gnu"
@@ -5549,9 +5525,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
=
=[[package]]
=name = "windows_i686_gnu"
-version = "0.52.4"
+version = "0.52.5"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3"
+checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
=
=[[package]]
=name = "windows_i686_msvc"
@@ -5567,9 +5549,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
=
=[[package]]
=name = "windows_i686_msvc"
-version = "0.52.4"
+version = "0.52.5"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02"
+checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
=
=[[package]]
=name = "windows_x86_64_gnu"
@@ -5585,9 +5567,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
=
=[[package]]
=name = "windows_x86_64_gnu"
-version = "0.52.4"
+version = "0.52.5"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03"
+checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
=
=[[package]]
=name = "windows_x86_64_gnullvm"
@@ -5603,9 +5585,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
=
=[[package]]
=name = "windows_x86_64_gnullvm"
-version = "0.52.4"
+version = "0.52.5"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177"
+checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
=
=[[package]]
=name = "windows_x86_64_msvc"
@@ -5621,20 +5603,20 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
=
=[[package]]
=name = "windows_x86_64_msvc"
-version = "0.52.4"
+version = "0.52.5"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
+checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
=
=[[package]]
=name = "winit"
-version = "0.29.14"
+version = "0.29.15"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7a3db69ffbe53a9babec7804da7a90f21020fcce1f2f5e5291e2311245b993d"
+checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca"
=dependencies = [
= "ahash",
= "android-activity",
= "atomic-waker",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "bytemuck",
= "calloop",
= "cfg_aliases",
@@ -5732,7 +5714,7 @@ version = "0.4.2"
=source = "registry+https://github.com/rust-lang/crates.io-index"
=checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5"
=dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
= "dlib",
= "log",
= "once_cell",
@@ -5747,9 +5729,9 @@ checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621"
=
=[[package]]
=name = "xml-rs"
-version = "0.8.19"
+version = "0.8.20"
=source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a"
+checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193"
=
=[[package]]
=name = "zerocopy"
@@ -5768,7 +5750,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
=dependencies = [
= "proc-macro2",
= "quote",
- "syn 2.0.52",
+ "syn 2.0.60",
=]
=
=[[package]]

Update Nix dependencies

On by Tad Lispy

index 1e07b65..a07a714 100644
--- a/flake.lock
+++ b/flake.lock
@@ -38,11 +38,11 @@
=    },
=    "nixpkgs": {
=      "locked": {
-        "lastModified": 1710272261,
-        "narHash": "sha256-g0bDwXFmTE7uGDOs9HcJsfLFhH7fOsASbAuOzDC+fhQ=",
+        "lastModified": 1713297878,
+        "narHash": "sha256-hOkzkhLT59wR8VaMbh1ESjtZLbGi+XNaBN6h49SPqEc=",
=        "owner": "NixOS",
=        "repo": "nixpkgs",
-        "rev": "0ad13a6833440b8e238947e47bea7f11071dc2b2",
+        "rev": "66adc1e47f8784803f2deb6cacd5e07264ec2d5c",
=        "type": "github"
=      },
=      "original": {
@@ -81,11 +81,11 @@
=        "nixpkgs": "nixpkgs_2"
=      },
=      "locked": {
-        "lastModified": 1710382258,
-        "narHash": "sha256-2FW1q+o34VBweYQiEkRaSEkNMq3ecrn83VzETeGiVbY=",
+        "lastModified": 1713492869,
+        "narHash": "sha256-Zv+ZQq3X+EH6oogkXaJ8dGN8t1v26kPZgC5bki04GnM=",
=        "owner": "oxalica",
=        "repo": "rust-overlay",
-        "rev": "8ce81e71ab04a7e906fae62da086d6ee5d6cfc21",
+        "rev": "1e9264d1214d3db00c795b41f75d55b5e153758e",
=        "type": "github"
=      },
=      "original": {