Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
## Unreleased

### Modified

- Replace the hierarchical SAP broad-phase by a broad-phase based on parry’s new BVH structure.
- The `QueryPipeline` is now and ephemeral object obtained from the broad-phase with `broad_phase.as_query_pipeline()`.
It no longer needs to be updated separately from the broad-phase.

### Fixed

- Fix NaN resulting from non-clamped input to simd_asin in angular motor solver.

## v0.26.1 (23 May 2025)

### Added
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ needless_lifetimes = "allow"
#parry2d-f64 = { path = "../parry/crates/parry2d-f64" }
#parry3d-f64 = { path = "../parry/crates/parry3d-f64" }
#nalgebra = { path = "../nalgebra" }

#simba = { path = "../simba" }

#kiss3d = { git = "https://github.com/sebcrozet/kiss3d" }
#nalgebra = { git = "https://github.com/dimforge/nalgebra", branch = "dev" }
Expand Down
2 changes: 1 addition & 1 deletion benchmarks2d/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "rapier-benchmarks-2d"
version = "0.1.0"
authors = ["Sébastien Crozet <[email protected]>"]
edition = "2021"
edition = "2024"

[features]
parallel = ["rapier2d/parallel", "rapier_testbed2d/parallel"]
Expand Down
2 changes: 1 addition & 1 deletion benchmarks2d/balls2.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier2d::prelude::*;
use rapier_testbed2d::Testbed;
use rapier2d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks2d/boxes2.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier2d::prelude::*;
use rapier_testbed2d::Testbed;
use rapier2d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks2d/capsules2.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier2d::prelude::*;
use rapier_testbed2d::Testbed;
use rapier2d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
4 changes: 2 additions & 2 deletions benchmarks2d/convex_polygons2.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use rand::distributions::{Distribution, Standard};
use rand::{rngs::StdRng, SeedableRng};
use rapier2d::prelude::*;
use rand::{SeedableRng, rngs::StdRng};
use rapier_testbed2d::Testbed;
use rapier2d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks2d/heightfield2.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use rapier_testbed2d::Testbed;
use rapier2d::na::DVector;
use rapier2d::prelude::*;
use rapier_testbed2d::Testbed;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks2d/joint_ball2.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier2d::prelude::*;
use rapier_testbed2d::Testbed;
use rapier2d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks2d/joint_fixed2.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier2d::prelude::*;
use rapier_testbed2d::Testbed;
use rapier2d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks2d/joint_prismatic2.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier2d::prelude::*;
use rapier_testbed2d::Testbed;
use rapier2d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks2d/pyramid2.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier2d::prelude::*;
use rapier_testbed2d::Testbed;
use rapier2d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks2d/vertical_stacks2.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier2d::prelude::*;
use rapier_testbed2d::Testbed;
use rapier2d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
3 changes: 2 additions & 1 deletion benchmarks3d/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "rapier-benchmarks-3d"
version = "0.1.0"
authors = ["Sébastien Crozet <[email protected]>"]
edition = "2021"
edition = "2024"

[features]
parallel = ["rapier3d/parallel", "rapier_testbed3d/parallel"]
Expand All @@ -14,6 +14,7 @@ enhanced-determinism = ["rapier3d/enhanced-determinism"]
[dependencies]
rand = "0.8"
Inflector = "0.11"
oorandom = "11"

[dependencies.rapier_testbed3d]
path = "../crates/rapier_testbed3d"
Expand Down
17 changes: 13 additions & 4 deletions benchmarks3d/all_benchmarks3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@ mod joint_fixed3;
mod joint_prismatic3;
mod joint_revolute3;
mod keva3;
mod many_kinematics3;
mod many_pyramids3;
mod many_sleep3;
mod many_static3;
mod pyramid3;
mod ray_cast3;
mod stacks3;
mod trimesh3;

Expand All @@ -47,16 +49,16 @@ fn parse_command_line() -> Command {
Command::RunAll
}

pub fn main() {
let command = parse_command_line();

#[allow(clippy::type_complexity)]
pub fn demo_builders() -> Vec<(&'static str, fn(&mut Testbed))> {
let mut builders: Vec<(_, fn(&mut Testbed))> = vec![
("Balls", balls3::init_world),
("Boxes", boxes3::init_world),
("Capsules", capsules3::init_world),
("CCD", ccd3::init_world),
("Compound", compound3::init_world),
("Convex polyhedron", convex_polyhedron3::init_world),
("Many kinematics", many_kinematics3::init_world),
("Many static", many_static3::init_world),
("Many sleep", many_sleep3::init_world),
("Heightfield", heightfield3::init_world),
Expand All @@ -69,6 +71,7 @@ pub fn main() {
("ImpulseJoint prismatic", joint_prismatic3::init_world),
("Many pyramids", many_pyramids3::init_world),
("Keva tower", keva3::init_world),
("Ray cast", ray_cast3::init_world),
];

// Lexicographic sort, with stress tests moved at the end of the list.
Expand All @@ -77,6 +80,12 @@ pub fn main() {
(true, false) => Ordering::Greater,
(false, true) => Ordering::Less,
});
builders
}

pub fn main() {
let command = parse_command_line();
let builders = demo_builders();

match command {
Command::Run(demo) => {
Expand All @@ -86,7 +95,7 @@ pub fn main() {
{
TestbedApp::from_builders(vec![builders[i]]).run()
} else {
eprintln!("Invalid example to run provided: '{}'", demo);
eprintln!("Invalid example to run provided: '{demo}'");
}
}
Command::RunAll => TestbedApp::from_builders(builders).run(),
Expand Down
2 changes: 1 addition & 1 deletion benchmarks3d/balls3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
12 changes: 6 additions & 6 deletions benchmarks3d/boxes3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand All @@ -24,21 +24,21 @@ pub fn init_world(testbed: &mut Testbed) {
/*
* Create the cubes
*/
let num = 8;
let num = 10;
let rad = 1.0;

let shift = rad * 2.0 + rad;
let shift = rad * 2.0;
let centerx = shift * (num / 2) as f32;
let centery = shift / 2.0;
let centerz = shift * (num / 2) as f32;

let mut offset = -(num as f32) * (rad * 2.0 + rad) * 0.5;
let mut offset = -(num as f32) * (rad * 2.0) * 0.5;

for j in 0usize..47 {
for j in 0usize..num {
for i in 0..num {
for k in 0usize..num {
let x = i as f32 * shift - centerx + offset;
let y = j as f32 * shift + centery + 3.0;
let y = j as f32 * shift + centery;
let z = k as f32 * shift - centerz + offset;

// Build the rigid body.
Expand Down
2 changes: 1 addition & 1 deletion benchmarks3d/capsules3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks3d/ccd3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks3d/compound3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
4 changes: 2 additions & 2 deletions benchmarks3d/convex_polyhedron3.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use rand::distributions::{Distribution, Standard};
use rand::{rngs::StdRng, SeedableRng};
use rapier3d::prelude::*;
use rand::{SeedableRng, rngs::StdRng};
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks3d/heightfield3.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use rapier_testbed3d::Testbed;
use rapier3d::na::ComplexField;
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks3d/joint_ball3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks3d/joint_fixed3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks3d/joint_prismatic3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks3d/joint_revolute3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand Down
6 changes: 1 addition & 5 deletions benchmarks3d/keva3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn build_block(
testbed: &mut Testbed,
Expand Down Expand Up @@ -99,7 +99,6 @@ pub fn init_world(testbed: &mut Testbed) {
// These should only be set to odd values otherwise
// the blocks won't align in the nicest way.
let numy = [0, 9, 13, 17, 21, 41];
let mut num_blocks_built = 0;

for i in (1..=5).rev() {
let numx = i;
Expand All @@ -115,11 +114,8 @@ pub fn init_world(testbed: &mut Testbed) {
(numx, numy, numz),
);
block_height += numy as f32 * half_extents.y * 2.0 + half_extents.x * 2.0;
num_blocks_built += numx * numy * numz;
}

println!("Num keva blocks: {}", num_blocks_built);

/*
* Set up the testbed.
*/
Expand Down
68 changes: 68 additions & 0 deletions benchmarks3d/many_kinematics3.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

pub fn init_world(testbed: &mut Testbed) {
/*
* World
*/
let mut bodies = RigidBodySet::new();
let mut colliders = ColliderSet::new();
let impulse_joints = ImpulseJointSet::new();
let multibody_joints = MultibodyJointSet::new();

/*
* Create the balls
*/
let num = 30;
let rad = 1.0;

let shift = rad * 6.0 + 1.0;
let centerx = shift * (num as f32) / 2.0;
let centery = shift * (num as f32) / 2.0;
let centerz = shift * (num as f32) / 2.0;

for i in 0..num {
for j in 0usize..num {
for k in 0..num {
let x = i as f32 * shift - centerx;
let y = j as f32 * shift - centery;
let z = k as f32 * shift - centerz;

// Build the rigid body.
let velocity = Vector::new(
rand::random::<f32>() - 0.5,
rand::random::<f32>() - 0.5,
rand::random::<f32>() - 0.5,
) * 30.0;
let rigid_body = RigidBodyBuilder::new(RigidBodyType::KinematicVelocityBased)
.translation(vector![x, y, z])
.linvel(velocity);
let handle = bodies.insert(rigid_body);
let collider = ColliderBuilder::ball(rad);
colliders.insert_with_parent(collider, handle, &mut bodies);
}
}
}

testbed.add_callback(move |_, physics, _, _| {
for (_, rb) in physics.bodies.iter_mut() {
let mut linvel = *rb.linvel();

for dim in 0..3 {
if (linvel[dim] > 0.0 && rb.translation()[dim] > (shift * num as f32) / 2.0)
|| (linvel[dim] < 0.0 && rb.translation()[dim] < -(shift * num as f32) / 2.0)
{
linvel[dim] = -linvel[dim];
}
}

rb.set_linvel(linvel, false);
}
});

/*
* Set up the testbed.
*/
testbed.set_world(bodies, colliders, impulse_joints, multibody_joints);
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
}
2 changes: 1 addition & 1 deletion benchmarks3d/many_pyramids3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rapier3d::prelude::*;
use rapier_testbed3d::Testbed;
use rapier3d::prelude::*;

fn create_pyramid(
bodies: &mut RigidBodySet,
Expand Down
Loading