private void DoCollisionChecks(List <JCollider> colliders, HashSet <JCollisionPair> completedCollisions) { var endOuter = colliders.Count - 1; var endInner = colliders.Count; for (int i = 0; i < endOuter; i++) { var colliderA = colliders[i]; for (int j = i + 1; j < endInner; j++) { var colliderB = colliders[j]; if (ShouldSkipCollisionCheck(colliderA, colliderB, completedCollisions)) { continue; } enterStayExitManager.Add(new JCollisionPair(colliderA, colliderB)); if (colliderA.IsTrigger || colliderB.IsTrigger) { continue; } if (colliderA.IsStationary && colliderB.IsStationary) { continue; } var pushResult = JMeshOverlapPushUtil.CalculateMinimumPush(colliderA.meshFrame, colliderB.meshFrame); HandlePushResult(pushResult, colliderA, colliderB); } } }
public void Calculate_minmumPushDistance_should_push_b_down_even_when_argument_order_is_reversed() { var meshA = JMeshPhysicsMeshes.squareMeshIdentity; var meshB = JMesh.FromMeshAndTransform(JMeshPhysicsMeshes.triangleMeshIdentity, Matrix4x4.Translate(new Vector3(0, 0, -0.5f))); var pushResult = JMeshOverlapPushUtil.CalculateMinimumPush(meshB, meshA); TestMethods.AreEqualIshOrOppositeIsh(new Vector3(-1, 0, 1).normalized, pushResult.Direction); TestMethods.AreEqualIsh(Mathf.Sin(45 * Mathf.Deg2Rad) / 2f, pushResult.Magnitude, TestMethods.VECTOR_DIFF); }
public void Calculate_minmumPushDistance_should_push_b_left() { var meshA = JMeshPhysicsMeshes.squareMeshIdentity; var meshB = JMesh.FromMeshAndTransform(JMeshPhysicsMeshes.triangleMeshIdentity, Matrix4x4.Translate(new Vector3(-0.8f, 0, 0.25f))); var pushResult = JMeshOverlapPushUtil.CalculateMinimumPush(meshA, meshB); TestMethods.AreEqualIshOrOppositeIsh(new Vector3(-1, 0, 0), pushResult.Direction); TestMethods.AreEqualIsh(0.2f, pushResult.Magnitude, TestMethods.VECTOR_DIFF); }