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