diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f966b503..d9b2364f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,7 +32,7 @@ jobs: with: prefix-key: ${{ env.RUST_CACHE_KEY }} - name: Cargo doc - run: cargo doc + run: cargo doc --no-deps test: runs-on: ubuntu-latest env: @@ -72,6 +72,6 @@ jobs: with: prefix-key: ${{ env.RUST_CACHE_KEY }} - name: Clippy bevy_rapier2d - run: cd bevy_rapier2d && cargo clippy --verbose --features wasm-bindgen,bevy/webgl2 --target wasm32-unknown-unknown + run: cd bevy_rapier2d && cargo clippy --verbose --features bevy/webgl2 --target wasm32-unknown-unknown - name: Clippy bevy_rapier3d - run: cd bevy_rapier3d && cargo clippy --verbose --features wasm-bindgen,bevy/webgl2 --target wasm32-unknown-unknown + run: cd bevy_rapier3d && cargo clippy --verbose --features bevy/webgl2 --target wasm32-unknown-unknown diff --git a/Cargo.toml b/Cargo.toml index a297a9b5..7bc0dd1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,3 +20,6 @@ codegen-units = 1 #parry3d = { git = "https://github.com/dimforge/parry", branch = "master" } #rapier2d = { git = "https://github.com/dimforge/rapier", branch = "character-controller" } #rapier3d = { git = "https://github.com/dimforge/rapier", branch = "character-controller" } + +# Fix for exammple issue_rapier_748 +parry3d = { git = "https://github.com/Vrixyz/parry", branch = "incorrect-shapecast" } diff --git a/bevy_rapier2d/Cargo.toml b/bevy_rapier2d/Cargo.toml index 4a626709..b4d1610e 100644 --- a/bevy_rapier2d/Cargo.toml +++ b/bevy_rapier2d/Cargo.toml @@ -45,16 +45,20 @@ rapier-debug-render = ["rapier2d/debug-render"] parallel = ["rapier2d/parallel"] simd-stable = ["rapier2d/simd-stable"] simd-nightly = ["rapier2d/simd-nightly"] -wasm-bindgen = ["rapier2d/wasm-bindgen"] serde-serialize = ["rapier2d/serde-serialize", "bevy/serialize", "serde"] enhanced-determinism = ["rapier2d/enhanced-determinism"] headless = [] -async-collider = ["bevy/bevy_asset", "bevy/bevy_scene", "bevy/bevy_render"] +async-collider = [ + "bevy/bevy_asset", + "bevy/bevy_scene", + "bevy/bevy_render", + "bevy/bevy_image", +] [dependencies] bevy = { version = "0.15", default-features = false } nalgebra = { version = "0.33", features = ["convert-glam029"] } -rapier2d = "0.22" +rapier2d = "0.23" bitflags = "2.4" log = "0.4" serde = { version = "1", features = ["derive"], optional = true } diff --git a/bevy_rapier3d/Cargo.toml b/bevy_rapier3d/Cargo.toml index b5d18c47..874666c6 100644 --- a/bevy_rapier3d/Cargo.toml +++ b/bevy_rapier3d/Cargo.toml @@ -46,16 +46,20 @@ rapier-debug-render = ["rapier3d/debug-render"] parallel = ["rapier3d/parallel"] simd-stable = ["rapier3d/simd-stable"] simd-nightly = ["rapier3d/simd-nightly"] -wasm-bindgen = ["rapier3d/wasm-bindgen"] serde-serialize = ["rapier3d/serde-serialize", "bevy/serialize", "serde"] enhanced-determinism = ["rapier3d/enhanced-determinism"] headless = [] -async-collider = ["bevy/bevy_asset", "bevy/bevy_scene", "bevy/bevy_render"] +async-collider = [ + "bevy/bevy_asset", + "bevy/bevy_scene", + "bevy/bevy_render", + "bevy/bevy_image", +] [dependencies] bevy = { version = "0.15", default-features = false } nalgebra = { version = "0.33", features = ["convert-glam029"] } -rapier3d = "0.22" +rapier3d = "0.23" bitflags = "2.4" log = "0.4" serde = { version = "1", features = ["derive"], optional = true } @@ -72,6 +76,8 @@ approx = "0.5.1" glam = { version = "0.29", features = ["approx"] } bevy-inspector-egui = "0.28" bevy_egui = "0.31" +# Used for example issue_rapier_748 +fastrand = "2.3" [package.metadata.docs.rs] # Enable all the features when building the docs on docs.rs diff --git a/bevy_rapier3d/examples/issue_rapier_748.rs b/bevy_rapier3d/examples/issue_rapier_748.rs new file mode 100644 index 00000000..bedee2b1 --- /dev/null +++ b/bevy_rapier3d/examples/issue_rapier_748.rs @@ -0,0 +1,142 @@ +use bevy::prelude::*; +use bevy_rapier3d::prelude::*; + +const START_POSITION: Vec3 = Vec3::new(0., 1.5, 0.); + +fn main() { + let mut app = App::new(); + app.add_plugins(( + DefaultPlugins, + RapierPhysicsPlugin::::default(), + RapierDebugRenderPlugin::default(), + )) + .insert_resource(ClearColor(Color::srgb(0.2, 0.2, 0.2))) + .add_systems(Startup, (spawn_basic_scene, spawn_shapes)) + .add_systems(FixedUpdate, update_cubes) + .run(); +} + +#[derive(Component)] +struct Velocity(Vec3); +impl Velocity { + pub fn random() -> Self { + Velocity( + // truly random velocity -> i found no matching vel that way + // Vec3::new( + // fastrand::f32() * 2. - 1., + // -fastrand::f32(), + // fastrand::f32() * 2. - 1., + // ) + // .normalize(), + + // this velocity always works + //Vec3::new(1.0, -5.0, -1.0).normalize(), + // integer velocities + Vec3::new( + fastrand::i32(-6..=6) as f32, + fastrand::i32(-6..0) as f32, + fastrand::i32(-6..=6) as f32, + ) + .normalize(), + // even a slight deviation from an integer velocity makes it very unlikely + // (Vec3::new( + // fastrand::i32(-6..=6) as f32, + // fastrand::i32(-6..0) as f32, + // fastrand::i32(-6..=6) as f32, + // ) + // .normalize() + // + Vec3::new( + // fastrand::f32() * 2. - 1., + // -fastrand::f32(), + // fastrand::f32() * 2. - 1., + // ) + // .normalize() + // * 0.00001) + // .normalize(), + ) + } +} + +fn spawn_shapes(mut commands: Commands) { + let group = CollisionGroups::new(Group::GROUP_1, Group::ALL ^ Group::GROUP_1); + + // every shape except cuboid works + for shape in [ + Collider::cuboid(0.5, 0.5, 0.5), + Collider::ball(0.5), + Collider::capsule_y(0.5, 0.2), + Collider::cylinder(0.5, 0.5), + ] { + // i spawned many shapes to get a better random sampling, but it also works with just one + for _ in 0..100 { + commands.spawn(( + group, + Velocity::random(), + RigidBody::KinematicPositionBased, + shape.clone(), + Transform::from_translation(START_POSITION), + KinematicCharacterController { + filter_groups: Some(group), + slide: true, // sliding seems to make no difference + ..KinematicCharacterController::default() + }, + )); + } + } +} + +fn spawn_basic_scene( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + // spawn light + commands.spawn((PointLight::default(), Transform::from_xyz(0., 5., 0.))); + + // spawn ground plane + commands.spawn(( + // the size of the cuboid seems very important + Collider::cuboid(10., 0.1, 10.), + Mesh3d(meshes.add(Plane3d::new(Vec3::Y, Vec2::splat(10.)).mesh())), + MeshMaterial3d(materials.add(StandardMaterial { + base_color: Color::srgb(0.2, 0.9, 0.2), + ..default() + })), + )); + + // add camera + commands.spawn(( + Camera3d::default(), + Transform::from_xyz(10., 1.8, 0.).looking_at(Vec3::ZERO, Vec3::Y), + )); +} + +fn update_cubes( + time: Res