optimized EPA2D
							parent
							
								
									a3eec5c01c
								
							
						
					
					
						commit
						1c95dd1591
					
				|  | @ -17,5 +17,6 @@ | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="MoonTools.Core.Structs" Version="1.0.1"/> |     <PackageReference Include="MoonTools.Core.Structs" Version="1.0.1"/> | ||||||
|     <PackageReference Include="morelinq" Version="3.2.0"/> |     <PackageReference Include="morelinq" Version="3.2.0"/> | ||||||
|  |     <PackageReference Include="Collections.Pooled" Version="1.0.82"/> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
| </Project> | </Project> | ||||||
|  | @ -4,11 +4,10 @@ | ||||||
|  * https://blog.hamaluik.ca/posts/building-a-collision-engine-part-2-2d-penetration-vectors/ |  * https://blog.hamaluik.ca/posts/building-a-collision-engine-part-2-2d-penetration-vectors/ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | using Collections.Pooled; | ||||||
| using Microsoft.Xna.Framework; | using Microsoft.Xna.Framework; | ||||||
| using MoonTools.Core.Bonk.Extensions; |  | ||||||
| using MoonTools.Core.Structs; | using MoonTools.Core.Structs; | ||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; |  | ||||||
| 
 | 
 | ||||||
| namespace MoonTools.Core.Bonk | namespace MoonTools.Core.Bonk | ||||||
| { | { | ||||||
|  | @ -18,15 +17,14 @@ namespace MoonTools.Core.Bonk | ||||||
|         CounterClockwise |         CounterClockwise | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // TODO: convert SimplexVertices to PooledList |  | ||||||
|     public static class EPA2D |     public static class EPA2D | ||||||
|     { |     { | ||||||
|         // vector returned gives direction from A to B |         // vector returned gives direction from A to B | ||||||
|         public static Vector2 Intersect(IShape2D shapeA, Transform2D Transform2DA, IShape2D shapeB, Transform2D Transform2DB, Simplex givenSimplex) |         public static Vector2 Intersect(IShape2D shapeA, Transform2D Transform2DA, IShape2D shapeB, Transform2D Transform2DB, Simplex simplex) | ||||||
|         { |         { | ||||||
|             var simplexVertices = new SimplexVertices(new Vector2?[36]); |             var simplexVertices = new PooledList<Vector2>(36, ClearMode.Always); | ||||||
| 
 | 
 | ||||||
|             foreach (var vertex in givenSimplex.Vertices) |             foreach (var vertex in simplex.Vertices) | ||||||
|             { |             { | ||||||
|                 simplexVertices.Add(vertex); |                 simplexVertices.Add(vertex); | ||||||
|             } |             } | ||||||
|  | @ -57,10 +55,12 @@ namespace MoonTools.Core.Bonk | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             simplexVertices.Dispose(); | ||||||
|  | 
 | ||||||
|             return intersection; |             return intersection; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private static Edge FindClosestEdge(PolygonWinding winding, SimplexVertices simplexVertices) |         private static Edge FindClosestEdge(PolygonWinding winding, PooledList<Vector2> simplexVertices) | ||||||
|         { |         { | ||||||
|             var closestDistance = float.PositiveInfinity; |             var closestDistance = float.PositiveInfinity; | ||||||
|             var closestNormal = Vector2.Zero; |             var closestNormal = Vector2.Zero; | ||||||
|  |  | ||||||
|  | @ -1,91 +0,0 @@ | ||||||
| using System; |  | ||||||
| using System.Collections; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using Microsoft.Xna.Framework; |  | ||||||
| 
 |  | ||||||
| namespace MoonTools.Core.Bonk |  | ||||||
| { |  | ||||||
|     public struct SimplexVertices : IEnumerable<Vector2> |  | ||||||
|     { |  | ||||||
|         public Vector2?[] vertices; |  | ||||||
| 
 |  | ||||||
|         /// <summary> |  | ||||||
|         /// Make sure to pass in all nulls |  | ||||||
|         /// </summary> |  | ||||||
|         public SimplexVertices(Vector2?[] vertices) |  | ||||||
|         { |  | ||||||
|             this.vertices = vertices; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public Vector2 this[int key] |  | ||||||
|         { |  | ||||||
|             get |  | ||||||
|             { |  | ||||||
|                 if (!vertices[key].HasValue) { throw new IndexOutOfRangeException(); } |  | ||||||
|                 return vertices[key].Value; |  | ||||||
|             } |  | ||||||
|             set |  | ||||||
|             { |  | ||||||
|                 vertices[key] = value; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public int Count { |  | ||||||
|             get |  | ||||||
|             { |  | ||||||
|                 for (int i = 0; i < vertices.Length; i++) |  | ||||||
|                 { |  | ||||||
|                     if (!vertices[i].HasValue) { return i; } |  | ||||||
|                 } |  | ||||||
|                 return vertices.Length; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public void Add(Vector2 vertex) |  | ||||||
|         { |  | ||||||
|             if (Count > vertices.Length - 1) { throw new IndexOutOfRangeException(); } |  | ||||||
| 
 |  | ||||||
|             vertices[Count] = vertex; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public void Insert(int index, Vector2 vertex) |  | ||||||
|         { |  | ||||||
|             if (Count >= vertices.Length || index > vertices.Length - 1) { throw new IndexOutOfRangeException(); } |  | ||||||
| 
 |  | ||||||
|             var currentCount = Count; |  | ||||||
| 
 |  | ||||||
|             for (int i = currentCount - 1; i >= index; i--) |  | ||||||
|             { |  | ||||||
|                 vertices[i + 1] = vertices[i]; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             vertices[index] = vertex; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public IEnumerator<Vector2> GetEnumerator() |  | ||||||
|         { |  | ||||||
|             foreach (Vector2? vec in vertices) |  | ||||||
|             { |  | ||||||
|                 if (!vec.HasValue) { yield break; } |  | ||||||
|                 yield return vec.Value; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public void RemoveAt(int index) |  | ||||||
|         { |  | ||||||
|             if (index > vertices.Length - 1 || index > Count) { throw new ArgumentOutOfRangeException(); } |  | ||||||
| 
 |  | ||||||
|             for (int i = vertices.Length - 2; i >= index; i--) |  | ||||||
|             { |  | ||||||
|                 vertices[i] = vertices[i + 1]; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             vertices[vertices.Length - 1] = null; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         IEnumerator IEnumerable.GetEnumerator() |  | ||||||
|         { |  | ||||||
|             return GetEnumerator(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue