Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sap serialization: skip cache data #59

Merged
merged 3 commits into from
Nov 10, 2020
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
2 changes: 0 additions & 2 deletions examples2d/all_examples2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ mod add_remove2;
mod collision_groups2;
mod damping2;
mod debug_box_ball2;
mod debug_infinite_fall;
mod heightfield2;
mod joints2;
mod platform2;
Expand Down Expand Up @@ -65,7 +64,6 @@ pub fn main() {
("Restitution", restitution2::init_world),
("Sensor", sensor2::init_world),
("(Debug) box ball", debug_box_ball2::init_world),
("(Debug) infinite fall", debug_infinite_fall::init_world),
];

// Lexicographic sort, with stress tests moved at the end of the list.
Expand Down
2 changes: 2 additions & 0 deletions examples3d/all_examples3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ mod compound3;
mod damping3;
mod debug_boxes3;
mod debug_cylinder3;
mod debug_infinite_fall3;
mod debug_triangle3;
mod debug_trimesh3;
mod domino3;
Expand Down Expand Up @@ -84,6 +85,7 @@ pub fn main() {
("(Debug) triangle", debug_triangle3::init_world),
("(Debug) trimesh", debug_trimesh3::init_world),
("(Debug) cylinder", debug_cylinder3::init_world),
("(Debug) infinite fall", debug_infinite_fall3::init_world),
];

// Lexicographic sort, with stress tests moved at the end of the list.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
use rapier_testbed2d::Testbed;
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
use rapier_testbed3d::Testbed;

pub fn init_world(testbed: &mut Testbed) {
/*
Expand All @@ -13,7 +13,7 @@ pub fn init_world(testbed: &mut Testbed) {
let rad = 1.0;
// Build the dynamic box rigid body.
let rigid_body = RigidBodyBuilder::new_dynamic()
.translation(0.0, 3.0 * rad)
.translation(0.0, 3.0 * rad, 0.0)
.can_sleep(false)
.build();
let handle = bodies.insert(rigid_body);
Expand All @@ -24,7 +24,6 @@ pub fn init_world(testbed: &mut Testbed) {
* Set up the testbed.
*/
testbed.set_world(bodies, colliders, joints);
// testbed.look_at(Point2::new(10.0, 10.0, 10.0), Point2::origin());
}

fn main() {
Expand Down
20 changes: 11 additions & 9 deletions src/geometry/broad_phase_multi_sap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ struct SAPRegion {
existing_proxies: BitVec,
#[cfg_attr(feature = "serde-serialize", serde(skip))]
to_insert: Vec<usize>, // Workspace
update_count: usize,
update_count: u8,
proxy_count: usize,
}

Expand Down Expand Up @@ -376,9 +376,7 @@ impl SAPRegion {
assert_eq!(old.proxy_count, 0);
assert!(old.to_insert.is_empty());
debug_assert!(!old.existing_proxies.any());
for axis in old.axes.iter() {
assert!(axis.endpoints.len() == 2); // Account for sentinels
}
assert!(old.axes.iter().all(|ax| ax.endpoints.len() == 2));

old
}
Expand Down Expand Up @@ -422,6 +420,7 @@ impl SAPRegion {
if self.update_count > 0 {
// Update endpoints.
let mut deleted = 0;

for dim in 0..DIM {
self.axes[dim].update_endpoints(dim, proxies, reporting);
deleted += self.axes[dim].delete_out_of_bounds_proxies(&mut self.existing_proxies);
Expand Down Expand Up @@ -460,8 +459,10 @@ pub struct BroadPhase {
regions: HashMap<Point<i32>, SAPRegion>,
removed_colliders: Option<Subscription<RemovedCollider>>,
deleted_any: bool,
region_pool: Vec<SAPRegion>,
points_to_remove: Vec<Point<i32>>, // Workspace
#[cfg_attr(feature = "serde-serialize", serde(skip))]
region_pool: Vec<SAPRegion>, // To avoid repeated allocations.
#[cfg_attr(feature = "serde-serialize", serde(skip))]
regions_to_remove: Vec<Point<i32>>, // Workspace
// We could think serializing this workspace is useless.
// It turns out is is important to serialize at least its capacity
// and restore this capacity when deserializing the hashmap.
Expand Down Expand Up @@ -555,7 +556,7 @@ impl BroadPhase {
proxies: Proxies::new(),
regions: HashMap::default(),
region_pool: Vec::new(),
points_to_remove: Vec::new(),
regions_to_remove: Vec::new(),
reporting: HashMap::default(),
deleted_any: false,
}
Expand Down Expand Up @@ -658,6 +659,7 @@ impl BroadPhase {

let regions = &mut self.regions;
let pool = &mut self.region_pool;

#[cfg(feature = "dim2")]
for i in start.x..=end.x {
for j in start.y..=end.y {
Expand Down Expand Up @@ -691,14 +693,14 @@ impl BroadPhase {
for (point, region) in &mut self.regions {
region.update(&self.proxies, &mut self.reporting);
if region.proxy_count == 0 {
self.points_to_remove.push(*point);
self.regions_to_remove.push(*point);
}
}

// Remove all the empty regions and store them in the region pool
let regions = &mut self.regions;
self.region_pool.extend(
self.points_to_remove
self.regions_to_remove
.drain(..)
.map(|p| regions.remove(&p).unwrap()),
);
Expand Down