forked from MoonsideGames/MoonTools.Bonk
				
			restructure files
							parent
							
								
									20872021fc
								
							
						
					
					
						commit
						a53677ba02
					
				| 
						 | 
					@ -2,90 +2,10 @@
 | 
				
			||||||
using MoonTools.Core.Structs;
 | 
					using MoonTools.Core.Structs;
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
using MoonTools.Core.Bonk.Extensions;
 | 
					using MoonTools.Core.Bonk.Extensions;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MoonTools.Core.Bonk
 | 
					namespace MoonTools.Core.Bonk
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public struct MinkowskiDifference : IEquatable<MinkowskiDifference>
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        private IShape2D shapeA;
 | 
					 | 
				
			||||||
        private Transform2D transformA;
 | 
					 | 
				
			||||||
        private IShape2D shapeB;
 | 
					 | 
				
			||||||
        private Transform2D transformB;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public MinkowskiDifference(IShape2D shapeA, Transform2D transformA, IShape2D shapeB, Transform2D transformB)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            this.shapeA = shapeA;
 | 
					 | 
				
			||||||
            this.transformA = transformA;
 | 
					 | 
				
			||||||
            this.shapeB = shapeB;
 | 
					 | 
				
			||||||
            this.transformB = transformB;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public bool Equals(MinkowskiDifference other)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
                shapeA == other.shapeA &&
 | 
					 | 
				
			||||||
                transformA.Equals(other.transformA) &&
 | 
					 | 
				
			||||||
                shapeB == other.shapeB &&
 | 
					 | 
				
			||||||
                transformB.Equals(other.transformB);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public Vector2 Support(Vector2 direction)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return shapeA.Support(direction, transformA) - shapeB.Support(-direction, transformB);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public struct Simplex : IShape2D
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        MinkowskiDifference minkowskiDifference;
 | 
					 | 
				
			||||||
        Vector2 directionA;
 | 
					 | 
				
			||||||
        Vector2 directionB;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public Simplex(MinkowskiDifference minkowskiDifference, Vector2 directionA, Vector2 directionB)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            this.minkowskiDifference = minkowskiDifference;
 | 
					 | 
				
			||||||
            this.directionA = directionA;
 | 
					 | 
				
			||||||
            this.directionB = directionB;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public IEnumerable<Position2D> Vertices
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            get
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                yield return (Position2D)Support(directionA);
 | 
					 | 
				
			||||||
                yield return (Position2D)Support(directionB);
 | 
					 | 
				
			||||||
                yield return (Position2D)Support(-(directionB - directionA).Perpendicular());
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public AABB AABB(Transform2D transform)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return Bonk.AABB.FromTransformedVertices(Vertices, transform);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public bool Equals(IShape2D other)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if (other is Simplex polytope)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                return minkowskiDifference.Equals(polytope.minkowskiDifference) &&
 | 
					 | 
				
			||||||
                    directionA == polytope.directionA &&
 | 
					 | 
				
			||||||
                    directionB == polytope.directionB;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public Vector2 Support(Vector2 direction)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return minkowskiDifference.Support(direction);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public Vector2 Support(Vector2 direction, Transform2D transform)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return Vector2.Transform(Support(direction), transform.TransformMatrix);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static class GJK2D
 | 
					    public static class GJK2D
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,36 @@
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using Microsoft.Xna.Framework;
 | 
				
			||||||
 | 
					using MoonTools.Core.Structs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MoonTools.Core.Bonk
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public struct MinkowskiDifference : IEquatable<MinkowskiDifference>
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private IShape2D shapeA;
 | 
				
			||||||
 | 
					        private Transform2D transformA;
 | 
				
			||||||
 | 
					        private IShape2D shapeB;
 | 
				
			||||||
 | 
					        private Transform2D transformB;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public MinkowskiDifference(IShape2D shapeA, Transform2D transformA, IShape2D shapeB, Transform2D transformB)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            this.shapeA = shapeA;
 | 
				
			||||||
 | 
					            this.transformA = transformA;
 | 
				
			||||||
 | 
					            this.shapeB = shapeB;
 | 
				
			||||||
 | 
					            this.transformB = transformB;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public bool Equals(MinkowskiDifference other)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					                shapeA == other.shapeA &&
 | 
				
			||||||
 | 
					                transformA.Equals(other.transformA) &&
 | 
				
			||||||
 | 
					                shapeB == other.shapeB &&
 | 
				
			||||||
 | 
					                transformB.Equals(other.transformB);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public Vector2 Support(Vector2 direction)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return shapeA.Support(direction, transformA) - shapeB.Support(-direction, transformB);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,58 @@
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using Microsoft.Xna.Framework;
 | 
				
			||||||
 | 
					using MoonTools.Core.Structs;
 | 
				
			||||||
 | 
					using MoonTools.Core.Bonk.Extensions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MoonTools.Core.Bonk
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public struct Simplex : IShape2D
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        MinkowskiDifference minkowskiDifference;
 | 
				
			||||||
 | 
					        Vector2 directionA;
 | 
				
			||||||
 | 
					        Vector2 directionB;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public Simplex(MinkowskiDifference minkowskiDifference, Vector2 directionA, Vector2 directionB)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            this.minkowskiDifference = minkowskiDifference;
 | 
				
			||||||
 | 
					            this.directionA = directionA;
 | 
				
			||||||
 | 
					            this.directionB = directionB;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public IEnumerable<Position2D> Vertices
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            get
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                yield return (Position2D)Support(directionA);
 | 
				
			||||||
 | 
					                yield return (Position2D)Support(directionB);
 | 
				
			||||||
 | 
					                yield return (Position2D)Support(-(directionB - directionA).Perpendicular());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public AABB AABB(Transform2D transform)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return Bonk.AABB.FromTransformedVertices(Vertices, transform);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public bool Equals(IShape2D other)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (other is Simplex polytope)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return minkowskiDifference.Equals(polytope.minkowskiDifference) &&
 | 
				
			||||||
 | 
					                    directionA == polytope.directionA &&
 | 
				
			||||||
 | 
					                    directionB == polytope.directionB;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public Vector2 Support(Vector2 direction)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return minkowskiDifference.Support(direction);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public Vector2 Support(Vector2 direction, Transform2D transform)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return Vector2.Transform(Support(direction), transform.TransformMatrix);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -2,15 +2,15 @@ using Microsoft.Xna.Framework;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MoonTools.Core.Bonk.Extensions
 | 
					namespace MoonTools.Core.Bonk.Extensions
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public static class Vector2Extensions
 | 
					    internal static class Vector2Extensions
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public static Vector2 Cross(this Vector2 a, Vector2 b)
 | 
					        internal static Vector2 Cross(this Vector2 a, Vector2 b)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var vec3 = Vector3.Cross(new Vector3(a.X, a.Y, 0), new Vector3(b.X, b.Y, 0));
 | 
					            var vec3 = Vector3.Cross(new Vector3(a.X, a.Y, 0), new Vector3(b.X, b.Y, 0));
 | 
				
			||||||
            return new Vector2(vec3.X, vec3.Y);
 | 
					            return new Vector2(vec3.X, vec3.Y);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public static Vector2 Perpendicular(this Vector2 v)
 | 
					        internal static Vector2 Perpendicular(this Vector2 v)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new Vector2(v.Y, -v.X);
 | 
					            return new Vector2(v.Y, -v.X);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue