use approx_det::assert_relative_eq;
use wasm_bindgen_test::*;
use crate::collision_tasks::tests::common::{
convex2contact_manifold_wide_to_convex2contact_manifold, get_input_wide,
Convex2ContactManifold, ConvexHullInput, Mvec3, TestInput,
};
use crate::collision_tasks::ShapeWideTester;
use crate::shapes::{CapsuleWide, ConvexHullWide};
use crate::traits::PairWideTest;
use crate::{Capsule, ConvexHull, ConvexHullId, ShapeContainer};
wasm_bindgen_test_configure!(run_in_browser);
type InputTypeData = TestInput<Capsule, ConvexHullInput>;
type InputType = TestInput<Capsule, ConvexHullId>;
#[test]
#[wasm_bindgen_test]
fn test_capsule_convex_hull_tester() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!("resource/capsule_convex_hull/contact1.json");
let input0: InputTypeData =
serde_json::from_slice(file_input).expect("file should be proper JSON");
let convex_hull = ConvexHull::new_unchecked(&input0.b.vertices[..]);
let mut container = ShapeContainer::default();
let id = container.add(convex_hull);
let input0 = InputType {
a: input0.a,
b: id,
speculative_margin: input0.speculative_margin,
offset_b: input0.offset_b,
orientation_a: input0.orientation_a,
orientation_b: input0.orientation_b,
};
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 0.0,
y: 1f32,
z: 0.0,
},
OffsetA1: Mvec3 {
x: 0.0,
y: 1f32,
z: 0.0,
},
Normal: Mvec3 {
x: 0.0,
y: -1.0,
z: 0.0,
},
Depth0: -1f32,
Depth1: 1f32,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: false,
Contact1Exists: true,
};
output0.OffsetA0 -= output0.Normal * output0.Depth0;
output0.OffsetA1 -= output0.Normal * output0.Depth1;
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
ConvexHullWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold,
Some(&container)
);
}
#[test]
#[wasm_bindgen_test]
fn test_capsule_convex_hull_tester2() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!("resource/capsule_convex_hull/contact2.json");
let input0: InputTypeData =
serde_json::from_slice(file_input).expect("file should be proper JSON");
let convex_hull = ConvexHull::new_unchecked(&input0.b.vertices[..]);
let mut container = ShapeContainer::default();
let id = container.add(convex_hull);
let input0 = InputType {
a: input0.a,
b: id,
speculative_margin: input0.speculative_margin,
offset_b: input0.offset_b,
orientation_a: input0.orientation_a,
orientation_b: input0.orientation_b,
};
let mut output0 = Convex2ContactManifold::default();
output0.OffsetA0 -= output0.Normal * output0.Depth0;
output0.OffsetA1 -= output0.Normal * output0.Depth1;
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
ConvexHullWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold,
Some(&container)
);
}
#[test]
#[wasm_bindgen_test]
fn test_capsule_convex_hull_tester3() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!("resource/capsule_convex_hull/contact3.json");
let input0: InputTypeData =
serde_json::from_slice(file_input).expect("file should be proper JSON");
let convex_hull = ConvexHull::new_unchecked(&input0.b.vertices[..]);
let mut container = ShapeContainer::default();
let id = container.add(convex_hull);
let input0 = InputType {
a: input0.a,
b: id,
speculative_margin: input0.speculative_margin,
offset_b: input0.offset_b,
orientation_a: input0.orientation_a,
orientation_b: input0.orientation_b,
};
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 1.0,
y: -1.0,
z: 0.0,
},
OffsetA1: Mvec3 {
x: 1.0,
y: 1.0,
z: 0.0,
},
Normal: Mvec3 {
x: -1.0,
y: 0.0,
z: 0.0,
},
Depth0: 0f32,
Depth1: 0f32,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: true,
Contact1Exists: true,
};
output0.OffsetA0 -= output0.Normal * output0.Depth0;
output0.OffsetA1 -= output0.Normal * output0.Depth1;
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
ConvexHullWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold,
Some(&container)
);
}
#[test]
#[wasm_bindgen_test]
fn test_capsule_convex_hull_tester4() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!("resource/capsule_convex_hull/contact4.json");
let input0: InputTypeData =
serde_json::from_slice(file_input).expect("file should be proper JSON");
let convex_hull = ConvexHull::new_unchecked(&input0.b.vertices[..]);
let mut container = ShapeContainer::default();
let id = container.add(convex_hull);
let input0 = InputType {
a: input0.a,
b: id,
speculative_margin: input0.speculative_margin,
offset_b: input0.offset_b,
orientation_a: input0.orientation_a,
orientation_b: input0.orientation_b,
};
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 1.5659,
y: 0.565876,
z: 0.0,
},
OffsetA1: Mvec3 {
x: 0.5659009,
y: 1.565891,
z: 0.0,
},
Normal: Mvec3 {
x: -0.7071121,
y: -0.7071008,
z: 0.0,
},
Depth0: -1.2145004,
Depth1: 0.19970125,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: false,
Contact1Exists: true,
};
output0.OffsetA0 -= output0.Normal * output0.Depth0;
output0.OffsetA1 -= output0.Normal * output0.Depth1;
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
ConvexHullWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold,
Some(&container)
);
}
#[test]
#[wasm_bindgen_test]
fn test_capsule_convex_hull_tester5() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!("resource/capsule_convex_hull/contact5.json");
let input0: InputTypeData =
serde_json::from_slice(file_input).expect("file should be proper JSON");
let convex_hull = ConvexHull::new_unchecked(&input0.b.vertices[..]);
let mut container = ShapeContainer::default();
let id = container.add(convex_hull);
let input0 = InputType {
a: input0.a,
b: id,
speculative_margin: input0.speculative_margin,
offset_b: input0.offset_b,
orientation_a: input0.orientation_a,
orientation_b: input0.orientation_b,
};
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 1.2758979,
y: 0.27587843,
z: 0.0,
},
OffsetA1: Mvec3 {
x: 0.27589875,
y: 1.2758934,
z: 0.0,
},
Normal: Mvec3 {
x: -0.7071121,
y: -0.7071008,
z: 0.0,
},
Depth0: -0.8043785,
Depth1: 0.60982317,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: false,
Contact1Exists: true,
};
output0.OffsetA0 -= output0.Normal * output0.Depth0;
output0.OffsetA1 -= output0.Normal * output0.Depth1;
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
ConvexHullWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold,
Some(&container)
);
}
#[test]
#[wasm_bindgen_test]
fn test_capsule_convex_hull_tester6() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!("resource/capsule_convex_hull/contact6.json");
let input0: InputTypeData =
serde_json::from_slice(file_input).expect("file should be proper JSON");
let convex_hull = ConvexHull::new_unchecked(&input0.b.vertices[..]);
let mut container = ShapeContainer::default();
let id = container.add(convex_hull);
let input0 = InputType {
a: input0.a,
b: id,
speculative_margin: input0.speculative_margin,
offset_b: input0.offset_b,
orientation_a: input0.orientation_a,
orientation_b: input0.orientation_b,
};
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: -1.2071003,
y: 0.20712054,
z: 0.0,
},
OffsetA1: Mvec3 {
x: -0.20710129,
y: 1.2071036,
z: 0.0,
},
Normal: Mvec3 {
x: -0.7071008,
y: 0.7071121,
z: 0.0,
},
Depth0: 2.707112,
Depth1: 1.2928879,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: true,
Contact1Exists: true,
};
output0.OffsetA0 -= output0.Normal * output0.Depth0;
output0.OffsetA1 -= output0.Normal * output0.Depth1;
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
ConvexHullWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold,
Some(&container)
);
}
#[test]
#[wasm_bindgen_test]
fn test_capsule_convex_hull_tester7() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!("resource/capsule_convex_hull/contact7.json");
let input0: InputTypeData =
serde_json::from_slice(file_input).expect("file should be proper JSON");
let convex_hull = ConvexHull::new_unchecked(&input0.b.vertices[..]);
let mut container = ShapeContainer::default();
let id = container.add(convex_hull);
let input0 = InputType {
a: input0.a,
b: id,
speculative_margin: input0.speculative_margin,
offset_b: input0.offset_b,
orientation_a: input0.orientation_a,
orientation_b: input0.orientation_b,
};
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: -0.008739829,
y: -9.536_743E-7,
z: 1.0,
},
OffsetA1: Mvec3 {
x: 0.008739829,
y: 9.536_743E-7,
z: 1.0,
},
Normal: Mvec3 {
x: 0.0,
y: 0.0,
z: -1.0,
},
Depth0: -0.9999609,
Depth1: 0.9999609,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: false,
Contact1Exists: true,
};
output0.OffsetA0 -= output0.Normal * output0.Depth0;
output0.OffsetA1 -= output0.Normal * output0.Depth1;
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
ConvexHullWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold,
Some(&container)
);
}
#[cfg(not(feature = "qhull"))]
mod shift {
use glam::{UnitQuat, Vec3};
use phys_geom::shape::Capsule;
use crate::collision_tasks::tests::common::{
build_displaced_convexhull_test, CollisionTestShape,
};
#[test]
fn test_capsule_convex_shift() {
let shape_a = Capsule::new(1., 2.);
let convexhull_cuboid_length = Vec3::new(4., 5., 6.);
let convexhull_displacement_vec = Vec3::new(1e0, 1e4, 1e2);
let desired_offset_b = Vec3::new(0., 4.1, 0.);
let rotation_a = UnitQuat::from_euler_default(-1., -2., -3.);
let rotation_b = UnitQuat::from_euler_default(1., 2., 3.);
build_displaced_convexhull_test(
&CollisionTestShape::Capsule(shape_a),
convexhull_cuboid_length,
convexhull_displacement_vec,
desired_offset_b,
rotation_a,
rotation_b,
);
}
}