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, Mvec3, TestInput,
};
use crate::collision_tasks::ShapeWideTester;
use crate::convex_contact_manifold::Convex4ContactManifoldWide;
use crate::shapes::{CapsuleWide, CylinderWide};
use crate::traits::PairWideTest;
use crate::{Capsule, Cylinder};
wasm_bindgen_test_configure!(run_in_browser);
type InputType = TestInput<Capsule, Cylinder>;
const ADJUST_DEPTH_FACTOR: f32 = 1.0;
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_000_same_center() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!("resource/capsule_cylinder/000_same_center.json");
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 0.5,
y: -0.5,
z: 0.0,
},
OffsetA1: Mvec3 {
x: 0.5,
y: 0.5,
z: 0.0,
},
Normal: Mvec3 {
x: 1.0,
y: 0.0,
z: 0.0,
},
Depth0: 1.0,
Depth1: 1.0,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: true,
Contact1Exists: true,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_001_nocollide() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!("resource/capsule_cylinder/001_nocollide.json");
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold::default();
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_002_cylinder_inside_capsule() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!("resource/capsule_cylinder/002_cylinder_inside_capsule.json");
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: -0.029_289_3_f32,
y: 0.0,
z: 0.029_289_3_f32,
},
OffsetA1: Mvec3 {
x: -0.029_289_3_f32,
y: 0.2,
z: 0.029_289_3_f32,
},
Normal: Mvec3 {
x: std::f32::consts::FRAC_1_SQRT_2,
y: 0.0,
z: -std::f32::consts::FRAC_1_SQRT_2,
},
Depth0: 0.458_578_7_f32,
Depth1: 0.458_578_7_f32,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: true,
Contact1Exists: true,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_003_capsule_inside_cylinder() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!("resource/capsule_cylinder/003_capsule_inside_cylinder.json");
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 0.253_553_4_f32,
y: -0.1,
z: -0.253_553_4_f32,
},
OffsetA1: Mvec3 {
x: 0.253_553_4_f32,
y: 0.1,
z: -0.253_553_4_f32,
},
Normal: Mvec3 {
x: std::f32::consts::FRAC_1_SQRT_2,
y: 0.0,
z: -std::f32::consts::FRAC_1_SQRT_2,
},
Depth0: 0.458_578_7_f32,
Depth1: 0.458_578_7_f32,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: true,
Contact1Exists: true,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_004_capsule_y_axis_same_with_cylinder_y_axis_and_no_collide() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/004_capsule_y_axis_same_with_cylinder_y_axis_and_no_collide.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold::default();
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_005_capsule_body_and_head_cross_with_cylinder_cap_and_side() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/005_capsule_body_and_head_cross_with_cylinder_cap_and_side.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 0.113_369_7_f32,
y: 0.097_184_1_f32,
z: 0.053_364_5_f32,
},
OffsetA1: Mvec3 {
x: 0.113_369_7_f32,
y: 0.097_184_1_f32,
z: 0.053_364_5_f32,
},
Normal: Mvec3 {
x: 0.519_378_8_f32,
y: -0.847_554_f32,
z: -0.109_079_3_f32,
},
Depth0: 0.470_684_2_f32,
Depth1: 0.470_684_2_f32,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: true,
Contact1Exists: false,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_006_capsule_body_parallel_to_cylinder_cap_with_a_line_touch() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/006_capsule_body_parallel_to_cylinder_cap_with_a_line_touch.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold::default();
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_007_capsule_body_parallel_to_cylinder_side_with_a_line_touch() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/007_capsule_body_parallel_to_cylinder_side_with_a_line_touch.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 0.0,
y: -0.5,
z: -0.5,
},
OffsetA1: Mvec3 {
x: 0.0,
y: 0.5,
z: -0.5,
},
Normal: Mvec3 {
x: 0.0,
y: 0.0,
z: 1.0,
},
Depth0: 0.0,
Depth1: 0.0,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: true,
Contact1Exists: true,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_008_capsule_body_penetrate_into_cylinder_cap() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/008_capsule_body_penetrate_into_cylinder_cap.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 0.0,
y: -0.5,
z: -0.2,
},
OffsetA1: Mvec3 {
x: 0.0,
y: 0.5,
z: -0.2,
},
Normal: Mvec3 {
x: 0.0,
y: 0.0,
z: 1.0,
},
Depth0: 0.3,
Depth1: 0.3,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: true,
Contact1Exists: true,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_009_capsule_body_penetrate_into_cylinder_side() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/009_capsule_body_penetrate_into_cylinder_side.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 1.490_116_1_e-8,
y: -0.017_630_3_f32,
z: -0.25,
},
OffsetA1: Mvec3 {
x: 1.490_116_1e-8,
y: -0.017_630_3_f32,
z: -0.25,
},
Normal: Mvec3 {
x: 8.094_750_7_e-7,
y: 4.590_76_e-6,
z: 1.0,
},
Depth0: 0.25,
Depth1: 0.25,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: true,
Contact1Exists: false,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_010_capsule_body_touch_a_point_with_cylinder_cap_circle() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/010_capsule_body_touch_a_point_with_cylinder_cap_circle.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold::default();
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_011_capsule_body_touch_a_point_with_cylinder_side() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/011_capsule_body_touch_a_point_with_cylinder_side.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold::default();
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_012_capsule_head_penetrate_into_cylinder_cap_circle() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/012_capsule_head_penetrate_into_cylinder_cap_circle.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 0.3621651,
y: 0.95439553,
z: 0.1486917,
},
OffsetA1: Mvec3 {
x: 0.0713394,
y: 0.7864872,
z: 0.029289335,
},
Normal: Mvec3 {
x: -0.24045488,
y: -0.96562696,
z: -0.098721914,
},
Depth0: -1.0061672,
Depth1: 0.20331475,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: false,
Contact1Exists: true,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_013_capsule_head_penetrate_into_cylinder_cap() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/013_capsule_head_penetrate_into_cylinder_cap.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: -0.23979133,
y: 0.85992444,
z: 0.0,
},
OffsetA1: Mvec3 {
x: -0.06878128,
y: 0.89007807,
z: 0.0,
},
Normal: Mvec3 {
x: 0.17364816,
y: -0.9848077,
z: 0.0,
},
Depth0: -0.88090324,
Depth1: 0.10390431,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: false,
Contact1Exists: true,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_014_capsule_head_penetrate_into_cylinder_side() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/014_capsule_head_penetrate_into_cylinder_side.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 0.0026708841,
y: 0.7330283,
z: -0.30731288,
},
OffsetA1: Mvec3 {
x: 0.0003476888,
y: 0.79151714,
z: -0.07265889,
},
Normal: Mvec3 {
x: -0.0011576116,
y: -0.9703142,
z: 0.24184488,
},
Depth0: -0.7707262,
Depth1: 0.19956416,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: false,
Contact1Exists: true,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[ignore = "todo: issue #1259"]
fn test_capule_cylinder_015_capsule_head_tangent_with_cylinder_cap() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input =
include_bytes!("resource/capsule_cylinder/015_capsule_head_tangent_with_cylinder_cap.json");
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 0.0,
y: 1.0,
z: 0.0,
},
OffsetA1: Mvec3 {
x: 0.0,
y: 1.0,
z: 0.0,
},
Normal: Mvec3 {
x: 0.0,
y: -1.0,
z: 0.0,
},
Depth0: 0.0,
Depth1: f32::NAN,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: true,
Contact1Exists: false,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
let input_wide = get_input_wide::<CapsuleWide, CylinderWide>(&array[..]);
let mut manifold_wide = Convex4ContactManifoldWide::default();
let contact_context = crate::traits::ContactContext {
orientation_a: &input_wide.orientation_a,
orientation_b: &input_wide.orientation_b,
offset_b: &input_wide.offset_b,
speculative_margin: input_wide.speculative_margin,
pair_count,
complex_shape_container: None,
};
ShapeWideTester::test(
&input_wide.a,
&input_wide.b,
&contact_context,
&mut manifold_wide,
);
log::info!(
"manifold_wide=[offset_a0={}, offset_a1={}, normal={}, depth0={}, depth1={},
feature_id0={}, feature_id1={}, contact_exists_0={}, contact_exists_1={}]",
manifold_wide.offset_a[0],
manifold_wide.offset_a[1],
manifold_wide.normal,
manifold_wide.depth[0],
manifold_wide.depth[1],
manifold_wide.feature_id[0],
manifold_wide.feature_id[1],
manifold_wide.contact_exists[0],
manifold_wide.contact_exists[1]
);
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[wasm_bindgen_test]
fn test_capule_cylinder_016_capsule_head_tangent_with_cylinder_side() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/016_capsule_head_tangent_with_cylinder_side.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold::default();
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}
#[test]
#[ignore = "todo: issue #1259"]
fn test_capule_cylinder_017_capsule_head_touch_a_point_with_cylinder_cap_circle() {
let _ = env_logger::builder().is_test(true).try_init();
let file_input = include_bytes!(
"resource/capsule_cylinder/017_capsule_head_touch_a_point_with_cylinder_cap_circle.json"
);
let input0: InputType = serde_json::from_slice(file_input).expect("file should be proper JSON");
let mut output0 = Convex2ContactManifold {
OffsetA0: Mvec3 {
x: 0.0,
y: 1.0,
z: 0.0,
},
OffsetA1: Mvec3 {
x: 0.0,
y: 1.0,
z: 0.0,
},
Normal: Mvec3 {
x: 0.0,
y: -1.0,
z: 0.0,
},
Depth0: 0.0,
Depth1: f32::NAN,
FeatureId0: 0,
FeatureId1: 1,
Contact0Exists: true,
Contact1Exists: false,
};
output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
let array = [input0];
let outputs = [output0];
let pair_count = array.len();
let input_wide = get_input_wide::<CapsuleWide, CylinderWide>(&array[..]);
let mut manifold_wide = Convex4ContactManifoldWide::default();
let contact_context = crate::traits::ContactContext {
orientation_a: &input_wide.orientation_a,
orientation_b: &input_wide.orientation_b,
offset_b: &input_wide.offset_b,
speculative_margin: input_wide.speculative_margin,
pair_count,
complex_shape_container: None,
};
ShapeWideTester::test(
&input_wide.a,
&input_wide.b,
&contact_context,
&mut manifold_wide,
);
log::info!(
"manifold_wide=[offset_a0={}, offset_a1={}, normal={}, depth0={}, depth1={},
feature_id0={}, feature_id1={}, contact_exists_0={}, contact_exists_1={}]",
manifold_wide.offset_a[0],
manifold_wide.offset_a[1],
manifold_wide.normal,
manifold_wide.depth[0],
manifold_wide.depth[1],
manifold_wide.feature_id[0],
manifold_wide.feature_id[1],
manifold_wide.contact_exists[0],
manifold_wide.contact_exists[1]
);
TestWide!(
CapsuleWide,
CylinderWide,
array,
pair_count,
outputs,
convex2contact_manifold_wide_to_convex2contact_manifold
);
}