From 3b7b5851f538faffaa5e3fae13b741d28201df63 Mon Sep 17 00:00:00 2001 From: jacopograndi Date: Tue, 12 Jul 2022 23:56:04 +0200 Subject: goodbye dreamness, welcome yessnes --- Cargo.lock | 252 ++++++++++++++++++++++++++++++++++- Cargo.toml | 2 + assets/maps/NAME.txt | 8 +- src/main.rs | 370 ++++++++++++++++----------------------------------- 4 files changed, 370 insertions(+), 262 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e22e90a..5af2c85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -600,6 +600,19 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "bevy_rapier2d" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7eac8f9d432682b0d865fd382cc65f637b2d1d31b3ca5a05cb0e7f81a7f7eb3" +dependencies = [ + "bevy", + "bitflags", + "log", + "nalgebra", + "rapier2d", +] + [[package]] name = "bevy_reflect" version = "0.7.0" @@ -1238,6 +1251,20 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "crossbeam" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae5588f6b3c3cb05239e90bd110f257254aecd01e4635400391aeae07497845" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + [[package]] name = "crossbeam-channel" version = "0.5.4" @@ -1248,6 +1275,41 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "crossbeam-utils", + "memoffset", + "once_cell", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -1349,6 +1411,12 @@ dependencies = [ "nohash-hasher", ] +[[package]] +name = "either" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" + [[package]] name = "emath" version = "0.18.0" @@ -1769,7 +1837,7 @@ dependencies = [ "byteorder", "color_quant", "num-iter", - "num-rational", + "num-rational 0.3.2", "num-traits", "png", "scoped_threadpool", @@ -1836,6 +1904,7 @@ version = "0.1.0" dependencies = [ "bevy", "bevy-inspector-egui", + "bevy_rapier2d", "serde", "serde_json", ] @@ -1975,6 +2044,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" +[[package]] +name = "libm" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db" + [[package]] name = "libudev-sys" version = "0.1.4" @@ -2046,6 +2121,15 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +[[package]] +name = "matrixmultiply" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84" +dependencies = [ + "rawpointer", +] + [[package]] name = "memchr" version = "2.5.0" @@ -2160,6 +2244,34 @@ dependencies = [ "thiserror", ] +[[package]] +name = "nalgebra" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a89248335f688e4bd994e6d030fd7e185eb41769b8c435395075425e100ac6" +dependencies = [ + "approx", + "glam", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational 0.4.1", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ndk" version = "0.5.0" @@ -2320,6 +2432,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-complex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" +dependencies = [ + "num-traits", +] + [[package]] name = "num-derive" version = "0.3.3" @@ -2363,6 +2484,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.15" @@ -2370,6 +2502,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", + "libm 0.2.2", ] [[package]] @@ -2480,6 +2613,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" +[[package]] +name = "optional" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978aa494585d3ca4ad74929863093e87cac9790d81fe7aba2b3dc2890643a0fc" + [[package]] name = "owned_ttf_parser" version = "0.15.0" @@ -2543,6 +2682,33 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "parry2d" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2841cebc29aaf7c69058b242742853d9b106c5245ed946090a75d941d23a6f5e" +dependencies = [ + "approx", + "arrayvec", + "bitflags", + "downcast-rs", + "either", + "nalgebra", + "num-derive", + "num-traits", + "rustc-hash", + "simba", + "slab", + "smallvec", + "spade", +] + +[[package]] +name = "paste" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" + [[package]] name = "peeking_take_while" version = "0.1.2" @@ -2680,6 +2846,26 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6" +[[package]] +name = "rapier2d" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7e798266018ec9194a6ca931ae6520c0bf5f7dbdbcb5f1d8bb0d9c075ea24" +dependencies = [ + "approx", + "arrayvec", + "bit-vec", + "bitflags", + "crossbeam", + "downcast-rs", + "nalgebra", + "num-derive", + "num-traits", + "parry2d", + "rustc-hash", + "simba", +] + [[package]] name = "raw-window-handle" version = "0.4.3" @@ -2689,6 +2875,12 @@ dependencies = [ "cty", ] +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + [[package]] name = "rectangle-pack" version = "0.4.2" @@ -2736,6 +2928,12 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157" +[[package]] +name = "robust" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5864e7ef1a6b7bcf1d6ca3f655e65e724ed3b52546a0d0a663c991522f552ea" + [[package]] name = "rodio" version = "0.15.0" @@ -2789,6 +2987,15 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +[[package]] +name = "safe_arch" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "794821e4ccb0d9f979512f9c1973480123f9bd62a90d74ab0f9426fcf8f4a529" +dependencies = [ + "bytemuck", +] + [[package]] name = "same-file" version = "1.0.6" @@ -2886,6 +3093,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +[[package]] +name = "simba" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13a2609e876d4f77f6ab7ff5254fc39b4f1927ba8e6db3d18be7c32534d3725e" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + [[package]] name = "slab" version = "0.4.6" @@ -2910,6 +3130,18 @@ dependencies = [ "serde", ] +[[package]] +name = "spade" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "333b8c21ebd9a45c5e955f3d7a1f0c4a2214847dd7e8e1abb69f34ec9b88882d" +dependencies = [ + "num-traits", + "optional", + "robust", + "smallvec", +] + [[package]] name = "spirv" version = "0.2.0+1.5.4" @@ -2990,7 +3222,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b0dc6d20ce137f302edf90f9cd3d278866fd7fb139efca6f246161222ad6d87" dependencies = [ "lazy_static", - "libm", + "libm 0.1.4", ] [[package]] @@ -3169,6 +3401,12 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42d4b50cba812f0f04f0707bb6a0eaa5fae4ae05d90fc2a377998d2f21e77a1c" +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + [[package]] name = "unicode-bidi" version = "0.3.8" @@ -3458,6 +3696,16 @@ dependencies = [ "bitflags", ] +[[package]] +name = "wide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3aba2d1dac31ac7cae82847ac5b8be822aee8f99a4e100f279605016b185c5f" +dependencies = [ + "bytemuck", + "safe_arch", +] + [[package]] name = "widestring" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index a01103b..89a26df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,5 +9,7 @@ edition = "2021" bevy = { version = "0.7", features = ["dynamic"] } bevy-inspector-egui = "0.11.0" +bevy_rapier2d = "0.15.0" + serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/assets/maps/NAME.txt b/assets/maps/NAME.txt index b1d0576..2fa0f20 100644 --- a/assets/maps/NAME.txt +++ b/assets/maps/NAME.txt @@ -4,10 +4,10 @@ "name": "name", "walls": [ [ - -100, - 50, - -50, - 200, + -1000, + 500, + -500, + 2000, 1 ] ] diff --git a/src/main.rs b/src/main.rs index 5cff0f0..1c13386 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,248 +9,99 @@ use std::io::BufReader; use bevy_inspector_egui::Inspectable; use bevy::{ - prelude::*, - sprite::{MaterialMesh2dBundle, collide_aabb::collide}, - render::camera::ScalingMode, - ecs::system::EntityCommands, - math::Vec3Swizzles, core::FixedTimestep, + prelude::*, + render::camera::ScalingMode, + sprite::MaterialMesh2dBundle, + window::{Window, WindowResized}, }; -use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}; +use bevy_rapier2d::prelude::*; +use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}; fn main() { App::new() + .insert_resource(WindowDescriptor { + title: "Tanks!".to_string(), + resizable: true, + ..Default::default() + }) .add_plugins(DefaultPlugins) .add_startup_system(spawn_camera) .add_startup_system(setup) .add_plugin(LogDiagnosticsPlugin::default()) .add_plugin(FrameTimeDiagnosticsPlugin::default()) - .add_stage_after(CoreStage::Update, "physics", SystemStage::parallel() - .with_run_criteria(FixedTimestep::steps_per_second(60.0)) - .with_system(movement.label("movement")) - .with_system(camera_follow.after("movement")) - ) + .add_plugin(RapierPhysicsPlugin::::pixels_per_meter(100.0)) + .add_plugin(RapierDebugRenderPlugin::default()) + .add_system_to_stage(PhysicsStages::Writeback, camera_follow) + .add_system(movement) + .add_system(window_resized_event) .run(); } -fn spawn_camera(mut commands: Commands) { - let mut camera = OrthographicCameraBundle::new_2d(); - camera.orthographic_projection.scaling_mode = ScalingMode::None; - camera.transform = Transform::from_xyz(0.0, 0.0, 100.0); - commands.spawn_bundle(camera); +fn window_resized_event( + mut events: EventReader, + mut window: ResMut, +) { + for event in events.iter() { + window.width = event.width.try_into().unwrap(); + window.height = event.height.try_into().unwrap(); + } } fn camera_follow( - player_query: Query<(&Transform, With)>, + player_query: Query<(&Player, &Transform)>, mut camera_query: Query<&mut Transform, (Without, With)>, ) { - let (player_transform, _) = player_query.single(); + let (_, transform) = player_query.single(); let mut camera_transform = camera_query.single_mut(); - camera_transform.translation.x = player_transform.translation.x; - camera_transform.translation.y = player_transform.translation.y; + camera_transform.translation.x = transform.translation.x; + camera_transform.translation.y = transform.translation.y; } -#[derive(Component, Inspectable)] -pub struct Player { - speed: Vec3, - radius: f32 -} - -#[derive(Component, Clone)] -pub struct Collider { - speed_mul: f32, - height: bool, +fn spawn_camera(mut commands: Commands) { + let mut camera = OrthographicCameraBundle::new_2d(); + camera.orthographic_projection.scaling_mode = ScalingMode::WindowSize; + camera.orthographic_projection.scale = 1.0; + camera.transform = Transform::from_xyz(0.0, 0.0, 100.0); + commands.spawn_bundle(camera); } -fn rotate ( - -) { - +#[derive(Component, Inspectable)] +pub struct Player { + speed: f32, + radius: f32, } -fn wall_collision_check( - target_player_pos: Vec3, - wall_query: &Query<(&Transform, &Collider), - (With, Without)>, -) -> Option { - for (wall_transform, collider) in wall_query.iter() { - let collision = collide( - target_player_pos, - Vec2::splat(0.03), - wall_transform.translation, - wall_transform.scale.xy() - ); - if collision.is_some() { - return Some(collider.clone()); +fn movement(mut player_query: Query<(&mut Player, &mut Velocity)>, keyboard: Res>) { + for (player, mut rb_vels) in player_query.iter_mut() { + let mut acc = Vec2::new(0.0, 0.0); + if keyboard.pressed(KeyCode::W) { + acc.y += 1.0; } - } - None -} - -// https://stackoverflow.com/questions/3838329 -fn ccw (a: Vec3, b: Vec3, c: Vec3) -> bool { - (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x) -} - -fn intersect_segment_segment (a: Vec3, b: Vec3, c: Vec3, d: Vec3) -> bool { - ccw(a, c, d) != ccw(b, c, d) && ccw(a, b, c) != ccw(a, b, d) -} - -fn collision_segment_segment ( - pos: Vec3, vel: Vec3, - lo: Vec3, hi: Vec3, norm: Vec3 -) -> (Vec3, Vec3) { - if intersect_segment_segment(pos, pos + vel, lo, hi) { - let target = pos + vel - lo; - let tan = (hi - lo).normalize(); - let tv = target.dot(tan) * tan; - return (lo + tv + norm * 0.0001, Vec3::ZERO) - } - (pos, vel) -} - -// https://stackoverflow.com/questions/1073336 -fn intersect_segment_circle (e: Vec3, l: Vec3, c: Vec3, r: f32) -> bool { - if (e + l - c).length_squared() < r * r { return true } - if (e - c).length_squared() < r * r { return true } - - let d = l; - let f = e - c; - let a = d.length_squared(); - let b = 2.0 * f.dot(d); - let z = f.dot(f) - r * r; - let delta = b * b - 4.0 * a * z; - if delta > 0.0 { - let deltaroot = delta.sqrt(); - let t1 = (-b - deltaroot) / (2.0 * a); - if t1 >= 0.0 && t1 <= 1.0 { return true } - let t2 = (-b + deltaroot) / (2.0 * a); - if t2 >= 0.0 && t2 <= 1.0 { return true } - } - false -} - -fn collision_segment_circle ( - pos: Vec3, vel: Vec3, - center: Vec3, rad: f32 -) -> (Vec3, Vec3) { - if intersect_segment_circle(pos, vel, center, rad) { - let out = pos + vel - center; - let norm = out.normalize(); - let perp = Vec3::new(-out.y, out.x, 0.0).dot(out) * 2.0; - return (norm * rad * 1.0005 + center, out * perp) - } - (pos, vel) -} - -fn movement ( - mut player_query: Query<(&mut Player, &mut Transform)>, - wall_query: Query<(&Transform, &Collider), - (With, Without)>, - keyboard: Res>, - time: Res