| 1 | using System; | 
 
 
 
 
 | 2 |  | 
 
 
 
 
 | 3 | namespace Oni | 
 
 
 
 
 | 4 | { | 
 
 
 
 
 | 5 | internal struct Vector2 : IEquatable<Vector2> | 
 
 
 
 
 | 6 | { | 
 
 
 
 
 | 7 | public float X; | 
 
 
 
 
 | 8 | public float Y; | 
 
 
 
 
 | 9 |  | 
 
 
 
 
 | 10 | public Vector2(float x, float y) | 
 
 
 
 
 | 11 | { | 
 
 
 
 
 | 12 | X = x; | 
 
 
 
 
 | 13 | Y = y; | 
 
 
 
 
 | 14 | } | 
 
 
 
 
 | 15 |  | 
 
 
 
 
 | 16 | public Vector2(float all) | 
 
 
 
 
 | 17 | { | 
 
 
 
 
 | 18 | X = all; | 
 
 
 
 
 | 19 | Y = all; | 
 
 
 
 
 | 20 | } | 
 
 
 
 
 | 21 |  | 
 
 
 
 
 | 22 | public static Vector2 operator +(Vector2 v1, Vector2 v2) => new Vector2 | 
 
 
 
 
 | 23 | { | 
 
 
 
 
 | 24 | X = v1.X + v2.X, | 
 
 
 
 
 | 25 | Y = v1.Y + v2.Y | 
 
 
 
 
 | 26 | }; | 
 
 
 
 
 | 27 |  | 
 
 
 
 
 | 28 | public static Vector2 operator -(Vector2 v1, Vector2 v2) => new Vector2 | 
 
 
 
 
 | 29 | { | 
 
 
 
 
 | 30 | X = v1.X - v2.X, | 
 
 
 
 
 | 31 | Y = v1.Y - v2.Y | 
 
 
 
 
 | 32 | }; | 
 
 
 
 
 | 33 |  | 
 
 
 
 
 | 34 | public static float Dot(Vector2 v1, Vector2 v2) => v1.X * v2.X + v1.Y * v2.Y; | 
 
 
 
 
 | 35 |  | 
 
 
 
 
 | 36 | public static Vector2 Normalize(Vector2 v) => v * (1.0f / v.Length()); | 
 
 
 
 
 | 37 |  | 
 
 
 
 
 | 38 | public void Normalize() | 
 
 
 
 
 | 39 | { | 
 
 
 
 
 | 40 | float f = 1.0f / Length(); | 
 
 
 
 
 | 41 |  | 
 
 
 
 
 | 42 | X *= f; | 
 
 
 
 
 | 43 | Y *= f; | 
 
 
 
 
 | 44 | } | 
 
 
 
 
 | 45 |  | 
 
 
 
 
 | 46 | public float Length() => FMath.Sqrt(X * X + Y * Y); | 
 
 
 
 
 | 47 |  | 
 
 
 
 
 | 48 | public static Vector2 operator *(Vector2 v, float s) | 
 
 
 
 
 | 49 | { | 
 
 
 
 
 | 50 | v.X *= s; | 
 
 
 
 
 | 51 | v.Y *= s; | 
 
 
 
 
 | 52 |  | 
 
 
 
 
 | 53 | return v; | 
 
 
 
 
 | 54 | } | 
 
 
 
 
 | 55 |  | 
 
 
 
 
 | 56 | public static Vector2 operator *(float s, Vector2 v) | 
 
 
 
 
 | 57 | { | 
 
 
 
 
 | 58 | v.X *= s; | 
 
 
 
 
 | 59 | v.Y *= s; | 
 
 
 
 
 | 60 |  | 
 
 
 
 
 | 61 | return v; | 
 
 
 
 
 | 62 | } | 
 
 
 
 
 | 63 |  | 
 
 
 
 
 | 64 | public static Vector2 operator /(Vector2 v, float s) => v * (1.0f / s); | 
 
 
 
 
 | 65 |  | 
 
 
 
 
 | 66 | public static Vector2 Min(Vector2 v1, Vector2 v2) => new Vector2 | 
 
 
 
 
 | 67 | { | 
 
 
 
 
 | 68 | X = (v1.X < v2.X) ? v1.X : v2.X, | 
 
 
 
 
 | 69 | Y = (v1.Y < v2.Y) ? v1.Y : v2.Y | 
 
 
 
 
 | 70 | }; | 
 
 
 
 
 | 71 |  | 
 
 
 
 
 | 72 | public static Vector2 Max(Vector2 v1, Vector2 v2) => new Vector2 | 
 
 
 
 
 | 73 | { | 
 
 
 
 
 | 74 | X = (v1.X > v2.X) ? v1.X : v2.X, | 
 
 
 
 
 | 75 | Y = (v1.Y > v2.Y) ? v1.Y : v2.Y | 
 
 
 
 
 | 76 | }; | 
 
 
 
 
 | 77 |  | 
 
 
 
 
 | 78 | public static bool operator ==(Vector2 v1, Vector2 v2) => v1.X == v2.X && v1.Y == v2.Y; | 
 
 
 
 
 | 79 | public static bool operator !=(Vector2 v1, Vector2 v2) => v1.X != v2.X || v1.Y != v2.Y; | 
 
 
 
 
 | 80 | public bool Equals(Vector2 other) => X == other.X && Y == other.Y; | 
 
 
 
 
 | 81 | public override bool Equals(object obj) => obj is Vector2 && Equals((Vector2)obj); | 
 
 
 
 
 | 82 | public override int GetHashCode() => X.GetHashCode() ^ Y.GetHashCode(); | 
 
 
 
 
 | 83 |  | 
 
 
 
 
 | 84 | public override string ToString() => $"{{{X} {Y}}}"; | 
 
 
 
 
 | 85 |  | 
 
 
 
 
 | 86 | private static Vector2 zero = new Vector2(0.0f, 0.0f); | 
 
 
 
 
 | 87 | private static Vector2 one = new Vector2(1.0f, 1.0f); | 
 
 
 
 
 | 88 | private static Vector2 unitX = new Vector2(1.0f, 0.0f); | 
 
 
 
 
 | 89 | private static Vector2 unitY = new Vector2(0.0f, 1.0f); | 
 
 
 
 
 | 90 |  | 
 
 
 
 
 | 91 | public static Vector2 Zero => zero; | 
 
 
 
 
 | 92 | public static Vector2 One => one; | 
 
 
 
 
 | 93 | public static Vector2 UnitX => unitX; | 
 
 
 
 
 | 94 | public static Vector2 UnitY => unitY; | 
 
 
 
 
 | 95 | } | 
 
 
 
 
 | 96 | } |