specifying 2D and adds AABB3D
	
		
			
	
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
					Details
				
			
		
	
				
					
				
			
				
	
				continuous-integration/drone/push Build is passing
				
					Details
				
			
		
	
							parent
							
								
									e6bab0de5e
								
							
						
					
					
						commit
						6bda2e5ab4
					
				|  | @ -8,7 +8,7 @@ namespace MoonTools.Bonk | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Axis-aligned bounding box. |     /// Axis-aligned bounding box. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public struct AABB : IEquatable<AABB> |     public struct AABB2D : IEquatable<AABB2D> | ||||||
|     { |     { | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// The top-left position of the AABB. |         /// The top-left position of the AABB. | ||||||
|  | @ -39,13 +39,13 @@ namespace MoonTools.Bonk | ||||||
|         /// <value></value> |         /// <value></value> | ||||||
|         public float Bottom { get { return Max.Y; } } |         public float Bottom { get { return Max.Y; } } | ||||||
| 
 | 
 | ||||||
|         public AABB(float minX, float minY, float maxX, float maxY) |         public AABB2D(float minX, float minY, float maxX, float maxY) | ||||||
|         { |         { | ||||||
|             Min = new Vector2(minX, minY); |             Min = new Vector2(minX, minY); | ||||||
|             Max = new Vector2(maxX, maxY); |             Max = new Vector2(maxX, maxY); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public AABB(Vector2 min, Vector2 max) |         public AABB2D(Vector2 min, Vector2 max) | ||||||
|         { |         { | ||||||
|             Min = min; |             Min = min; | ||||||
|             Max = max; |             Max = max; | ||||||
|  | @ -67,7 +67,7 @@ namespace MoonTools.Bonk | ||||||
|         /// <param name="aabb"></param> |         /// <param name="aabb"></param> | ||||||
|         /// <param name="transform"></param> |         /// <param name="transform"></param> | ||||||
|         /// <returns></returns> |         /// <returns></returns> | ||||||
|         public static AABB Transformed(AABB aabb, Transform2D transform) |         public static AABB2D Transformed(AABB2D aabb, Transform2D transform) | ||||||
|         { |         { | ||||||
|             var center = (aabb.Min + aabb.Max) / 2f; |             var center = (aabb.Min + aabb.Max) / 2f; | ||||||
|             var extent = (aabb.Max - aabb.Min) / 2f; |             var extent = (aabb.Max - aabb.Min) / 2f; | ||||||
|  | @ -75,7 +75,7 @@ namespace MoonTools.Bonk | ||||||
|             var newCenter = Vector2.Transform(center, transform.TransformMatrix); |             var newCenter = Vector2.Transform(center, transform.TransformMatrix); | ||||||
|             var newExtent = Vector2.TransformNormal(extent, AbsoluteMatrix(transform.TransformMatrix)); |             var newExtent = Vector2.TransformNormal(extent, AbsoluteMatrix(transform.TransformMatrix)); | ||||||
| 
 | 
 | ||||||
|             return new AABB(newCenter - newExtent, newCenter + newExtent); |             return new AABB2D(newCenter - newExtent, newCenter + newExtent); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|  | @ -84,7 +84,7 @@ namespace MoonTools.Bonk | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         /// <param name="vertices"></param> |         /// <param name="vertices"></param> | ||||||
|         /// <returns></returns> |         /// <returns></returns> | ||||||
|         public static AABB FromVertices(IEnumerable<Position2D> vertices) |         public static AABB2D FromVertices(IEnumerable<Position2D> vertices) | ||||||
|         { |         { | ||||||
|             var minX = float.MaxValue; |             var minX = float.MaxValue; | ||||||
|             var minY = float.MaxValue; |             var minY = float.MaxValue; | ||||||
|  | @ -111,20 +111,28 @@ namespace MoonTools.Bonk | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             return new AABB(minX, minY, maxX, maxY); |             return new AABB2D(minX, minY, maxX, maxY); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public static bool TestOverlap(AABB a, AABB b) |         public static bool TestOverlap(AABB2D a, AABB2D b) | ||||||
|         { |         { | ||||||
|             return a.Left <= b.Right && a.Right >= b.Left && a.Top <= b.Bottom && a.Bottom >= b.Top; |             return a.Left <= b.Right && a.Right >= b.Left && a.Top <= b.Bottom && a.Bottom >= b.Top; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public override bool Equals(object obj) |         public AABB2D Merge(AABB2D other) | ||||||
|         { |         { | ||||||
|             return obj is AABB aabb && Equals(aabb); |             return new AABB2D( | ||||||
|  |                 Vector2.Min(Min, other.Min), | ||||||
|  |                 Vector2.Max(Max, other.Max) | ||||||
|  |             ); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public bool Equals(AABB other) |         public override bool Equals(object obj) | ||||||
|  |         { | ||||||
|  |             return obj is AABB2D aabb && Equals(aabb); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public bool Equals(AABB2D other) | ||||||
|         { |         { | ||||||
|             return Min == other.Min && |             return Min == other.Min && | ||||||
|                    Max == other.Max; |                    Max == other.Max; | ||||||
|  | @ -135,12 +143,12 @@ namespace MoonTools.Bonk | ||||||
|             return HashCode.Combine(Min, Max); |             return HashCode.Combine(Min, Max); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public static bool operator ==(AABB left, AABB right) |         public static bool operator ==(AABB2D left, AABB2D right) | ||||||
|         { |         { | ||||||
|             return left.Equals(right); |             return left.Equals(right); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public static bool operator !=(AABB left, AABB right) |         public static bool operator !=(AABB2D left, AABB2D right) | ||||||
|         { |         { | ||||||
|             return !(left == right); |             return !(left == right); | ||||||
|         } |         } | ||||||
|  | @ -0,0 +1,67 @@ | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Numerics; | ||||||
|  | using MoonTools.Structs; | ||||||
|  | 
 | ||||||
|  | namespace MoonTools.Bonk | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Axis-aligned bounding box in 3 dimensions. | ||||||
|  |     /// </summary> | ||||||
|  |     public struct AABB3D : IEquatable<AABB3D> | ||||||
|  |     { | ||||||
|  |         public Vector3 Min { get; private set; } | ||||||
|  | 
 | ||||||
|  |         public Vector3 Max { get; private set; } | ||||||
|  | 
 | ||||||
|  |         public float Width { get { return Max.X - Min.X; } } | ||||||
|  |         public float Height { get { return Max.Y - Min.Y; } } | ||||||
|  |         public float Depth { get { return Max.Z - Min.Z; } } | ||||||
|  | 
 | ||||||
|  |         public AABB3D(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) | ||||||
|  |         { | ||||||
|  |             Min = new Vector3(minX, minY, minZ); | ||||||
|  |             Max = new Vector3(maxX, maxY, maxZ); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public AABB3D(Vector3 min, Vector3 max) | ||||||
|  |         { | ||||||
|  |             Min = min; | ||||||
|  |             Max = max; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool TestOverlap(AABB3D a, AABB3D b) | ||||||
|  |         { | ||||||
|  |             return  | ||||||
|  |                 a.Min.X <= b.Max.X &&  | ||||||
|  |                 a.Max.X >= b.Min.X &&  | ||||||
|  |                 a.Min.Y <= b.Max.Y &&  | ||||||
|  |                 a.Max.Y >= b.Min.Y && | ||||||
|  |                 a.Min.Z <= b.Max.Z && | ||||||
|  |                 a.Max.Z >= b.Min.Z; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public AABB3D Merge(AABB3D other) | ||||||
|  |         { | ||||||
|  |             return new AABB3D( | ||||||
|  |                 Vector3.Min(Min, other.Min), | ||||||
|  |                 Vector3.Max(Max, other.Max) | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public override bool Equals(object obj) | ||||||
|  |         { | ||||||
|  |             return obj is AABB3D d && Equals(d); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public override int GetHashCode() | ||||||
|  |         { | ||||||
|  |             return HashCode.Combine(Min, Max); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public bool Equals(AABB3D other) | ||||||
|  |         { | ||||||
|  |             return Min == other.Min && Max == other.Max; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -9,7 +9,7 @@ namespace MoonTools.Bonk | ||||||
|     /// Used to quickly check if two shapes are potentially overlapping. |     /// Used to quickly check if two shapes are potentially overlapping. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <typeparam name="T">The type that will be used to uniquely identify shape-transform pairs.</typeparam> |     /// <typeparam name="T">The type that will be used to uniquely identify shape-transform pairs.</typeparam> | ||||||
|     public class SpatialHash<T> where T : IEquatable<T> |     public class SpatialHash2D<T> where T : IEquatable<T> | ||||||
|     { |     { | ||||||
|         private readonly int cellSize; |         private readonly int cellSize; | ||||||
| 
 | 
 | ||||||
|  | @ -22,7 +22,7 @@ namespace MoonTools.Bonk | ||||||
|         public int MaxY { get; private set; } = 0; |         public int MaxY { get; private set; } = 0; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         public SpatialHash(int cellSize) |         public SpatialHash2D(int cellSize) | ||||||
|         { |         { | ||||||
|             this.cellSize = cellSize; |             this.cellSize = cellSize; | ||||||
|         } |         } | ||||||
|  | @ -89,7 +89,7 @@ namespace MoonTools.Bonk | ||||||
|                         foreach (var t in hashDictionary[key]) |                         foreach (var t in hashDictionary[key]) | ||||||
|                         { |                         { | ||||||
|                             var (otherShape, otherTransform) = IDLookup[t]; |                             var (otherShape, otherTransform) = IDLookup[t]; | ||||||
|                             if (!id.Equals(t) && AABB.TestOverlap(box, otherShape.TransformedAABB(otherTransform))) |                             if (!id.Equals(t) && AABB2D.TestOverlap(box, otherShape.TransformedAABB(otherTransform))) | ||||||
|                             { |                             { | ||||||
|                                 yield return (t, otherShape, otherTransform); |                                 yield return (t, otherShape, otherTransform); | ||||||
|                             } |                             } | ||||||
|  | @ -105,7 +105,7 @@ namespace MoonTools.Bonk | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         /// <param name="aabb">A transformed AABB.</param> |         /// <param name="aabb">A transformed AABB.</param> | ||||||
|         /// <returns></returns> |         /// <returns></returns> | ||||||
|         public IEnumerable<(T, IHasAABB2D, Transform2D)> Retrieve(AABB aabb) |         public IEnumerable<(T, IHasAABB2D, Transform2D)> Retrieve(AABB2D aabb) | ||||||
|         { |         { | ||||||
|             var (minX, minY) = Hash(aabb.Min); |             var (minX, minY) = Hash(aabb.Min); | ||||||
|             var (maxX, maxY) = Hash(aabb.Max); |             var (maxX, maxY) = Hash(aabb.Max); | ||||||
|  | @ -125,7 +125,7 @@ namespace MoonTools.Bonk | ||||||
|                         foreach (var t in hashDictionary[key]) |                         foreach (var t in hashDictionary[key]) | ||||||
|                         { |                         { | ||||||
|                             var (otherShape, otherTransform) = IDLookup[t]; |                             var (otherShape, otherTransform) = IDLookup[t]; | ||||||
|                             if (AABB.TestOverlap(aabb, otherShape.TransformedAABB(otherTransform))) |                             if (AABB2D.TestOverlap(aabb, otherShape.TransformedAABB(otherTransform))) | ||||||
|                             { |                             { | ||||||
|                                 yield return (t, otherShape, otherTransform); |                                 yield return (t, otherShape, otherTransform); | ||||||
|                             } |                             } | ||||||
|  | @ -4,13 +4,13 @@ namespace MoonTools.Bonk | ||||||
| { | { | ||||||
|     public interface IHasAABB2D |     public interface IHasAABB2D | ||||||
|     { |     { | ||||||
|         AABB AABB { get; } |         AABB2D AABB { get; } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Returns a bounding box based on the shape. |         /// Returns a bounding box based on the shape. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         /// <param name="transform">A Transform for transforming the shape vertices.</param> |         /// <param name="transform">A Transform for transforming the shape vertices.</param> | ||||||
|         /// <returns>Returns a bounding box based on the shape.</returns> |         /// <returns>Returns a bounding box based on the shape.</returns> | ||||||
|         AABB TransformedAABB(Transform2D transform); |         AABB2D TransformedAABB(Transform2D transform); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5,22 +5,22 @@ using MoonTools.Structs; | ||||||
| 
 | 
 | ||||||
| namespace MoonTools.Bonk | namespace MoonTools.Bonk | ||||||
| { | { | ||||||
|     public struct MultiShape : IHasAABB2D |     public struct MultiShape2D : IHasAABB2D | ||||||
|     { |     { | ||||||
|         public ImmutableArray<(IShape2D, Transform2D)> ShapeTransformPairs { get; } |         public ImmutableArray<(IShape2D, Transform2D)> ShapeTransformPairs { get; } | ||||||
| 
 | 
 | ||||||
|         public AABB AABB { get; } |         public AABB2D AABB { get; } | ||||||
| 
 | 
 | ||||||
|         public MultiShape(ImmutableArray<(IShape2D, Transform2D)> shapeTransformPairs) |         public MultiShape2D(ImmutableArray<(IShape2D, Transform2D)> shapeTransformPairs) | ||||||
|         { |         { | ||||||
|             ShapeTransformPairs = shapeTransformPairs; |             ShapeTransformPairs = shapeTransformPairs; | ||||||
| 
 | 
 | ||||||
|             AABB = AABBFromShapes(shapeTransformPairs); |             AABB = AABBFromShapes(shapeTransformPairs); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public AABB TransformedAABB(Transform2D transform) |         public AABB2D TransformedAABB(Transform2D transform) | ||||||
|         { |         { | ||||||
|             return AABB.Transformed(AABB, transform); |             return AABB2D.Transformed(AABB, transform); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|  | @ -47,7 +47,7 @@ namespace MoonTools.Bonk | ||||||
|             return ((T, Transform2D))ShapeTransformPairs[0]; |             return ((T, Transform2D))ShapeTransformPairs[0]; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private static AABB AABBFromShapes(IEnumerable<(IShape2D, Transform2D)> shapeTransforms) |         private static AABB2D AABBFromShapes(IEnumerable<(IShape2D, Transform2D)> shapeTransforms) | ||||||
|         { |         { | ||||||
|             var minX = float.MaxValue; |             var minX = float.MaxValue; | ||||||
|             var minY = float.MaxValue; |             var minY = float.MaxValue; | ||||||
|  | @ -76,7 +76,7 @@ namespace MoonTools.Bonk | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             return new AABB(minX, minY, maxX, maxY); |             return new AABB2D(minX, minY, maxX, maxY); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -2,13 +2,13 @@ | ||||||
| 
 | 
 | ||||||
| namespace MoonTools.Bonk | namespace MoonTools.Bonk | ||||||
| { | { | ||||||
|     internal struct Edge |     internal struct Edge2D | ||||||
|     { |     { | ||||||
|         public float distance; |         public float distance; | ||||||
|         public Vector2 normal; |         public Vector2 normal; | ||||||
|         public int index; |         public int index; | ||||||
| 
 | 
 | ||||||
|         public Edge(float distance, Vector2 normal, int index) |         public Edge2D(float distance, Vector2 normal, int index) | ||||||
|         { |         { | ||||||
|             this.distance = distance; |             this.distance = distance; | ||||||
|             this.normal = normal; |             this.normal = normal; | ||||||
|  | @ -16,17 +16,17 @@ namespace MoonTools.Bonk | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public static bool TestCollision(IHasAABB2D hasBoundingBoxA, Transform2D transformA, IHasAABB2D hasBoundingBoxB, Transform2D transformB) |         public static bool TestCollision(IHasAABB2D hasBoundingBoxA, Transform2D transformA, IHasAABB2D hasBoundingBoxB, Transform2D transformB) | ||||||
|         { |         { | ||||||
|             if (hasBoundingBoxA is MultiShape && hasBoundingBoxB is MultiShape) |             if (hasBoundingBoxA is MultiShape2D && hasBoundingBoxB is MultiShape2D) | ||||||
|             { |             { | ||||||
|                 return TestCollision((MultiShape)hasBoundingBoxA, transformA, (MultiShape)hasBoundingBoxB, transformB); |                 return TestCollision((MultiShape2D)hasBoundingBoxA, transformA, (MultiShape2D)hasBoundingBoxB, transformB); | ||||||
|             } |             } | ||||||
|             else if (hasBoundingBoxA is MultiShape && hasBoundingBoxB is IShape2D) |             else if (hasBoundingBoxA is MultiShape2D && hasBoundingBoxB is IShape2D) | ||||||
|             { |             { | ||||||
|                 return TestCollision((MultiShape)hasBoundingBoxA, transformA, (IShape2D)hasBoundingBoxB, transformB); |                 return TestCollision((MultiShape2D)hasBoundingBoxA, transformA, (IShape2D)hasBoundingBoxB, transformB); | ||||||
|             } |             } | ||||||
|             else if (hasBoundingBoxA is IShape2D && hasBoundingBoxB is MultiShape) |             else if (hasBoundingBoxA is IShape2D && hasBoundingBoxB is MultiShape2D) | ||||||
|             { |             { | ||||||
|                 return TestCollision((IShape2D)hasBoundingBoxA, transformA, (MultiShape)hasBoundingBoxB, transformB); |                 return TestCollision((IShape2D)hasBoundingBoxA, transformA, (MultiShape2D)hasBoundingBoxB, transformB); | ||||||
|             } |             } | ||||||
|             else if (hasBoundingBoxA is IShape2D && hasBoundingBoxB is IShape2D) |             else if (hasBoundingBoxA is IShape2D && hasBoundingBoxB is IShape2D) | ||||||
|             { |             { | ||||||
|  | @ -68,7 +68,7 @@ namespace MoonTools.Bonk | ||||||
|         /// <param name="shape"></param> |         /// <param name="shape"></param> | ||||||
|         /// <param name="shapeTransform"></param> |         /// <param name="shapeTransform"></param> | ||||||
|         /// <returns></returns> |         /// <returns></returns> | ||||||
|         public static bool TestCollision(MultiShape multiShape, Transform2D multiShapeTransform, IShape2D shape, Transform2D shapeTransform) |         public static bool TestCollision(MultiShape2D multiShape, Transform2D multiShapeTransform, IShape2D shape, Transform2D shapeTransform) | ||||||
|         { |         { | ||||||
|             foreach (var (otherShape, otherTransform) in multiShape.TransformShapesUsingOffset(multiShapeTransform)) |             foreach (var (otherShape, otherTransform) in multiShape.TransformShapesUsingOffset(multiShapeTransform)) | ||||||
|             { |             { | ||||||
|  | @ -86,7 +86,7 @@ namespace MoonTools.Bonk | ||||||
|         /// <param name="shape"></param> |         /// <param name="shape"></param> | ||||||
|         /// <param name="shapeTransform"></param> |         /// <param name="shapeTransform"></param> | ||||||
|         /// <returns></returns> |         /// <returns></returns> | ||||||
|         public static bool TestCollision(IShape2D shape, Transform2D shapeTransform, MultiShape multiShape, Transform2D multiShapeTransform) |         public static bool TestCollision(IShape2D shape, Transform2D shapeTransform, MultiShape2D multiShape, Transform2D multiShapeTransform) | ||||||
|         { |         { | ||||||
|             foreach (var (otherShape, otherTransform) in multiShape.TransformShapesUsingOffset(multiShapeTransform)) |             foreach (var (otherShape, otherTransform) in multiShape.TransformShapesUsingOffset(multiShapeTransform)) | ||||||
|             { |             { | ||||||
|  | @ -104,7 +104,7 @@ namespace MoonTools.Bonk | ||||||
|         /// <param name="multiShapeB"></param> |         /// <param name="multiShapeB"></param> | ||||||
|         /// <param name="transformB"></param> |         /// <param name="transformB"></param> | ||||||
|         /// <returns></returns> |         /// <returns></returns> | ||||||
|         public static bool TestCollision(MultiShape multiShapeA, Transform2D transformA, MultiShape multiShapeB, Transform2D transformB) |         public static bool TestCollision(MultiShape2D multiShapeA, Transform2D transformA, MultiShape2D multiShapeB, Transform2D transformB) | ||||||
|         { |         { | ||||||
|             foreach (var (shapeA, shapeTransformA) in multiShapeA.TransformShapesUsingOffset(transformA)) |             foreach (var (shapeA, shapeTransformA) in multiShapeA.TransformShapesUsingOffset(transformA)) | ||||||
|             { |             { | ||||||
|  | @ -226,7 +226,7 @@ namespace MoonTools.Bonk | ||||||
|             return intersection; |             return intersection; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private static Edge FindClosestEdge(PolygonWinding winding, SimplexVertexBuffer simplexVertices) |         private static Edge2D FindClosestEdge(PolygonWinding winding, SimplexVertexBuffer simplexVertices) | ||||||
|         { |         { | ||||||
|             var closestDistance = float.PositiveInfinity; |             var closestDistance = float.PositiveInfinity; | ||||||
|             var closestNormal = Vector2.Zero; |             var closestNormal = Vector2.Zero; | ||||||
|  | @ -258,7 +258,7 @@ namespace MoonTools.Bonk | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             return new Edge(closestDistance, closestNormal, closestIndex); |             return new Edge2D(closestDistance, closestNormal, closestIndex); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private static Vector2 CalculateSupport(IShape2D shapeA, Transform2D Transform2DA, IShape2D shapeB, Transform2D Transform2DB, Vector2 direction) |         private static Vector2 CalculateSupport(IShape2D shapeA, Transform2D Transform2DA, IShape2D shapeB, Transform2D Transform2DB, Vector2 direction) | ||||||
|  |  | ||||||
|  | @ -10,12 +10,12 @@ namespace MoonTools.Bonk | ||||||
|     public struct Circle : IShape2D, IEquatable<Circle> |     public struct Circle : IShape2D, IEquatable<Circle> | ||||||
|     { |     { | ||||||
|         public int Radius { get; } |         public int Radius { get; } | ||||||
|         public AABB AABB { get; } |         public AABB2D AABB { get; } | ||||||
| 
 | 
 | ||||||
|         public Circle(int radius) |         public Circle(int radius) | ||||||
|         { |         { | ||||||
|             Radius = radius; |             Radius = radius; | ||||||
|             AABB = new AABB(-Radius, -Radius, Radius, Radius); |             AABB = new AABB2D(-Radius, -Radius, Radius, Radius); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public Vector2 Support(Vector2 direction, Transform2D transform) |         public Vector2 Support(Vector2 direction, Transform2D transform) | ||||||
|  | @ -23,9 +23,9 @@ namespace MoonTools.Bonk | ||||||
|             return Vector2.Transform(Vector2.Normalize(direction) * Radius, transform.TransformMatrix); |             return Vector2.Transform(Vector2.Normalize(direction) * Radius, transform.TransformMatrix); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public AABB TransformedAABB(Transform2D transform2D) |         public AABB2D TransformedAABB(Transform2D transform2D) | ||||||
|         { |         { | ||||||
|             return AABB.Transformed(AABB, transform2D); |             return AABB2D.Transformed(AABB, transform2D); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public override bool Equals(object obj) |         public override bool Equals(object obj) | ||||||
|  | @ -13,7 +13,7 @@ namespace MoonTools.Bonk | ||||||
|         private Position2D _v0; |         private Position2D _v0; | ||||||
|         private Position2D _v1; |         private Position2D _v1; | ||||||
| 
 | 
 | ||||||
|         public AABB AABB { get; } |         public AABB2D AABB { get; } | ||||||
| 
 | 
 | ||||||
|         public IEnumerable<Position2D> Vertices |         public IEnumerable<Position2D> Vertices | ||||||
|         { |         { | ||||||
|  | @ -29,7 +29,7 @@ namespace MoonTools.Bonk | ||||||
|             _v0 = start; |             _v0 = start; | ||||||
|             _v1 = end; |             _v1 = end; | ||||||
| 
 | 
 | ||||||
|             AABB = new AABB(Math.Min(_v0.X, _v1.X), Math.Min(_v0.Y, _v1.Y), Math.Max(_v0.X, _v1.X), Math.Max(_v0.Y, _v1.Y)); |             AABB = new AABB2D(Math.Min(_v0.X, _v1.X), Math.Min(_v0.Y, _v1.Y), Math.Max(_v0.X, _v1.X), Math.Max(_v0.Y, _v1.Y)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public Vector2 Support(Vector2 direction, Transform2D transform) |         public Vector2 Support(Vector2 direction, Transform2D transform) | ||||||
|  | @ -41,9 +41,9 @@ namespace MoonTools.Bonk | ||||||
|                 transformedEnd; |                 transformedEnd; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public AABB TransformedAABB(Transform2D transform) |         public AABB2D TransformedAABB(Transform2D transform) | ||||||
|         { |         { | ||||||
|             return AABB.Transformed(AABB, transform); |             return AABB2D.Transformed(AABB, transform); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public override bool Equals(object obj) |         public override bool Equals(object obj) | ||||||
|  | @ -9,11 +9,11 @@ namespace MoonTools.Bonk | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public struct Point : IShape2D, IEquatable<Point> |     public struct Point : IShape2D, IEquatable<Point> | ||||||
|     { |     { | ||||||
|         public AABB AABB { get; } |         public AABB2D AABB { get; } | ||||||
| 
 | 
 | ||||||
|         public AABB TransformedAABB(Transform2D transform) |         public AABB2D TransformedAABB(Transform2D transform) | ||||||
|         { |         { | ||||||
|             return AABB.Transformed(AABB, transform); |             return AABB2D.Transformed(AABB, transform); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public Vector2 Support(Vector2 direction, Transform2D transform) |         public Vector2 Support(Vector2 direction, Transform2D transform) | ||||||
|  | @ -10,24 +10,24 @@ namespace MoonTools.Bonk | ||||||
|     /// A Shape defined by an arbitrary collection of vertices. |     /// A Shape defined by an arbitrary collection of vertices. | ||||||
|     /// NOTE: A Polygon must be defined in clockwise order, have more than 2 vertices, be convex, and have no duplicate vertices. |     /// NOTE: A Polygon must be defined in clockwise order, have more than 2 vertices, be convex, and have no duplicate vertices. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public struct Polygon : IShape2D, IEquatable<Polygon> |     public struct Polygon2D : IShape2D, IEquatable<Polygon2D> | ||||||
|     { |     { | ||||||
|         public ImmutableArray<Position2D> Vertices { get; private set; } |         public ImmutableArray<Position2D> Vertices { get; private set; } | ||||||
|         public AABB AABB { get; } |         public AABB2D AABB { get; } | ||||||
| 
 | 
 | ||||||
|         public int VertexCount { get { return Vertices.Length; } } |         public int VertexCount { get { return Vertices.Length; } } | ||||||
| 
 | 
 | ||||||
|         // vertices are local to the origin |         // vertices are local to the origin | ||||||
|         public Polygon(IEnumerable<Position2D> vertices) |         public Polygon2D(IEnumerable<Position2D> vertices) | ||||||
|         { |         { | ||||||
|             Vertices = vertices.ToImmutableArray(); |             Vertices = vertices.ToImmutableArray(); | ||||||
|             AABB = AABB.FromVertices(vertices); |             AABB = AABB2D.FromVertices(vertices); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public Polygon(ImmutableArray<Position2D> vertices) |         public Polygon2D(ImmutableArray<Position2D> vertices) | ||||||
|         { |         { | ||||||
|             Vertices = vertices; |             Vertices = vertices; | ||||||
|             AABB = AABB.FromVertices(vertices); |             AABB = AABB2D.FromVertices(vertices); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public Vector2 Support(Vector2 direction, Transform2D transform) |         public Vector2 Support(Vector2 direction, Transform2D transform) | ||||||
|  | @ -47,9 +47,9 @@ namespace MoonTools.Bonk | ||||||
|             return maxVertex; |             return maxVertex; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public AABB TransformedAABB(Transform2D transform) |         public AABB2D TransformedAABB(Transform2D transform) | ||||||
|         { |         { | ||||||
|             return AABB.Transformed(AABB, transform); |             return AABB2D.Transformed(AABB, transform); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public override bool Equals(object obj) |         public override bool Equals(object obj) | ||||||
|  | @ -59,10 +59,10 @@ namespace MoonTools.Bonk | ||||||
| 
 | 
 | ||||||
|         public bool Equals(IShape2D other) |         public bool Equals(IShape2D other) | ||||||
|         { |         { | ||||||
|             return other is Polygon otherPolygon && Equals(otherPolygon); |             return other is Polygon2D otherPolygon && Equals(otherPolygon); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public bool Equals(Polygon other) |         public bool Equals(Polygon2D other) | ||||||
|         { |         { | ||||||
|             if (VertexCount != other.VertexCount) { return false; } |             if (VertexCount != other.VertexCount) { return false; } | ||||||
| 
 | 
 | ||||||
|  | @ -87,22 +87,22 @@ namespace MoonTools.Bonk | ||||||
|             return HashCode.Combine(Vertices); |             return HashCode.Combine(Vertices); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public static bool operator ==(Polygon a, Polygon b) |         public static bool operator ==(Polygon2D a, Polygon2D b) | ||||||
|         { |         { | ||||||
|             return a.Equals(b); |             return a.Equals(b); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public static bool operator !=(Polygon a, Polygon b) |         public static bool operator !=(Polygon2D a, Polygon2D b) | ||||||
|         { |         { | ||||||
|             return !(a == b); |             return !(a == b); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public static bool operator ==(Polygon a, Rectangle b) |         public static bool operator ==(Polygon2D a, Rectangle b) | ||||||
|         { |         { | ||||||
|             return a.Equals(b); |             return a.Equals(b); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public static bool operator !=(Polygon a, Rectangle b) |         public static bool operator !=(Polygon2D a, Rectangle b) | ||||||
|         { |         { | ||||||
|             return !(a == b); |             return !(a == b); | ||||||
|         } |         } | ||||||
|  | @ -9,7 +9,7 @@ namespace MoonTools.Bonk | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public struct Rectangle : IShape2D, IEquatable<Rectangle> |     public struct Rectangle : IShape2D, IEquatable<Rectangle> | ||||||
|     { |     { | ||||||
|         public AABB AABB { get; } |         public AABB2D AABB { get; } | ||||||
|         public int Width { get; } |         public int Width { get; } | ||||||
|         public int Height { get; } |         public int Height { get; } | ||||||
| 
 | 
 | ||||||
|  | @ -31,7 +31,7 @@ namespace MoonTools.Bonk | ||||||
|             Right = left + width; |             Right = left + width; | ||||||
|             Top = top; |             Top = top; | ||||||
|             Bottom = top + height; |             Bottom = top + height; | ||||||
|             AABB = new AABB(left, top, Right, Bottom); |             AABB = new AABB2D(left, top, Right, Bottom); | ||||||
|             BottomLeft = new Vector2(Left, Bottom); |             BottomLeft = new Vector2(Left, Bottom); | ||||||
|             TopRight = new Vector2(Top, Right); |             TopRight = new Vector2(Top, Right); | ||||||
|             Min = AABB.Min; |             Min = AABB.Min; | ||||||
|  | @ -70,9 +70,9 @@ namespace MoonTools.Bonk | ||||||
|             return Vector2.Transform(Support(inverseDirection), transform.TransformMatrix); |             return Vector2.Transform(Support(inverseDirection), transform.TransformMatrix); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public AABB TransformedAABB(Transform2D transform) |         public AABB2D TransformedAABB(Transform2D transform) | ||||||
|         { |         { | ||||||
|             return AABB.Transformed(AABB, transform); |             return AABB2D.Transformed(AABB, transform); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public override bool Equals(object obj) |         public override bool Equals(object obj) | ||||||
|  | @ -105,12 +105,12 @@ namespace MoonTools.Bonk | ||||||
|             return !(a == b); |             return !(a == b); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public static bool operator ==(Rectangle a, Polygon b) |         public static bool operator ==(Rectangle a, Polygon2D b) | ||||||
|         { |         { | ||||||
|             return a.Equals(b); |             return a.Equals(b); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public static bool operator !=(Rectangle a, Polygon b) |         public static bool operator !=(Rectangle a, Polygon2D b) | ||||||
|         { |         { | ||||||
|             return !(a == b); |             return !(a == b); | ||||||
|         } |         } | ||||||
|  | @ -15,7 +15,7 @@ namespace MoonTools.Bonk | ||||||
|         /// <param name="transform">A transform by which to transform the IHasAABB2D.</param> |         /// <param name="transform">A transform by which to transform the IHasAABB2D.</param> | ||||||
|         /// <param name="ray">Given in world-space.</param> |         /// <param name="ray">Given in world-space.</param> | ||||||
|         /// <returns></returns> |         /// <returns></returns> | ||||||
|         public static SweepResult<T> Test<T>(SpatialHash<T> spatialHash, Rectangle rectangle, Transform2D transform, Vector2 ray) where T : IEquatable<T> |         public static SweepResult<T> Test<T>(SpatialHash2D<T> spatialHash, Rectangle rectangle, Transform2D transform, Vector2 ray) where T : IEquatable<T> | ||||||
|         { |         { | ||||||
|             var transformedAABB = rectangle.TransformedAABB(transform); |             var transformedAABB = rectangle.TransformedAABB(transform); | ||||||
|             var sweepBox = SweepBox(transformedAABB, ray); |             var sweepBox = SweepBox(transformedAABB, ray); | ||||||
|  | @ -29,14 +29,14 @@ namespace MoonTools.Bonk | ||||||
|             { |             { | ||||||
|                 Rectangle otherRectangle; |                 Rectangle otherRectangle; | ||||||
|                 Transform2D otherTransform; |                 Transform2D otherTransform; | ||||||
|                 AABB otherTransformedAABB; |                 AABB2D otherTransformedAABB; | ||||||
|                 if (shape is Rectangle) |                 if (shape is Rectangle) | ||||||
|                 { |                 { | ||||||
|                     otherRectangle = (Rectangle)shape; |                     otherRectangle = (Rectangle)shape; | ||||||
|                     otherTransformedAABB = shape.TransformedAABB(shapeTransform); |                     otherTransformedAABB = shape.TransformedAABB(shapeTransform); | ||||||
|                     otherTransform = shapeTransform; |                     otherTransform = shapeTransform; | ||||||
|                 } |                 } | ||||||
|                 else if (shape is MultiShape multiShape && multiShape.IsSingleShape<Rectangle>()) |                 else if (shape is MultiShape2D multiShape && multiShape.IsSingleShape<Rectangle>()) | ||||||
|                 { |                 { | ||||||
|                     Transform2D rectangleOffset; |                     Transform2D rectangleOffset; | ||||||
|                     (otherRectangle, rectangleOffset) = multiShape.ShapeTransformPair<Rectangle>(); |                     (otherRectangle, rectangleOffset) = multiShape.ShapeTransformPair<Rectangle>(); | ||||||
|  | @ -116,14 +116,14 @@ namespace MoonTools.Bonk | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public static SweepResult<T> Test<T>(SpatialHash<T> spatialHash, Point point, Transform2D transform, Vector2 ray) where T : IEquatable<T> |         public static SweepResult<T> Test<T>(SpatialHash2D<T> spatialHash, Point point, Transform2D transform, Vector2 ray) where T : IEquatable<T> | ||||||
|         { |         { | ||||||
|             return Test(spatialHash, new Rectangle(0, 0, 0, 0), transform, ray); |             return Test(spatialHash, new Rectangle(0, 0, 0, 0), transform, ray); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private static AABB SweepBox(AABB aabb, Vector2 ray) |         private static AABB2D SweepBox(AABB2D aabb, Vector2 ray) | ||||||
|         { |         { | ||||||
|             return new AABB( |             return new AABB2D( | ||||||
|                 Math.Min(aabb.Min.X, aabb.Min.X + ray.X), |                 Math.Min(aabb.Min.X, aabb.Min.X + ray.X), | ||||||
|                 Math.Min(aabb.Min.Y, aabb.Min.Y + ray.Y), |                 Math.Min(aabb.Min.Y, aabb.Min.Y + ray.Y), | ||||||
|                 Math.Max(aabb.Max.X, aabb.Max.X + ray.X), |                 Math.Max(aabb.Max.X, aabb.Max.X + ray.X), | ||||||
|  |  | ||||||
|  | @ -0,0 +1,42 @@ | ||||||
|  | using NUnit.Framework; | ||||||
|  | using FluentAssertions; | ||||||
|  | using MoonTools.Bonk; | ||||||
|  | using System.Numerics; | ||||||
|  | 
 | ||||||
|  | namespace Tests | ||||||
|  | { | ||||||
|  |     public class AABB2DTest | ||||||
|  |     { | ||||||
|  |         [Test] | ||||||
|  |         public void Overlapping() | ||||||
|  |         { | ||||||
|  |             var a = new AABB2D(new Vector2(-1, -1), new Vector2(1, 1)); | ||||||
|  |             var b = new AABB2D(new Vector2(0, 0), new Vector2(2, 2)); | ||||||
|  | 
 | ||||||
|  |             AABB2D.TestOverlap(a, b).Should().BeTrue(); | ||||||
|  | 
 | ||||||
|  |             var c = new AABB2D(-2, -2, 2, 1); | ||||||
|  |             var d = new AABB2D(-2, -2, 2, 2); | ||||||
|  | 
 | ||||||
|  |             AABB2D.TestOverlap(c, d).Should().BeTrue(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void NotOverlapping() | ||||||
|  |         { | ||||||
|  |             var a = new AABB2D(new Vector2(-1, -1), new Vector2(1, 1)); | ||||||
|  |             var b = new AABB2D(new Vector2(-3, -3), new Vector2(-2, -2)); | ||||||
|  | 
 | ||||||
|  |             AABB2D.TestOverlap(a, b).Should().BeFalse(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void Merge() | ||||||
|  |         { | ||||||
|  |             var a = new AABB2D(new Vector2(-1, -2), new Vector2(2, 1)); | ||||||
|  |             var b = new AABB2D(new Vector2(-3, -1), new Vector2(3, 1)); | ||||||
|  | 
 | ||||||
|  |             a.Merge(b).Should().Be(new AABB2D(new Vector2(-3, -2), new Vector2(3, 1))); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,42 @@ | ||||||
|  | using NUnit.Framework; | ||||||
|  | using FluentAssertions; | ||||||
|  | using MoonTools.Bonk; | ||||||
|  | using System.Numerics; | ||||||
|  | 
 | ||||||
|  | namespace Tests | ||||||
|  | { | ||||||
|  |     public class AABB3DTest | ||||||
|  |     { | ||||||
|  |         [Test] | ||||||
|  |         public void Overlapping() | ||||||
|  |         { | ||||||
|  |             var a = new AABB3D(new Vector3(-1, -1, -1), new Vector3(1, 1, 1)); | ||||||
|  |             var b = new AABB3D(new Vector3(0, 0, 0), new Vector3(2, 2, 2)); | ||||||
|  | 
 | ||||||
|  |             AABB3D.TestOverlap(a, b).Should().BeTrue(); | ||||||
|  | 
 | ||||||
|  |             var c = new AABB3D(-2, -2, 2, 2, 1, 2); | ||||||
|  |             var d = new AABB3D(-2, -2, 2, 2, 2, 2); | ||||||
|  | 
 | ||||||
|  |             AABB3D.TestOverlap(c, d).Should().BeTrue(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void NotOverlapping() | ||||||
|  |         { | ||||||
|  |             var a = new AABB3D(new Vector3(-1, -1, -1), new Vector3(1, 1, 1)); | ||||||
|  |             var b = new AABB3D(new Vector3(-3, -3, -3), new Vector3(-2, -2, -1)); | ||||||
|  | 
 | ||||||
|  |             AABB3D.TestOverlap(a, b).Should().BeFalse(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void Merge() | ||||||
|  |         { | ||||||
|  |             var a = new AABB3D(new Vector3(-1, -1, -1), new Vector3(2, 2, 2)); | ||||||
|  |             var b = new AABB3D(new Vector3(-2, -2, -1), new Vector3(3, 1, 3)); | ||||||
|  | 
 | ||||||
|  |             a.Merge(b).Should().Be(new AABB3D(new Vector3(-2, -2, -1), new Vector3(3, 2, 3))); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -1,33 +0,0 @@ | ||||||
| using NUnit.Framework; |  | ||||||
| using FluentAssertions; |  | ||||||
| using MoonTools.Bonk; |  | ||||||
| using System.Numerics; |  | ||||||
| 
 |  | ||||||
| namespace Tests |  | ||||||
| { |  | ||||||
|     public class AABBTest |  | ||||||
|     { |  | ||||||
|         [Test] |  | ||||||
|         public void Overlapping() |  | ||||||
|         { |  | ||||||
|             var a = new AABB(new Vector2(-1, -1), new Vector2(1, 1)); |  | ||||||
|             var b = new AABB(new Vector2(0, 0), new Vector2(2, 2)); |  | ||||||
| 
 |  | ||||||
|             AABB.TestOverlap(a, b).Should().BeTrue(); |  | ||||||
| 
 |  | ||||||
|             var c = new AABB(-2, -2, 2, 1); |  | ||||||
|             var d = new AABB(-2, -2, 2, 2); |  | ||||||
| 
 |  | ||||||
|             AABB.TestOverlap(c, d).Should().BeTrue(); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         [Test] |  | ||||||
|         public void NotOverlapping() |  | ||||||
|         { |  | ||||||
|             var a = new AABB(new Vector2(-1, -1), new Vector2(1, 1)); |  | ||||||
|             var b = new AABB(new Vector2(-3, -3), new Vector2(-2, -2)); |  | ||||||
| 
 |  | ||||||
|             AABB.TestOverlap(a, b).Should().BeFalse(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -179,13 +179,13 @@ namespace Tests | ||||||
|             [Test] |             [Test] | ||||||
|             public void PolygonEqual() |             public void PolygonEqual() | ||||||
|             { |             { | ||||||
|                 var a = new Polygon(ImmutableArray.Create( |                 var a = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(0, 1), |                     new Position2D(0, 1), | ||||||
|                     new Position2D(1, 2), |                     new Position2D(1, 2), | ||||||
|                     new Position2D(-1, -1) |                     new Position2D(-1, -1) | ||||||
|                 )); |                 )); | ||||||
| 
 | 
 | ||||||
|                 var b = new Polygon(ImmutableArray.Create( |                 var b = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(0, 1), |                     new Position2D(0, 1), | ||||||
|                     new Position2D(1, 2), |                     new Position2D(1, 2), | ||||||
|                     new Position2D(-1, -1) |                     new Position2D(-1, -1) | ||||||
|  | @ -197,13 +197,13 @@ namespace Tests | ||||||
|             [Test] |             [Test] | ||||||
|             public void PolygonEqualOperator() |             public void PolygonEqualOperator() | ||||||
|             { |             { | ||||||
|                 var a = new Polygon(ImmutableArray.Create( |                 var a = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(0, 1), |                     new Position2D(0, 1), | ||||||
|                     new Position2D(1, 2), |                     new Position2D(1, 2), | ||||||
|                     new Position2D(-1, -1) |                     new Position2D(-1, -1) | ||||||
|                 )); |                 )); | ||||||
| 
 | 
 | ||||||
|                 var b = new Polygon(ImmutableArray.Create( |                 var b = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(0, 1), |                     new Position2D(0, 1), | ||||||
|                     new Position2D(1, 2), |                     new Position2D(1, 2), | ||||||
|                     new Position2D(-1, -1) |                     new Position2D(-1, -1) | ||||||
|  | @ -215,13 +215,13 @@ namespace Tests | ||||||
|             [Test] |             [Test] | ||||||
|             public void PolygonDifferentOrderEqual() |             public void PolygonDifferentOrderEqual() | ||||||
|             { |             { | ||||||
|                 var a = new Polygon(ImmutableArray.Create( |                 var a = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(0, 1), |                     new Position2D(0, 1), | ||||||
|                     new Position2D(1, 2), |                     new Position2D(1, 2), | ||||||
|                     new Position2D(-1, -1) |                     new Position2D(-1, -1) | ||||||
|                 )); |                 )); | ||||||
| 
 | 
 | ||||||
|                 var b = new Polygon(ImmutableArray.Create( |                 var b = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(1, 2), |                     new Position2D(1, 2), | ||||||
|                     new Position2D(-1, -1), |                     new Position2D(-1, -1), | ||||||
|                     new Position2D(0, 1) |                     new Position2D(0, 1) | ||||||
|  | @ -233,13 +233,13 @@ namespace Tests | ||||||
|             [Test] |             [Test] | ||||||
|             public void PolygonDifferentOrderEqualOperator() |             public void PolygonDifferentOrderEqualOperator() | ||||||
|             { |             { | ||||||
|                 var a = new Polygon(ImmutableArray.Create( |                 var a = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(0, 1), |                     new Position2D(0, 1), | ||||||
|                     new Position2D(1, 2), |                     new Position2D(1, 2), | ||||||
|                     new Position2D(-1, -1) |                     new Position2D(-1, -1) | ||||||
|                 )); |                 )); | ||||||
| 
 | 
 | ||||||
|                 var b = new Polygon(ImmutableArray.Create( |                 var b = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(1, 2), |                     new Position2D(1, 2), | ||||||
|                     new Position2D(-1, -1), |                     new Position2D(-1, -1), | ||||||
|                     new Position2D(0, 1) |                     new Position2D(0, 1) | ||||||
|  | @ -251,13 +251,13 @@ namespace Tests | ||||||
|             [Test] |             [Test] | ||||||
|             public void PolygonNotEqual() |             public void PolygonNotEqual() | ||||||
|             { |             { | ||||||
|                 var a = new Polygon(ImmutableArray.Create( |                 var a = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(0, 1), |                     new Position2D(0, 1), | ||||||
|                     new Position2D(1, 2), |                     new Position2D(1, 2), | ||||||
|                     new Position2D(-1, -1) |                     new Position2D(-1, -1) | ||||||
|                 )); |                 )); | ||||||
| 
 | 
 | ||||||
|                 var b = new Polygon(ImmutableArray.Create( |                 var b = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(1, 0), |                     new Position2D(1, 0), | ||||||
|                     new Position2D(2, 1), |                     new Position2D(2, 1), | ||||||
|                     new Position2D(-1, -1) |                     new Position2D(-1, -1) | ||||||
|  | @ -269,13 +269,13 @@ namespace Tests | ||||||
|             [Test] |             [Test] | ||||||
|             public void PolygonNotEqualOperator() |             public void PolygonNotEqualOperator() | ||||||
|             { |             { | ||||||
|                 var a = new Polygon(ImmutableArray.Create( |                 var a = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(0, 1), |                     new Position2D(0, 1), | ||||||
|                     new Position2D(1, 2), |                     new Position2D(1, 2), | ||||||
|                     new Position2D(-1, -1) |                     new Position2D(-1, -1) | ||||||
|                 )); |                 )); | ||||||
| 
 | 
 | ||||||
|                 var b = new Polygon(ImmutableArray.Create( |                 var b = new Polygon2D(ImmutableArray.Create( | ||||||
|                     new Position2D(1, 0), |                     new Position2D(1, 0), | ||||||
|                     new Position2D(2, 1), |                     new Position2D(2, 1), | ||||||
|                     new Position2D(-1, -1) |                     new Position2D(-1, -1) | ||||||
|  | @ -465,8 +465,8 @@ namespace Tests | ||||||
|             [Test] |             [Test] | ||||||
|             public void Equal() |             public void Equal() | ||||||
|             { |             { | ||||||
|                 var aabb = new AABB(0, 0, 3, 3); |                 var aabb = new AABB2D(0, 0, 3, 3); | ||||||
|                 var other = new AABB(0, 0, 3, 3); |                 var other = new AABB2D(0, 0, 3, 3); | ||||||
| 
 | 
 | ||||||
|                 (aabb == other).Should().BeTrue(); |                 (aabb == other).Should().BeTrue(); | ||||||
|             } |             } | ||||||
|  | @ -474,8 +474,8 @@ namespace Tests | ||||||
|             [Test] |             [Test] | ||||||
|             public void NotEqual() |             public void NotEqual() | ||||||
|             { |             { | ||||||
|                 var aabb = new AABB(0, 0, 3, 3); |                 var aabb = new AABB2D(0, 0, 3, 3); | ||||||
|                 var other = new AABB(0, 0, 6, 6); |                 var other = new AABB2D(0, 0, 6, 6); | ||||||
| 
 | 
 | ||||||
|                 (aabb != other).Should().BeTrue(); |                 (aabb != other).Should().BeTrue(); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  | @ -75,7 +75,7 @@ namespace Tests | ||||||
|         { |         { | ||||||
|             var point = new Point(); |             var point = new Point(); | ||||||
|             var pointTransform = new Transform2D(new Position2D(1, 1)); |             var pointTransform = new Transform2D(new Position2D(1, 1)); | ||||||
|             var polygon = new Polygon(ImmutableArray.Create( |             var polygon = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-2, -2), |                 new Position2D(-2, -2), | ||||||
|                 new Position2D(-3, 2), |                 new Position2D(-3, 2), | ||||||
|                 new Position2D(3, 2), |                 new Position2D(3, 2), | ||||||
|  | @ -90,7 +90,7 @@ namespace Tests | ||||||
|         { |         { | ||||||
|             var point = new Point(); |             var point = new Point(); | ||||||
|             var pointTransform = new Transform2D(new Position2D(5, 5)); |             var pointTransform = new Transform2D(new Position2D(5, 5)); | ||||||
|             var polygon = new Polygon(ImmutableArray.Create( |             var polygon = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-2, -2), |                 new Position2D(-2, -2), | ||||||
|                 new Position2D(-3, 2), |                 new Position2D(-3, 2), | ||||||
|                 new Position2D(3, 2), |                 new Position2D(3, 2), | ||||||
|  | @ -187,14 +187,14 @@ namespace Tests | ||||||
|         [Test] |         [Test] | ||||||
|         public void PolygonPolygonOverlapping() |         public void PolygonPolygonOverlapping() | ||||||
|         { |         { | ||||||
|             var shapeA = new Polygon(ImmutableArray.Create( |             var shapeA = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-1, 1), new Position2D(1, 1), |                 new Position2D(-1, 1), new Position2D(1, 1), | ||||||
|                 new Position2D(-1, -1), new Position2D(1, -1) |                 new Position2D(-1, -1), new Position2D(1, -1) | ||||||
|             )); |             )); | ||||||
| 
 | 
 | ||||||
|             var transformA = Transform2D.DefaultTransform; |             var transformA = Transform2D.DefaultTransform; | ||||||
| 
 | 
 | ||||||
|             var shapeB = new Polygon(ImmutableArray.Create( |             var shapeB = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-1, 1), new Position2D(1, 1), |                 new Position2D(-1, 1), new Position2D(1, 1), | ||||||
|                 new Position2D(-1, -1), new Position2D(1, -1) |                 new Position2D(-1, -1), new Position2D(1, -1) | ||||||
|             )); |             )); | ||||||
|  | @ -207,14 +207,14 @@ namespace Tests | ||||||
|         [Test] |         [Test] | ||||||
|         public void ScaledPolygonsOverlapping() |         public void ScaledPolygonsOverlapping() | ||||||
|         { |         { | ||||||
|             var shapeA = new Polygon(ImmutableArray.Create( |             var shapeA = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-1, 1), new Position2D(1, 1), |                 new Position2D(-1, 1), new Position2D(1, 1), | ||||||
|                 new Position2D(-1, -1), new Position2D(1, -1) |                 new Position2D(-1, -1), new Position2D(1, -1) | ||||||
|             )); |             )); | ||||||
| 
 | 
 | ||||||
|             var transformA = Transform2D.DefaultTransform; |             var transformA = Transform2D.DefaultTransform; | ||||||
| 
 | 
 | ||||||
|             var shapeB = new Polygon(ImmutableArray.Create( |             var shapeB = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-1, 1), new Position2D(1, 1), |                 new Position2D(-1, 1), new Position2D(1, 1), | ||||||
|                 new Position2D(-1, -1), new Position2D(1, -1) |                 new Position2D(-1, -1), new Position2D(1, -1) | ||||||
|             )); |             )); | ||||||
|  | @ -227,14 +227,14 @@ namespace Tests | ||||||
|         [Test] |         [Test] | ||||||
|         public void PolygonPolygonNotOverlapping() |         public void PolygonPolygonNotOverlapping() | ||||||
|         { |         { | ||||||
|             var shapeA = new Polygon(ImmutableArray.Create( |             var shapeA = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-1, 1), new Position2D(1, 1), |                 new Position2D(-1, 1), new Position2D(1, 1), | ||||||
|                 new Position2D(-1, -1), new Position2D(1, -1) |                 new Position2D(-1, -1), new Position2D(1, -1) | ||||||
|             )); |             )); | ||||||
| 
 | 
 | ||||||
|             var transformA = Transform2D.DefaultTransform; |             var transformA = Transform2D.DefaultTransform; | ||||||
| 
 | 
 | ||||||
|             var shapeB = new Polygon(ImmutableArray.Create( |             var shapeB = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-1, 1), new Position2D(1, 1), |                 new Position2D(-1, 1), new Position2D(1, 1), | ||||||
|                 new Position2D(-1, -1), new Position2D(1, -1) |                 new Position2D(-1, -1), new Position2D(1, -1) | ||||||
|             )); |             )); | ||||||
|  | @ -247,14 +247,14 @@ namespace Tests | ||||||
|         [Test] |         [Test] | ||||||
|         public void ScaledPolygonsNotOverlapping() |         public void ScaledPolygonsNotOverlapping() | ||||||
|         { |         { | ||||||
|             var shapeA = new Polygon(ImmutableArray.Create( |             var shapeA = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-1, 1), new Position2D(1, 1), |                 new Position2D(-1, 1), new Position2D(1, 1), | ||||||
|                 new Position2D(-1, -1), new Position2D(1, -1) |                 new Position2D(-1, -1), new Position2D(1, -1) | ||||||
|             )); |             )); | ||||||
| 
 | 
 | ||||||
|             var transformA = Transform2D.DefaultTransform; |             var transformA = Transform2D.DefaultTransform; | ||||||
| 
 | 
 | ||||||
|             var shapeB = new Polygon(ImmutableArray.Create( |             var shapeB = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-2, 2), new Position2D(2, 2), |                 new Position2D(-2, 2), new Position2D(2, 2), | ||||||
|                 new Position2D(-2, -2), new Position2D(2, -2) |                 new Position2D(-2, -2), new Position2D(2, -2) | ||||||
|             )); |             )); | ||||||
|  | @ -271,7 +271,7 @@ namespace Tests | ||||||
| 
 | 
 | ||||||
|             var transformA = Transform2D.DefaultTransform; |             var transformA = Transform2D.DefaultTransform; | ||||||
| 
 | 
 | ||||||
|             var polygon = new Polygon(ImmutableArray.Create( |             var polygon = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-1, -1), new Position2D(1, -1), |                 new Position2D(-1, -1), new Position2D(1, -1), | ||||||
|                 new Position2D(1, 1), new Position2D(-1, 1) |                 new Position2D(1, 1), new Position2D(-1, 1) | ||||||
|             )); |             )); | ||||||
|  | @ -288,7 +288,7 @@ namespace Tests | ||||||
| 
 | 
 | ||||||
|             var transformA = Transform2D.DefaultTransform; |             var transformA = Transform2D.DefaultTransform; | ||||||
| 
 | 
 | ||||||
|             var polygon = new Polygon(ImmutableArray.Create( |             var polygon = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-1, -1), new Position2D(1, -1), |                 new Position2D(-1, -1), new Position2D(1, -1), | ||||||
|                 new Position2D(1, 1), new Position2D(-1, 1) |                 new Position2D(1, 1), new Position2D(-1, 1) | ||||||
|             )); |             )); | ||||||
|  | @ -326,7 +326,7 @@ namespace Tests | ||||||
|             var circle = new Circle(1); |             var circle = new Circle(1); | ||||||
|             var transformA = new Transform2D(new Vector2(0.25f, 0)); |             var transformA = new Transform2D(new Vector2(0.25f, 0)); | ||||||
| 
 | 
 | ||||||
|             var square = new Polygon(ImmutableArray.Create( |             var square = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-1, -1), new Position2D(1, -1), |                 new Position2D(-1, -1), new Position2D(1, -1), | ||||||
|                 new Position2D(1, 1), new Position2D(-1, 1) |                 new Position2D(1, 1), new Position2D(-1, 1) | ||||||
|             )); |             )); | ||||||
|  | @ -342,7 +342,7 @@ namespace Tests | ||||||
|             var circle = new Circle(1); |             var circle = new Circle(1); | ||||||
|             var circleTransform = new Transform2D(new Vector2(5, 0)); |             var circleTransform = new Transform2D(new Vector2(5, 0)); | ||||||
| 
 | 
 | ||||||
|             var square = new Polygon(ImmutableArray.Create( |             var square = new Polygon2D(ImmutableArray.Create( | ||||||
|                 new Position2D(-1, -1), new Position2D(1, -1), |                 new Position2D(-1, -1), new Position2D(1, -1), | ||||||
|                 new Position2D(1, 1), new Position2D(-1, 1) |                 new Position2D(1, 1), new Position2D(-1, 1) | ||||||
|             )); |             )); | ||||||
|  | @ -426,7 +426,7 @@ namespace Tests | ||||||
|         [Test] |         [Test] | ||||||
|         public void MultiRectanglesOverlapping() |         public void MultiRectanglesOverlapping() | ||||||
|         { |         { | ||||||
|             var multiRectangleA = new MultiShape( |             var multiRectangleA = new MultiShape2D( | ||||||
|                 ImmutableArray.Create<(IShape2D, Transform2D)>( |                 ImmutableArray.Create<(IShape2D, Transform2D)>( | ||||||
|                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-5, 0))), |                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-5, 0))), | ||||||
|                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-5, 1))), |                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-5, 1))), | ||||||
|  | @ -435,7 +435,7 @@ namespace Tests | ||||||
|             ); |             ); | ||||||
|             var transformA = new Transform2D(new Position2D(5, 0)); |             var transformA = new Transform2D(new Position2D(5, 0)); | ||||||
| 
 | 
 | ||||||
|             var multiRectangleB = new MultiShape( |             var multiRectangleB = new MultiShape2D( | ||||||
|                 ImmutableArray.Create<(IShape2D, Transform2D)>( |                 ImmutableArray.Create<(IShape2D, Transform2D)>( | ||||||
|                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(4, -1))), |                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(4, -1))), | ||||||
|                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(4, 0))), |                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(4, 0))), | ||||||
|  | @ -450,7 +450,7 @@ namespace Tests | ||||||
|         [Test] |         [Test] | ||||||
|         public void MultiRectanglesNotOverlapping() |         public void MultiRectanglesNotOverlapping() | ||||||
|         { |         { | ||||||
|             var multiRectangleA = new MultiShape( |             var multiRectangleA = new MultiShape2D( | ||||||
|                 ImmutableArray.Create<(IShape2D, Transform2D)>( |                 ImmutableArray.Create<(IShape2D, Transform2D)>( | ||||||
|                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-5, 0))), |                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-5, 0))), | ||||||
|                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-5, 1))), |                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-5, 1))), | ||||||
|  | @ -459,7 +459,7 @@ namespace Tests | ||||||
|             ); |             ); | ||||||
|             var transformA = new Transform2D(new Position2D(5, 0)); |             var transformA = new Transform2D(new Position2D(5, 0)); | ||||||
| 
 | 
 | ||||||
|             var multiRectangleB = new MultiShape( |             var multiRectangleB = new MultiShape2D( | ||||||
|                 ImmutableArray.Create<(IShape2D, Transform2D)>( |                 ImmutableArray.Create<(IShape2D, Transform2D)>( | ||||||
|                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(4, -1))), |                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(4, -1))), | ||||||
|                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(4, 0))), |                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(4, 0))), | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ namespace Tests | ||||||
|         [Test] |         [Test] | ||||||
|         public void InsertAndRetrieve() |         public void InsertAndRetrieve() | ||||||
|         { |         { | ||||||
|             var spatialHash = new SpatialHash<int>(16); |             var spatialHash = new SpatialHash2D<int>(16); | ||||||
| 
 | 
 | ||||||
|             var rectA = new Rectangle(-2, -2, 4, 4); |             var rectA = new Rectangle(-2, -2, 4, 4); | ||||||
|             var rectATransform = new Transform2D(new Vector2(-8, -8)); |             var rectATransform = new Transform2D(new Vector2(-8, -8)); | ||||||
|  | @ -38,7 +38,7 @@ namespace Tests | ||||||
|             var point = new Point(); |             var point = new Point(); | ||||||
|             var pointTransform = new Transform2D(new Position2D(8, 8)); |             var pointTransform = new Transform2D(new Position2D(8, 8)); | ||||||
| 
 | 
 | ||||||
|             var multiRectangle = new MultiShape( |             var multiRectangle = new MultiShape2D( | ||||||
|                 ImmutableArray.Create<(IShape2D, Transform2D)>( |                 ImmutableArray.Create<(IShape2D, Transform2D)>( | ||||||
|                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-2, -2))), |                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-2, -2))), | ||||||
|                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-2, -1))), |                     (new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-2, -1))), | ||||||
|  | @ -76,7 +76,7 @@ namespace Tests | ||||||
|         [Test] |         [Test] | ||||||
|         public void InsertAndRetrieveSameValues() |         public void InsertAndRetrieveSameValues() | ||||||
|         { |         { | ||||||
|             var spatialHash = new SpatialHash<int>(16); |             var spatialHash = new SpatialHash2D<int>(16); | ||||||
| 
 | 
 | ||||||
|             var rectA = new Rectangle(-2, -2, 4, 4); |             var rectA = new Rectangle(-2, -2, 4, 4); | ||||||
|             var rectATransform = new Transform2D(new Vector2(-8, -8)); |             var rectATransform = new Transform2D(new Vector2(-8, -8)); | ||||||
|  | @ -97,7 +97,7 @@ namespace Tests | ||||||
|         [Test] |         [Test] | ||||||
|         public void Clear() |         public void Clear() | ||||||
|         { |         { | ||||||
|             var spatialHash = new SpatialHash<int>(16); |             var spatialHash = new SpatialHash2D<int>(16); | ||||||
| 
 | 
 | ||||||
|             var rectA = new Rectangle(-2, -2, 4, 4); |             var rectA = new Rectangle(-2, -2, 4, 4); | ||||||
|             var rectATransform = new Transform2D(new Vector2(-8, -8)); |             var rectATransform = new Transform2D(new Vector2(-8, -8)); | ||||||
|  |  | ||||||
|  | @ -23,7 +23,7 @@ namespace Tests | ||||||
|             var downRectangle = new Rectangle(-6, -2, 12, 4); |             var downRectangle = new Rectangle(-6, -2, 12, 4); | ||||||
|             var downTransform = new Transform2D(new Position2D(-6, 20)); |             var downTransform = new Transform2D(new Position2D(-6, 20)); | ||||||
| 
 | 
 | ||||||
|             var spatialHash = new SpatialHash<int>(16); |             var spatialHash = new SpatialHash2D<int>(16); | ||||||
|             spatialHash.Insert(1, otherRectangle, otherTransform); |             spatialHash.Insert(1, otherRectangle, otherTransform); | ||||||
|             spatialHash.Insert(2, farthestRectangle, farthestTransform); |             spatialHash.Insert(2, farthestRectangle, farthestTransform); | ||||||
|             spatialHash.Insert(3, downRectangle, downTransform); |             spatialHash.Insert(3, downRectangle, downTransform); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue