use gizmo_core::World;
use gizmo_math::Vec3;
use gizmo_physics::components::{Collider, RigidBody, Transform, Velocity};
use gizmo_physics::system::physics_step_system;
use gizmo_physics::world::PhysicsWorld;
fn setup_world() -> World {
let mut world = World::new();
world.insert_resource(PhysicsWorld::new().with_gravity(Vec3::new(0.0, -9.81, 0.0)));
world
}
#[test]
fn test_compound_shape_deadlock_and_collision() {
let mut world = setup_world();
let ground = world.spawn();
world.add_component(ground, Transform::new(Vec3::new(0.0, -1.0, 0.0)));
world.add_component(ground, RigidBody::new_static());
world.add_component(ground, Velocity::default());
world.add_component(ground, Collider::box_collider(Vec3::new(10.0, 1.0, 10.0)));
let parent_ent = world.spawn();
world.add_component(parent_ent, Transform::new(Vec3::new(0.0, 5.0, 0.0)));
world.add_component(parent_ent, RigidBody::new(1.0, 0.0, 0.5, true));
world.add_component(parent_ent, Velocity::default());
world.add_component(parent_ent, Collider::box_collider(Vec3::new(0.5, 0.5, 0.5)));
let child_ent = world.spawn();
world.add_component(child_ent, Transform::new(Vec3::new(0.0, 1.0, 0.0)));
world.add_component(child_ent, Collider::box_collider(Vec3::new(0.5, 0.5, 0.5)));
world.add_component(
parent_ent,
gizmo_core::component::Children(vec![child_ent.id()]),
);
world.add_component(child_ent, gizmo_core::component::Parent(parent_ent.id()));
for _ in 0..60 {
physics_step_system(&world, 0.016);
}
let parent_transform = *world.borrow::<Transform>().get(parent_ent.id()).unwrap();
assert!(
parent_transform.position.y < 4.9,
"Parent should have fallen, but is at Y = {}",
parent_transform.position.y
);
}