|
@@ -560,16 +560,18 @@ static void _collision_segment_capsule(const Shape2DSW *p_a, const Transform2D &
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- if (TEST_POINT(p_transform_a.xform(segment_A->get_a()), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * 0.5))) {
|
|
|
|
|
|
+ real_t capsule_dir = capsule_B->get_height() * 0.5 - capsule_B->get_radius();
|
|
|
|
+
|
|
|
|
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_a()), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_dir))) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- if (TEST_POINT(p_transform_a.xform(segment_A->get_a()), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * -0.5))) {
|
|
|
|
|
|
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_a()), (p_transform_b.get_origin() - p_transform_b.elements[1] * capsule_dir))) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- if (TEST_POINT(p_transform_a.xform(segment_A->get_b()), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * 0.5))) {
|
|
|
|
|
|
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_b()), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_dir))) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- if (TEST_POINT(p_transform_a.xform(segment_A->get_b()), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * -0.5))) {
|
|
|
|
|
|
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_b()), (p_transform_b.get_origin() - p_transform_b.elements[1] * capsule_dir))) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -715,11 +717,13 @@ static void _collision_circle_capsule(const Shape2DSW *p_a, const Transform2D &p
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ real_t capsule_dir = capsule_B->get_height() * 0.5 - capsule_B->get_radius();
|
|
|
|
+
|
|
//capsule endpoints
|
|
//capsule endpoints
|
|
- if (TEST_POINT(p_transform_a.get_origin(), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * 0.5))) {
|
|
|
|
|
|
+ if (TEST_POINT(p_transform_a.get_origin(), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_dir))) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- if (TEST_POINT(p_transform_a.get_origin(), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * -0.5))) {
|
|
|
|
|
|
+ if (TEST_POINT(p_transform_a.get_origin(), (p_transform_b.get_origin() - p_transform_b.elements[1] * capsule_dir))) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -864,9 +868,11 @@ static void _collision_rectangle_capsule(const Shape2DSW *p_a, const Transform2D
|
|
|
|
|
|
Transform2D boxinv = p_transform_a.affine_inverse();
|
|
Transform2D boxinv = p_transform_a.affine_inverse();
|
|
|
|
|
|
|
|
+ real_t capsule_dir = capsule_B->get_height() * 0.5 - capsule_B->get_radius();
|
|
|
|
+
|
|
for (int i = 0; i < 2; i++) {
|
|
for (int i = 0; i < 2; i++) {
|
|
{
|
|
{
|
|
- Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * (i == 0 ? 0.5 : -0.5);
|
|
|
|
|
|
+ Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_dir;
|
|
|
|
|
|
if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, capsule_endpoint))) {
|
|
if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, capsule_endpoint))) {
|
|
return;
|
|
return;
|
|
@@ -874,7 +880,7 @@ static void _collision_rectangle_capsule(const Shape2DSW *p_a, const Transform2D
|
|
}
|
|
}
|
|
|
|
|
|
if (castA) {
|
|
if (castA) {
|
|
- Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * (i == 0 ? 0.5 : -0.5);
|
|
|
|
|
|
+ Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_dir;
|
|
capsule_endpoint -= p_motion_a;
|
|
capsule_endpoint -= p_motion_a;
|
|
|
|
|
|
if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, capsule_endpoint))) {
|
|
if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, capsule_endpoint))) {
|
|
@@ -883,7 +889,7 @@ static void _collision_rectangle_capsule(const Shape2DSW *p_a, const Transform2D
|
|
}
|
|
}
|
|
|
|
|
|
if (castB) {
|
|
if (castB) {
|
|
- Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * (i == 0 ? 0.5 : -0.5);
|
|
|
|
|
|
+ Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_dir;
|
|
capsule_endpoint += p_motion_b;
|
|
capsule_endpoint += p_motion_b;
|
|
|
|
|
|
if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, capsule_endpoint))) {
|
|
if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, capsule_endpoint))) {
|
|
@@ -892,7 +898,7 @@ static void _collision_rectangle_capsule(const Shape2DSW *p_a, const Transform2D
|
|
}
|
|
}
|
|
|
|
|
|
if (castA && castB) {
|
|
if (castA && castB) {
|
|
- Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * (i == 0 ? 0.5 : -0.5);
|
|
|
|
|
|
+ Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_dir;
|
|
capsule_endpoint -= p_motion_a;
|
|
capsule_endpoint -= p_motion_a;
|
|
capsule_endpoint += p_motion_b;
|
|
capsule_endpoint += p_motion_b;
|
|
|
|
|
|
@@ -900,6 +906,8 @@ static void _collision_rectangle_capsule(const Shape2DSW *p_a, const Transform2D
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ capsule_dir *= -1.0;
|
|
}
|
|
}
|
|
|
|
|
|
separator.generate_contacts();
|
|
separator.generate_contacts();
|
|
@@ -994,16 +1002,22 @@ static void _collision_capsule_capsule(const Shape2DSW *p_a, const Transform2D &
|
|
|
|
|
|
//capsule endpoints
|
|
//capsule endpoints
|
|
|
|
|
|
|
|
+ real_t capsule_dir_A = capsule_A->get_height() * 0.5 - capsule_A->get_radius();
|
|
for (int i = 0; i < 2; i++) {
|
|
for (int i = 0; i < 2; i++) {
|
|
- Vector2 capsule_endpoint_A = p_transform_a.get_origin() + p_transform_a.elements[1] * capsule_A->get_height() * (i == 0 ? 0.5 : -0.5);
|
|
|
|
|
|
+ Vector2 capsule_endpoint_A = p_transform_a.get_origin() + p_transform_a.elements[1] * capsule_dir_A;
|
|
|
|
|
|
|
|
+ real_t capsule_dir_B = capsule_B->get_height() * 0.5 - capsule_B->get_radius();
|
|
for (int j = 0; j < 2; j++) {
|
|
for (int j = 0; j < 2; j++) {
|
|
- Vector2 capsule_endpoint_B = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * (j == 0 ? 0.5 : -0.5);
|
|
|
|
|
|
+ Vector2 capsule_endpoint_B = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_dir_B;
|
|
|
|
|
|
if (TEST_POINT(capsule_endpoint_A, capsule_endpoint_B)) {
|
|
if (TEST_POINT(capsule_endpoint_A, capsule_endpoint_B)) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ capsule_dir_B *= -1.0;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ capsule_dir_A *= -1.0;
|
|
}
|
|
}
|
|
|
|
|
|
separator.generate_contacts();
|
|
separator.generate_contacts();
|
|
@@ -1034,12 +1048,15 @@ static void _collision_capsule_convex_polygon(const Shape2DSW *p_a, const Transf
|
|
for (int i = 0; i < convex_B->get_point_count(); i++) {
|
|
for (int i = 0; i < convex_B->get_point_count(); i++) {
|
|
Vector2 cpoint = p_transform_b.xform(convex_B->get_point(i));
|
|
Vector2 cpoint = p_transform_b.xform(convex_B->get_point(i));
|
|
|
|
|
|
|
|
+ real_t capsule_dir = capsule_A->get_height() * 0.5 - capsule_A->get_radius();
|
|
for (int j = 0; j < 2; j++) {
|
|
for (int j = 0; j < 2; j++) {
|
|
- Vector2 capsule_endpoint_A = p_transform_a.get_origin() + p_transform_a.elements[1] * capsule_A->get_height() * (j == 0 ? 0.5 : -0.5);
|
|
|
|
|
|
+ Vector2 capsule_endpoint_A = p_transform_a.get_origin() + p_transform_a.elements[1] * capsule_dir;
|
|
|
|
|
|
if (TEST_POINT(capsule_endpoint_A, cpoint)) {
|
|
if (TEST_POINT(capsule_endpoint_A, cpoint)) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ capsule_dir *= -1.0;
|
|
}
|
|
}
|
|
|
|
|
|
if (!separator.test_axis(convex_B->get_xformed_segment_normal(p_transform_b, i))) {
|
|
if (!separator.test_axis(convex_B->get_xformed_segment_normal(p_transform_b, i))) {
|