use crate::dynamics::{IslandManager, RigidBodySet};
use crate::geometry::NarrowPhase;
use crate::prelude::ColliderSet;
impl IslandManager {
#[allow(dead_code)]
pub(super) fn assert_state_is_valid(
&self,
bodies: &RigidBodySet,
colliders: &ColliderSet,
nf: &NarrowPhase,
) {
for (island_id, island) in self.islands.iter() {
if island.is_sleeping() {
assert!(!self.awake_islands.contains(&island_id));
} else {
let awake_id = island.id_in_awake_list.unwrap();
assert_eq!(self.awake_islands[awake_id], island_id);
}
for (body_id, handle) in island.bodies.iter().enumerate() {
if let Some(rb) = bodies.get(*handle) {
assert_eq!(rb.is_sleeping(), island.is_sleeping());
assert_eq!(rb.ids.active_island_id, island_id);
assert_eq!(body_id, rb.ids.active_set_id);
}
}
}
for id in self.free_islands.iter() {
assert!(self.islands.get(*id).is_none());
}
let mut awake_islands_dedup = self.awake_islands.clone();
awake_islands_dedup.sort();
awake_islands_dedup.dedup();
assert_eq!(self.awake_islands.len(), awake_islands_dedup.len());
for pair in nf.contact_pairs() {
let Some(body_handle1) = colliders[pair.collider1].parent.map(|p| p.handle) else {
continue;
};
let Some(body_handle2) = colliders[pair.collider2].parent.map(|p| p.handle) else {
continue;
};
let body1 = &bodies[body_handle1];
let body2 = &bodies[body_handle2];
if body1.is_fixed() || body2.is_fixed() {
continue;
}
if pair.has_any_active_contact() {
assert_eq!(body1.ids.active_island_id, body2.ids.active_island_id);
}
}
println!(
"`IslandManager::assert_state_is_valid` validation checks passed. This is slow. Only enable for debugging."
);
}
}