forked from MoonsideGames/MoonTools.Bonk
				
			update Transform2D and switch matrix4x4 to matrix3x2
							parent
							
								
									d553c2e213
								
							
						
					
					
						commit
						bf7a97af20
					
				
							
								
								
									
										11
									
								
								Bonk/AABB.cs
								
								
								
								
							
							
						
						
									
										11
									
								
								Bonk/AABB.cs
								
								
								
								
							| 
						 | 
					@ -49,14 +49,13 @@ namespace MoonTools.Core.Bonk
 | 
				
			||||||
            Max = max;
 | 
					            Max = max;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private static Matrix4x4 AbsoluteMatrix(Matrix4x4 matrix)
 | 
					        private static Matrix3x2 AbsoluteMatrix(Matrix3x2 matrix)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new Matrix4x4
 | 
					            return new Matrix3x2
 | 
				
			||||||
            (
 | 
					            (
 | 
				
			||||||
                Math.Abs(matrix.M11), Math.Abs(matrix.M12), Math.Abs(matrix.M13), Math.Abs(matrix.M14),
 | 
					                Math.Abs(matrix.M11), Math.Abs(matrix.M12),
 | 
				
			||||||
                Math.Abs(matrix.M21), Math.Abs(matrix.M22), Math.Abs(matrix.M23), Math.Abs(matrix.M24),
 | 
					                Math.Abs(matrix.M21), Math.Abs(matrix.M22),
 | 
				
			||||||
                Math.Abs(matrix.M31), Math.Abs(matrix.M32), Math.Abs(matrix.M33), Math.Abs(matrix.M34),
 | 
					                Math.Abs(matrix.M31), Math.Abs(matrix.M32)
 | 
				
			||||||
                Math.Abs(matrix.M41), Math.Abs(matrix.M42), Math.Abs(matrix.M43), Math.Abs(matrix.M44)
 | 
					 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,8 +20,8 @@
 | 
				
			||||||
      <PrivateAssets>all</PrivateAssets>
 | 
					      <PrivateAssets>all</PrivateAssets>
 | 
				
			||||||
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 | 
					      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 | 
				
			||||||
    </PackageReference>
 | 
					    </PackageReference>
 | 
				
			||||||
    <PackageReference Include="MoonTools.Core.Structs" Version="2.1.0" />
 | 
					    <PackageReference Include="MoonTools.Core.Structs" Version="3.0.0" />
 | 
				
			||||||
    <PackageReference Include="System.Collections.Immutable" Version="1.6.0" />
 | 
					    <PackageReference Include="System.Collections.Immutable" Version="1.7.0" />
 | 
				
			||||||
    <PackageReference Include="System.Numerics.Vectors" Version="4.5.0" />
 | 
					    <PackageReference Include="System.Numerics.Vectors" Version="4.5.0" />
 | 
				
			||||||
    <PackageReference Include="Microsoft.Bcl.HashCode" Version="1.1.0" />
 | 
					    <PackageReference Include="Microsoft.Bcl.HashCode" Version="1.1.0" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,13 +59,13 @@ namespace MoonTools.Core.Bonk
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public IEnumerable<(T, IShape2D, Transform2D)> Retrieve(T id, IShape2D shape, Transform2D transform2D)
 | 
					        public IEnumerable<(T, IShape2D, Transform2D)> Retrieve(T id, IShape2D shape, Transform2D transform2D)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            AABB box = shape.TransformedAABB(transform2D);
 | 
					            var box = shape.TransformedAABB(transform2D);
 | 
				
			||||||
            var minHash = Hash(box.Min);
 | 
					            var minHash = Hash(box.Min);
 | 
				
			||||||
            var maxHash = Hash(box.Max);
 | 
					            var maxHash = Hash(box.Max);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (int i = minHash.Item1; i <= maxHash.Item1; i++)
 | 
					            for (var i = minHash.Item1; i <= maxHash.Item1; i++)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                for (int j = minHash.Item2; j <= maxHash.Item2; j++)
 | 
					                for (var j = minHash.Item2; j <= maxHash.Item2; j++)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    var key = MakeLong(i, j);
 | 
					                    var key = MakeLong(i, j);
 | 
				
			||||||
                    if (hashDictionary.ContainsKey(key))
 | 
					                    if (hashDictionary.ContainsKey(key))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,47 +1,50 @@
 | 
				
			||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Numerics;
 | 
					using System.Numerics;
 | 
				
			||||||
using MoonTools.Core.Structs;
 | 
					using MoonTools.Core.Structs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal unsafe struct SimplexVertexBuffer
 | 
					namespace MoonTools.Core.Bonk
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    private const int Size = 35;
 | 
					    internal unsafe struct SimplexVertexBuffer
 | 
				
			||||||
 | 
					 | 
				
			||||||
    public int Length { get; private set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public SimplexVertexBuffer(IEnumerable<Position2D> positions)
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        var i = 0;
 | 
					        private const int Size = 35;
 | 
				
			||||||
        foreach (var position in positions)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if (i == Size) { break; }
 | 
					 | 
				
			||||||
            var vertex = position.ToVector2();
 | 
					 | 
				
			||||||
            _simplexXBuffer[i] = vertex.X;
 | 
					 | 
				
			||||||
            _simplexYBuffer[i] = vertex.Y;
 | 
					 | 
				
			||||||
            i++;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        Length = i;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public Vector2 this[int key]
 | 
					        public int Length { get; private set; }
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        get => new Vector2(_simplexXBuffer[key], _simplexYBuffer[key]);
 | 
					 | 
				
			||||||
        private set
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            _simplexXBuffer[key] = value.X;
 | 
					 | 
				
			||||||
            _simplexYBuffer[key] = value.Y;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void Insert(int index, Vector2 value)
 | 
					        public SimplexVertexBuffer(IEnumerable<Position2D> positions)
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        for (var i = Length; i > index; i--)
 | 
					 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            this[i] = this[i - 1];
 | 
					            var i = 0;
 | 
				
			||||||
 | 
					            foreach (var position in positions)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (i == Size) { break; }
 | 
				
			||||||
 | 
					                var vertex = position.ToVector2();
 | 
				
			||||||
 | 
					                _simplexXBuffer[i] = vertex.X;
 | 
				
			||||||
 | 
					                _simplexYBuffer[i] = vertex.Y;
 | 
				
			||||||
 | 
					                i++;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Length = i;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        this[index] = value;
 | 
					 | 
				
			||||||
        Length++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private fixed float _simplexXBuffer[Size];
 | 
					        public Vector2 this[int key]
 | 
				
			||||||
    private fixed float _simplexYBuffer[Size];
 | 
					        {
 | 
				
			||||||
 | 
					            get => new Vector2(_simplexXBuffer[key], _simplexYBuffer[key]);
 | 
				
			||||||
 | 
					            private set
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _simplexXBuffer[key] = value.X;
 | 
				
			||||||
 | 
					                _simplexYBuffer[key] = value.Y;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void Insert(int index, Vector2 value)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            for (var i = Length; i > index; i--)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                this[i] = this[i - 1];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            this[index] = value;
 | 
				
			||||||
 | 
					            Length++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private fixed float _simplexXBuffer[Size];
 | 
				
			||||||
 | 
					        private fixed float _simplexYBuffer[Size];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,8 +79,8 @@ namespace MoonTools.Core.Bonk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public Vector2 Support(Vector2 direction, Transform2D transform)
 | 
					        public Vector2 Support(Vector2 direction, Transform2D transform)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Matrix4x4 inverseTransform;
 | 
					            Matrix3x2 inverseTransform;
 | 
				
			||||||
            Matrix4x4.Invert(transform.TransformMatrix, out inverseTransform);
 | 
					            Matrix3x2.Invert(transform.TransformMatrix, out inverseTransform);
 | 
				
			||||||
            var inverseDirection = Vector2.TransformNormal(direction, inverseTransform);
 | 
					            var inverseDirection = Vector2.TransformNormal(direction, inverseTransform);
 | 
				
			||||||
            return Vector2.Transform(Support(inverseDirection), transform.TransformMatrix);
 | 
					            return Vector2.Transform(Support(inverseDirection), transform.TransformMatrix);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,12 +4,12 @@
 | 
				
			||||||
    <IsPackable>false</IsPackable>
 | 
					    <IsPackable>false</IsPackable>
 | 
				
			||||||
  </PropertyGroup>
 | 
					  </PropertyGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <PackageReference Include="nunit" Version="3.11.0"/>
 | 
					    <PackageReference Include="nunit" Version="3.12.0" />
 | 
				
			||||||
    <PackageReference Include="NUnit3TestAdapter" Version="3.12.0"/>
 | 
					    <PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
 | 
				
			||||||
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0"/>
 | 
					    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
 | 
				
			||||||
    <PackageReference Include="FluentAssertions" Version="5.9.0"/>
 | 
					    <PackageReference Include="FluentAssertions" Version="5.9.0" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ProjectReference Include="..\Bonk\Bonk.csproj"/>
 | 
					    <ProjectReference Include="..\Bonk\Bonk.csproj" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
</Project>
 | 
					</Project>
 | 
				
			||||||
		Loading…
	
		Reference in New Issue