44 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using Engine.Core;
 | 
						|
 | 
						|
namespace Engine.Physics2D;
 | 
						|
 | 
						|
public class CollisionResolver2D : ICollisionResolver2D
 | 
						|
{
 | 
						|
    public void Resolve(CollisionDetectionInformation collisionInformation)
 | 
						|
    {
 | 
						|
        Vector2D displacementVector = collisionInformation.Normal * collisionInformation.Penetration;
 | 
						|
 | 
						|
        ICollider2D left = collisionInformation.Detector;
 | 
						|
        ICollider2D right = collisionInformation.Detected;
 | 
						|
 | 
						|
        bool isLeftStatic = left.RigidBody2D?.IsStatic ?? true;
 | 
						|
        bool isRightStatic = right.RigidBody2D?.IsStatic ?? true;
 | 
						|
 | 
						|
        if (isLeftStatic && isRightStatic)
 | 
						|
            return;
 | 
						|
 | 
						|
        if (isLeftStatic)
 | 
						|
            right.Transform.Position += displacementVector;
 | 
						|
        else if (isRightStatic)
 | 
						|
            left.Transform.Position -= displacementVector;
 | 
						|
        else
 | 
						|
        {
 | 
						|
            float leftMass = left.RigidBody2D?.Mass ?? float.Epsilon;
 | 
						|
            float rightMass = right.RigidBody2D?.Mass ?? float.Epsilon;
 | 
						|
            float sumMass = leftMass + rightMass;
 | 
						|
 | 
						|
            float leftMomentumPercentage = leftMass / sumMass;
 | 
						|
            float rightMomentumPercentage = rightMass / sumMass;
 | 
						|
 | 
						|
            right.Transform.Position += leftMomentumPercentage * displacementVector;
 | 
						|
            left.Transform.Position -= rightMomentumPercentage * displacementVector;
 | 
						|
        }
 | 
						|
 | 
						|
        left.Recalculate();
 | 
						|
        right.Recalculate();
 | 
						|
 | 
						|
        left.Resolve(collisionInformation);
 | 
						|
        right.Resolve(collisionInformation);
 | 
						|
    }
 | 
						|
}
 |