use bevy::{
log::{Level, LogPlugin},
prelude::*,
};
pub use bevy_xpbd_3d::prelude::*;
use bevy_xpbd_3d_parenting::prelude::*;
#[test]
fn assert_moves_up() {
let mut app = App::new();
let level = "info";
app.add_plugins((
MinimalPlugins,
LogPlugin {
filter: format!(
"basic={level},bevy_xpbd_3d_parenting={level}",
level = level
),
level: Level::INFO,
},
bevy_xpbd_3d::prelude::PhysicsPlugins::new(Update),
bevy_xpbd_3d_parenting::ParentingPlugin::new(Update),
));
let mut parent = app.world.spawn((
TransformBundle::default(),
RigidBody::Dynamic,
ExternalForce::ZERO.with_persistence(false),
Collider::capsule(1.0, 1.0),
));
parent.with_children(|parent| {
parent.spawn((
TransformBundle::default(),
InternalForce(Vec3::new(0., 300.0, 0.)),
));
});
let parent = parent.id();
let child;
{
let parent_transform = app.world.get::<Transform>(parent).unwrap();
trace!("Parent transform before physics: {:?}", parent_transform);
assert_eq!(parent_transform.translation, Vec3::ZERO);
let parent_children = app.world.get::<Children>(parent).unwrap();
trace!("Parent children before physics: {:?}", parent_children);
assert!(parent_children.len() == 1);
child = parent_children[0];
}
app.update();
{
let child_parent = app.world.get::<Parent>(child).unwrap();
trace!("Child parent after physics: {:?}", child_parent);
assert_eq!(child_parent.get(), parent);
}
let first_frame_height;
{
let parent_transform = app.world.get::<Transform>(parent).unwrap();
debug!("Parent transform after physics: {:?}", parent_transform);
assert!(parent_transform.translation.y > 0.0);
first_frame_height = parent_transform.translation.y;
}
for _ in 0..5 {
app.update();
}
{
let parent_transform = app.world.get::<Transform>(parent).unwrap();
debug!(
"Parent transform after many physics steps: {:?}",
parent_transform
);
assert!(parent_transform.translation.y > first_frame_height);
}
}