forked from MoonsideGames/MoonTools.Bonk
change how multishape shapes are transformed and add point sweep test
parent
17084154a2
commit
7875342da8
|
@ -1,5 +1,6 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using System.Numerics;
|
||||
using MoonTools.Core.Structs;
|
||||
|
||||
namespace MoonTools.Core.Bonk
|
||||
|
@ -22,11 +23,17 @@ namespace MoonTools.Core.Bonk
|
|||
return AABB.Transformed(AABB, transform);
|
||||
}
|
||||
|
||||
public IEnumerable<(IShape2D, Transform2D)> TransformedShapeTransforms(Transform2D transform)
|
||||
/// <summary>
|
||||
/// Moves the shapes by pivoting with an offset transform.
|
||||
/// </summary>
|
||||
/// <param name="offsetTransform"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<(IShape2D, Transform2D)> TransformShapesUsingOffset(Transform2D offsetTransform)
|
||||
{
|
||||
foreach (var (shape, shapeTransform) in ShapeTransformPairs)
|
||||
{
|
||||
yield return (shape, transform.Compose(shapeTransform));
|
||||
var newTransform = new Transform2D(Vector2.Transform(shapeTransform.Position, offsetTransform.TransformMatrix), offsetTransform.Rotation, offsetTransform.Scale);
|
||||
yield return (shape, newTransform);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ namespace MoonTools.Core.Bonk
|
|||
/// <returns></returns>
|
||||
public static bool TestCollision(MultiShape multiShape, Transform2D multiShapeTransform, IShape2D shape, Transform2D shapeTransform)
|
||||
{
|
||||
foreach (var (otherShape, otherTransform) in multiShape.TransformedShapeTransforms(multiShapeTransform))
|
||||
foreach (var (otherShape, otherTransform) in multiShape.TransformShapesUsingOffset(multiShapeTransform))
|
||||
{
|
||||
if (TestCollision(shape, shapeTransform, otherShape, otherTransform)) { return true; }
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ namespace MoonTools.Core.Bonk
|
|||
/// <returns></returns>
|
||||
public static bool TestCollision(IShape2D shape, Transform2D shapeTransform, MultiShape multiShape, Transform2D multiShapeTransform)
|
||||
{
|
||||
foreach (var (otherShape, otherTransform) in multiShape.TransformedShapeTransforms(multiShapeTransform))
|
||||
foreach (var (otherShape, otherTransform) in multiShape.TransformShapesUsingOffset(multiShapeTransform))
|
||||
{
|
||||
if (TestCollision(shape, shapeTransform, otherShape, otherTransform)) { return true; }
|
||||
}
|
||||
|
@ -106,9 +106,9 @@ namespace MoonTools.Core.Bonk
|
|||
/// <returns></returns>
|
||||
public static bool TestCollision(MultiShape multiShapeA, Transform2D transformA, MultiShape multiShapeB, Transform2D transformB)
|
||||
{
|
||||
foreach (var (shapeA, shapeTransformA) in multiShapeA.TransformedShapeTransforms(transformA))
|
||||
foreach (var (shapeA, shapeTransformA) in multiShapeA.TransformShapesUsingOffset(transformA))
|
||||
{
|
||||
foreach (var (shapeB, shapeTransformB) in multiShapeB.TransformedShapeTransforms(transformB))
|
||||
foreach (var (shapeB, shapeTransformB) in multiShapeB.TransformShapesUsingOffset(transformB))
|
||||
{
|
||||
if (TestCollision(shapeA, shapeTransformA, shapeB, shapeTransformB)) { return true; }
|
||||
}
|
||||
|
|
|
@ -1,26 +1,21 @@
|
|||
using System;
|
||||
using System.Numerics;
|
||||
using MoonTools.Core.Structs;
|
||||
|
||||
namespace MoonTools.Core.Bonk
|
||||
{
|
||||
public struct SweepResult<T, U> where T : IEquatable<T> where U : struct, IShape2D
|
||||
public struct SweepResult<T> where T : IEquatable<T>
|
||||
{
|
||||
public static SweepResult<T, U> False = new SweepResult<T, U>();
|
||||
public static SweepResult<T> False = new SweepResult<T>();
|
||||
|
||||
public bool Hit { get; }
|
||||
public Vector2 Motion { get; }
|
||||
public T ID { get; }
|
||||
public U Shape { get; }
|
||||
public Transform2D Transform { get; }
|
||||
|
||||
public SweepResult(bool hit, Vector2 motion, T id, U shape, Transform2D transform)
|
||||
public SweepResult(bool hit, Vector2 motion, T id)
|
||||
{
|
||||
Hit = hit;
|
||||
Motion = motion;
|
||||
ID = id;
|
||||
Shape = shape;
|
||||
Transform = transform;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ namespace MoonTools.Core.Bonk
|
|||
public static class SweepTest
|
||||
{
|
||||
/// <summary>
|
||||
/// Performs a sweep test on rectangles. Returns the position 1 pixel before overlap occurs.
|
||||
/// Performs a sweep test on and against rectangles. Returns the position 1 pixel before overlap occurs.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="spatialHash">A spatial hash.</param>
|
||||
|
@ -15,7 +15,7 @@ namespace MoonTools.Core.Bonk
|
|||
/// <param name="transform">A transform by which to transform the IHasAABB2D.</param>
|
||||
/// <param name="ray">Given in world-space.</param>
|
||||
/// <returns></returns>
|
||||
public static SweepResult<T, Rectangle> Rectangle<T>(SpatialHash<T> spatialHash, Rectangle rectangle, Transform2D transform, Vector2 ray) where T : IEquatable<T>
|
||||
public static SweepResult<T> Test<T>(SpatialHash<T> spatialHash, Rectangle rectangle, Transform2D transform, Vector2 ray) where T : IEquatable<T>
|
||||
{
|
||||
var transformedAABB = rectangle.TransformedAABB(transform);
|
||||
var sweepBox = SweepBox(transformedAABB, ray);
|
||||
|
@ -108,14 +108,19 @@ namespace MoonTools.Core.Bonk
|
|||
var overlapPosition = ray * shortestDistance;
|
||||
var correctionX = -Math.Sign(ray.X);
|
||||
var correctionY = -Math.Sign(ray.Y);
|
||||
return new SweepResult<T, Rectangle>(true, new Position2D((int)overlapPosition.X + correctionX, (int)overlapPosition.Y + correctionY), nearestID, nearestRectangle.Value, nearestTransform.Value);
|
||||
return new SweepResult<T>(true, new Position2D((int)overlapPosition.X + correctionX, (int)overlapPosition.Y + correctionY), nearestID);
|
||||
}
|
||||
else
|
||||
{
|
||||
return SweepResult<T, Rectangle>.False;
|
||||
return SweepResult<T>.False;
|
||||
}
|
||||
}
|
||||
|
||||
public static SweepResult<T> Test<T>(SpatialHash<T> spatialHash, Point point, Transform2D transform, Vector2 ray) where T : IEquatable<T>
|
||||
{
|
||||
return Test(spatialHash, new Rectangle(0, 0), transform, ray);
|
||||
}
|
||||
|
||||
private static AABB SweepBox(AABB aabb, Vector2 ray)
|
||||
{
|
||||
return new AABB(
|
||||
|
|
Loading…
Reference in New Issue