From a17ae88a9f676d81a186ddf0c30a689817fc6266 Mon Sep 17 00:00:00 2001 From: Elijah Voigt Date: Mon, 15 Sep 2025 11:48:00 -0700 Subject: [PATCH] trying to use avian for the events --- -rust-analyzer.log | 0 Cargo.lock | 94 +++++----------------------- TODO | 2 - examples/scroll.rs | 152 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 166 insertions(+), 82 deletions(-) create mode 100644 -rust-analyzer.log delete mode 100644 TODO create mode 100644 examples/scroll.rs diff --git a/-rust-analyzer.log b/-rust-analyzer.log new file mode 100644 index 0000000..e69de29 diff --git a/Cargo.lock b/Cargo.lock index 6aedcab..366cb6d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2889,11 +2889,11 @@ dependencies = [ [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -2988,7 +2988,7 @@ dependencies = [ "naga", "once_cell", "regex", - "regex-syntax 0.8.5", + "regex-syntax", "rustc-hash 1.1.0", "thiserror 1.0.69", "tracing", @@ -3127,12 +3127,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -3504,12 +3503,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "owned_ttf_parser" version = "0.25.0" @@ -4000,17 +3993,8 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -4021,15 +4005,9 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.5" @@ -4472,7 +4450,7 @@ dependencies = [ "memchr", "ntapi", "objc2-core-foundation", - "windows 0.57.0", + "windows 0.54.0", ] [[package]] @@ -4662,14 +4640,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -5211,16 +5189,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" -dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows" version = "0.58.0" @@ -5263,18 +5231,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-core" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" -dependencies = [ - "windows-implement 0.57.0", - "windows-interface 0.57.0", - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - [[package]] name = "windows-core" version = "0.58.0" @@ -5312,17 +5268,6 @@ dependencies = [ "windows-threading", ] -[[package]] -name = "windows-implement" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "windows-implement" version = "0.58.0" @@ -5345,17 +5290,6 @@ dependencies = [ "syn", ] -[[package]] -name = "windows-interface" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "windows-interface" version = "0.58.0" diff --git a/TODO b/TODO deleted file mode 100644 index 6c3de78..0000000 --- a/TODO +++ /dev/null @@ -1,2 +0,0 @@ -* setup CI template in web server running on port 8000 -* setup mock bevy app running on port 8001 w/ first app running in iframe diff --git a/examples/scroll.rs b/examples/scroll.rs new file mode 100644 index 0000000..f5e9349 --- /dev/null +++ b/examples/scroll.rs @@ -0,0 +1,152 @@ +use avian3d::math::Vector; +// TEMP +use bevy::{color::palettes::css::*, prelude::*}; +use avian2d::prelude::*; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_plugins(PhysicsPlugins::default()) + .insert_resource(ClearColor(WHITE.into())) + .add_systems(Startup, setup) + .add_systems(Update, move_player) + .add_systems(Update, follow_player) + .add_systems(Update, draw_gizmos) + .add_systems(Update, event_detection.run_if(on_event::.or(on_event::))) + .add_observer(set_tree_position) + .run(); +} + +#[derive(Component)] +struct Player; + +#[derive(Component)] +struct RenderGizmo; + +#[derive(Component)] +struct PlayArea; + +#[derive(Component, Debug)] +struct TreePos(isize); + +fn setup( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + commands.spawn(Camera2d); + + // Spawn "trees" (which are also sensors) + [ + ("TREE -3", -3), + ("TREE -2", -2), + ("TREE -2", -1), + ("TREE 1", 1), + ("TREE 2", 2), + ("TREE 3", 3), + ] + .iter() + .for_each(|(label, pos)| { + commands.spawn(( + RigidBody::Static, + Collider::rectangle(100.0, 250.0), + Mesh2d(meshes.add(Rectangle::new(100.0, 250.0))), + MeshMaterial2d(materials.add(Color::from(GREEN))), + TreePos(*pos), + children![Text2d::new(*label),], + )); + }); + + commands.spawn(( + Player, + RigidBody::Kinematic, + ExternalImpulse::default().with_persistence(true), + Collider::rectangle(50.0, 50.0), + Mesh2d(meshes.add(Rectangle::new(50.0, 50.0))), + MeshMaterial2d(materials.add(Color::from(RED))), + children![ + ( + Text2d::new("PLAYER"), + Transform::from_scale(Vec3::new(0.5, 0.5, 0.5)), + ), + ( + Text2d::new("PLAY AREA"), + Transform::from_xyz(0.0, 212.0, 1.0), + TextColor(BLACK.into()) + ), + ( + RenderGizmo, + PlayArea, + Visibility::Visible, + Transform::from_scale(Vec3::new(400.0, 400.0, 0.0)), + ), + ], + )); +} + +fn set_tree_position( + trigger: Trigger, + tree_pos: Query<&TreePos>, + mut commands: Commands, +) { + let TreePos(pos) = tree_pos.get(trigger.target()).unwrap(); + let x = if (*pos) > 0 { + (200.0 * (*pos) as f32) - 100.0 + } else { + (200.0 * (*pos) as f32) + 100.0 + }; + let t = Transform::from_xyz(x, 0.0, 0.0); + commands.entity(trigger.target()).insert(t); +} + +fn move_player( + keyboard_input: Res>, + mut player: Single<&mut ExternalImpulse, With>, +) { + const SPEED: f32 = 5.0; + if keyboard_input.pressed(KeyCode::ArrowLeft) { + player.set_impulse(Vec2::NEG_X * SPEED); + } else if keyboard_input.pressed(KeyCode::ArrowRight) { + player.set_impulse(Vec2::X * SPEED); + } +} + +fn follow_player( + player: Query<&Transform, (With, Changed)>, + mut camera: Single<&mut Transform, (With, Without)>, +) { + player.iter().for_each(|pt| { + camera.translation = pt.translation; + }); +} + +fn draw_gizmos(mut gizmos: Gizmos, play_area: Single<&GlobalTransform, With>) { + gizmos.rect_2d( + play_area.translation().truncate(), + play_area.scale().truncate(), + MAGENTA, + ) +} + +fn event_detection( + mut start_events: EventReader, + mut end_events: EventReader, + player: Single<&Player>, + trees: Query<&TreePos>, + keyboard_input: Res>, +) { + debug_assert!(!(start_events.is_empty() && end_events.is_empty())); + let s = start_events.read().map(|CollisionStarted(a, b)| (a, b)); + let e = end_events.read().map(|CollisionEnded(a, b)| (a, b)); + let mut events = s.chain(e); + let current_tree = events.find_map(|(a, b)| { + info!("{a:?}, {b:?}"); + trees.get(*a).or(trees.get(*b)).ok() + }); + info!("{:?}", current_tree); + if keyboard_input.pressed(KeyCode::ArrowLeft) { + // moving left + } else if keyboard_input.pressed(KeyCode::ArrowRight) { + // moving right + } +}