279 lines
8.4 KiB
C#
Executable File
279 lines
8.4 KiB
C#
Executable File
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
using Microsoft.Xna.Framework;
|
|
using System.Globalization;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Krypton.Common
|
|
{
|
|
/// <summary>
|
|
/// Much like Rectangle, but stored as two Vector2s
|
|
/// </summary>
|
|
public struct BoundingRect
|
|
{
|
|
public Vector2 Min;
|
|
public Vector2 Max;
|
|
|
|
public float Left { get { return this.Min.X; } }
|
|
public float Right { get { return this.Max.X; } }
|
|
public float Top { get { return this.Max.Y; } }
|
|
public float Bottom { get { return this.Min.Y; } }
|
|
|
|
public float Width { get { return this.Max.X - this.Min.X; } }
|
|
public float Height { get { return this.Max.Y - this.Min.Y; } }
|
|
|
|
private static BoundingRect mEmpty;
|
|
private static BoundingRect mMinMax;
|
|
|
|
static BoundingRect()
|
|
{
|
|
BoundingRect.mEmpty = new BoundingRect();
|
|
BoundingRect.mMinMax = new BoundingRect(Vector2.One * float.MinValue, Vector2.One * float.MaxValue);
|
|
}
|
|
|
|
public Vector2 Center
|
|
{
|
|
get { return (this.Min + this.Max) / 2; }
|
|
}
|
|
|
|
public static BoundingRect Empty
|
|
{
|
|
get { return BoundingRect.mEmpty; }
|
|
}
|
|
|
|
|
|
public static BoundingRect MinMax
|
|
{
|
|
get { return BoundingRect.mMinMax; }
|
|
}
|
|
|
|
public bool IsZero
|
|
{
|
|
get
|
|
{
|
|
return
|
|
(this.Min.X == 0) &&
|
|
(this.Min.Y == 0) &&
|
|
(this.Max.X == 0) &&
|
|
(this.Max.Y == 0);
|
|
}
|
|
}
|
|
|
|
public BoundingRect(float x, float y, float width, float height)
|
|
{
|
|
this.Min.X = x;
|
|
this.Min.Y = y;
|
|
this.Max.X = x + width;
|
|
this.Max.Y = y + height;
|
|
}
|
|
|
|
public BoundingRect(Vector2 min, Vector2 max)
|
|
{
|
|
this.Min = min;
|
|
this.Max = max;
|
|
}
|
|
|
|
public bool Contains(float x, float y)
|
|
{
|
|
return
|
|
(this.Min.X <= x) &&
|
|
(this.Min.Y <= y) &&
|
|
(this.Max.X >= x) &&
|
|
(this.Max.Y >= y);
|
|
}
|
|
|
|
public bool Contains(Vector2 vector)
|
|
{
|
|
return
|
|
(this.Min.X <= vector.X) &&
|
|
(this.Min.Y <= vector.Y) &&
|
|
(this.Max.X >= vector.X) &&
|
|
(this.Max.Y >= vector.Y);
|
|
}
|
|
|
|
public void Contains(ref Vector2 rect, out bool result)
|
|
{
|
|
result =
|
|
(this.Min.X <= rect.X) &&
|
|
(this.Min.Y <= rect.Y) &&
|
|
(this.Max.X >= rect.X) &&
|
|
(this.Max.Y >= rect.Y);
|
|
}
|
|
|
|
public bool Contains(BoundingRect rect)
|
|
{
|
|
return
|
|
(this.Min.X <= rect.Min.X) &&
|
|
(this.Min.Y <= rect.Min.Y) &&
|
|
(this.Max.X >= rect.Max.X) &&
|
|
(this.Max.Y >= rect.Max.Y);
|
|
}
|
|
|
|
public void Contains(ref BoundingRect rect, out bool result)
|
|
{
|
|
result =
|
|
(this.Min.X <= rect.Min.X) &&
|
|
(this.Min.Y <= rect.Min.Y) &&
|
|
(this.Max.X >= rect.Max.X) &&
|
|
(this.Max.Y >= rect.Max.Y) ;
|
|
}
|
|
|
|
public bool Intersects(BoundingRect rect)
|
|
{
|
|
return
|
|
(this.Min.X < rect.Max.X) &&
|
|
(this.Min.Y < rect.Max.Y) &&
|
|
(this.Max.X > rect.Min.X) &&
|
|
(this.Max.Y > rect.Min.Y);
|
|
}
|
|
|
|
public void Intersects(ref BoundingRect rect, out bool result)
|
|
{
|
|
result =
|
|
(this.Min.X < rect.Max.X) &&
|
|
(this.Min.Y < rect.Max.Y) &&
|
|
(this.Max.X > rect.Min.X) &&
|
|
(this.Max.Y > rect.Min.Y);
|
|
}
|
|
|
|
public static BoundingRect Intersect(BoundingRect rect1, BoundingRect rect2)
|
|
{
|
|
BoundingRect result;
|
|
|
|
float num8 = rect1.Max.X;
|
|
float num7 = rect2.Max.X;
|
|
float num6 = rect1.Max.Y;
|
|
float num5 = rect2.Max.Y;
|
|
float num2 = (rect1.Min.X > rect2.Min.X) ? rect1.Min.X : rect2.Min.X;
|
|
float num = (rect1.Min.Y > rect2.Min.Y) ? rect1.Min.Y : rect2.Min.Y;
|
|
float num4 = (num8 < num7) ? num8 : num7;
|
|
float num3 = (num6 < num5) ? num6 : num5;
|
|
|
|
if ((num4 > num2) && (num3 > num))
|
|
{
|
|
result.Min.X = num2;
|
|
result.Min.Y = num;
|
|
result.Max.X = num4;
|
|
result.Max.Y = num3;
|
|
|
|
return result;
|
|
}
|
|
|
|
result.Min.X = 0;
|
|
result.Min.Y = 0;
|
|
result.Max.X = 0;
|
|
result.Max.Y = 0;
|
|
|
|
return result;
|
|
}
|
|
|
|
public static void Intersect(ref BoundingRect rect1, ref BoundingRect rect2, out BoundingRect result)
|
|
{
|
|
float num8 = rect1.Max.X;
|
|
float num7 = rect2.Max.X;
|
|
float num6 = rect1.Max.Y;
|
|
float num5 = rect2.Max.Y;
|
|
float num2 = (rect1.Min.X > rect2.Min.X) ? rect1.Min.X : rect2.Min.X;
|
|
float num = (rect1.Min.Y > rect2.Min.Y) ? rect1.Min.Y : rect2.Min.Y;
|
|
float num4 = (num8 < num7) ? num8 : num7;
|
|
float num3 = (num6 < num5) ? num6 : num5;
|
|
|
|
if ((num4 > num2) && (num3 > num))
|
|
{
|
|
result.Min.X = num2;
|
|
result.Min.Y = num;
|
|
result.Max.X = num4;
|
|
result.Max.Y = num3;
|
|
}
|
|
|
|
result.Min.X = 0;
|
|
result.Min.Y = 0;
|
|
result.Max.X = 0;
|
|
result.Max.Y = 0;
|
|
}
|
|
|
|
public static BoundingRect Union(BoundingRect rect1, BoundingRect rect2)
|
|
{
|
|
BoundingRect result;
|
|
|
|
float num6 = rect1.Max.X;
|
|
float num5 = rect2.Max.X;
|
|
float num4 = rect1.Max.Y;
|
|
float num3 = rect2.Max.Y;
|
|
float num2 = (rect1.Min.X < rect2.Min.X) ? rect1.Min.X : rect2.Min.X;
|
|
float num = (rect1.Min.Y < rect2.Min.Y) ? rect1.Min.Y : rect2.Min.Y;
|
|
float num8 = (num6 > num5) ? num6 : num5;
|
|
float num7 = (num4 > num3) ? num4 : num3;
|
|
|
|
result.Min.X = num2;
|
|
result.Min.Y = num;
|
|
result.Max.X = num8;
|
|
result.Max.Y = num7;
|
|
|
|
return result;
|
|
}
|
|
|
|
public static void Union(ref BoundingRect rect1, ref BoundingRect rect2, out BoundingRect result)
|
|
{
|
|
float num6 = rect1.Max.X;
|
|
float num5 = rect2.Max.X;
|
|
float num4 = rect1.Max.Y;
|
|
float num3 = rect2.Max.Y;
|
|
float num2 = (rect1.Min.X < rect2.Min.X) ? rect1.Min.X : rect2.Min.X;
|
|
float num = (rect1.Min.Y < rect2.Min.Y) ? rect1.Min.Y : rect2.Min.Y;
|
|
float num8 = (num6 > num5) ? num6 : num5;
|
|
float num7 = (num4 > num3) ? num4 : num3;
|
|
|
|
result.Min.X = num2;
|
|
result.Min.Y = num;
|
|
result.Max.X = num8;
|
|
result.Max.Y = num7;
|
|
}
|
|
|
|
public bool Equals(BoundingRect other)
|
|
{
|
|
return
|
|
(this.Min.X == other.Min.X) &&
|
|
(this.Min.Y == other.Min.Y) &&
|
|
(this.Max.X == other.Max.X) &&
|
|
(this.Max.Y == other.Max.Y);
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return this.Min.GetHashCode() + this.Max.GetHashCode();
|
|
}
|
|
|
|
public static bool operator ==(BoundingRect a, BoundingRect b)
|
|
{
|
|
return
|
|
(a.Min.X == b.Min.X) &&
|
|
(a.Min.Y == b.Min.Y) &&
|
|
(a.Max.X == b.Max.X) &&
|
|
(a.Max.Y == b.Max.Y);
|
|
}
|
|
|
|
public static bool operator !=(BoundingRect a, BoundingRect b)
|
|
{
|
|
return
|
|
(a.Min.X != b.Min.X) ||
|
|
(a.Min.Y != b.Min.Y) ||
|
|
(a.Max.X != b.Max.X) ||
|
|
(a.Max.Y != b.Max.Y);
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (obj is BoundingRect)
|
|
{
|
|
return this == (BoundingRect)obj;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|