|
@@ -1234,7 +1234,7 @@ bool SpaceBullet::recover_from_penetration(RigidBodyBullet *p_body, const btTran
|
|
|
ERR_FAIL_COND_V(shape_idx < 0 || shape_idx >= cs->getNumChildShapes(), false);
|
|
|
|
|
|
if (cs->getChildShape(shape_idx)->isConvex()) {
|
|
|
- if (RFP_convex_convex_test(kin_shape.shape, static_cast<const btConvexShape *>(cs->getChildShape(shape_idx)), otherObject, shape_idx, shape_transform, otherObject->getWorldTransform() * cs->getChildTransform(shape_idx), p_recover_movement_scale, r_delta_recover_movement, r_recover_result)) {
|
|
|
+ if (RFP_convex_convex_test(kin_shape.shape, static_cast<const btConvexShape *>(cs->getChildShape(shape_idx)), otherObject, kinIndex, shape_idx, shape_transform, otherObject->getWorldTransform() * cs->getChildTransform(shape_idx), p_recover_movement_scale, r_delta_recover_movement, r_recover_result)) {
|
|
|
|
|
|
penetration = true;
|
|
|
}
|
|
@@ -1245,7 +1245,7 @@ bool SpaceBullet::recover_from_penetration(RigidBodyBullet *p_body, const btTran
|
|
|
}
|
|
|
}
|
|
|
} else if (otherObject->getCollisionShape()->isConvex()) { /// Execute GJK test against object shape
|
|
|
- if (RFP_convex_convex_test(kin_shape.shape, static_cast<const btConvexShape *>(otherObject->getCollisionShape()), otherObject, 0, shape_transform, otherObject->getWorldTransform(), p_recover_movement_scale, r_delta_recover_movement, r_recover_result)) {
|
|
|
+ if (RFP_convex_convex_test(kin_shape.shape, static_cast<const btConvexShape *>(otherObject->getCollisionShape()), otherObject, kinIndex, 0, shape_transform, otherObject->getWorldTransform(), p_recover_movement_scale, r_delta_recover_movement, r_recover_result)) {
|
|
|
|
|
|
penetration = true;
|
|
|
}
|
|
@@ -1261,7 +1261,7 @@ bool SpaceBullet::recover_from_penetration(RigidBodyBullet *p_body, const btTran
|
|
|
return penetration;
|
|
|
}
|
|
|
|
|
|
-bool SpaceBullet::RFP_convex_convex_test(const btConvexShape *p_shapeA, const btConvexShape *p_shapeB, btCollisionObject *p_objectB, int p_shapeId_B, const btTransform &p_transformA, const btTransform &p_transformB, btScalar p_recover_movement_scale, btVector3 &r_delta_recover_movement, RecoverResult *r_recover_result) {
|
|
|
+bool SpaceBullet::RFP_convex_convex_test(const btConvexShape *p_shapeA, const btConvexShape *p_shapeB, btCollisionObject *p_objectB, int p_shapeId_A, int p_shapeId_B, const btTransform &p_transformA, const btTransform &p_transformB, btScalar p_recover_movement_scale, btVector3 &r_delta_recover_movement, RecoverResult *r_recover_result) {
|
|
|
|
|
|
// Initialize GJK input
|
|
|
btGjkPairDetector::ClosestPointInput gjk_input;
|
|
@@ -1279,6 +1279,7 @@ bool SpaceBullet::RFP_convex_convex_test(const btConvexShape *p_shapeA, const bt
|
|
|
if (r_recover_result) {
|
|
|
if (result.m_distance < r_recover_result->penetration_distance) {
|
|
|
r_recover_result->hasPenetration = true;
|
|
|
+ r_recover_result->local_shape_most_recovered = p_shapeId_A;
|
|
|
r_recover_result->other_collision_object = p_objectB;
|
|
|
r_recover_result->other_compound_shape_index = p_shapeId_B;
|
|
|
r_recover_result->penetration_distance = result.m_distance;
|
|
@@ -1314,6 +1315,7 @@ bool SpaceBullet::RFP_convex_world_test(const btConvexShape *p_shapeA, const btC
|
|
|
if (r_recover_result) {
|
|
|
if (contactPointResult.m_penetration_distance < r_recover_result->penetration_distance) {
|
|
|
r_recover_result->hasPenetration = true;
|
|
|
+ r_recover_result->local_shape_most_recovered = p_shapeId_A;
|
|
|
r_recover_result->other_collision_object = p_objectB;
|
|
|
r_recover_result->other_compound_shape_index = p_shapeId_B;
|
|
|
r_recover_result->penetration_distance = contactPointResult.m_penetration_distance;
|