diff --git a/Engine.Physics2D/Primitives/Projection.cs b/Engine.Physics2D/Primitives/Projection.cs new file mode 100644 index 0000000..acbecc8 --- /dev/null +++ b/Engine.Physics2D/Primitives/Projection.cs @@ -0,0 +1,30 @@ +namespace Syntriax.Engine.Physics2D.Primitives; + +public record Projection(float Min, float Max) +{ + public static bool Overlaps(Projection left, Projection right) => Overlaps(left, right, out var _); + public static bool Overlaps(Projection left, Projection right, out float depth) + { + bool rightMinInLeft = right.Min > left.Min && right.Min < left.Max; + if (rightMinInLeft) + { + depth = left.Max - right.Min; + return true; + } + + bool rightMaxInLeft = right.Max < left.Max && right.Max > left.Min; + if (rightMaxInLeft) + { + depth = left.Min - right.Max; + return true; + } + + depth = default; + return false; + } +} +public static class ProjectionExtensions +{ + public static bool Overlaps(this Projection left, Projection right) => Projection.Overlaps(left, right); + public static bool Overlaps(this Projection left, Projection right, out float depth) => Projection.Overlaps(left, right, out depth); +}