using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace StgSharp.Math { /// /// A two dimension vector defined by two elements. /// Vec2Ds in StgSharp are defaultly usaed as colum vector. /// [StructLayout(LayoutKind.Explicit, Size = 16, Pack = 16)] public struct Vec2d { [FieldOffset(0)] public float X; [FieldOffset(4)] public float Y; [FieldOffset(0)] internal Vector4 vec; [FieldOffset(0)] internal Vector2 v; public Vec2d(float x, float y) { v = new Vector2(x, y); } internal Vec2d(Vector2 vec) { v = vec; } public static Vec2d Zero { get { return new Vec2d(0, 0); } } public static Vec2d Unit { get { return new Vec2d(1, 1); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vec2d operator +(Vec2d left, Vec2d right) { return new Vec2d(left.v + right.v); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vec2d operator -(Vec2d left, Vec2d right) { return new Vec2d(left.v - right.v); } public static Vec2d operator *(Vec2d vec, float value) { return new Vec2d(vec.v * value); } public static Vec2d operator /(Vec2d vec, float value) { return new Vec2d(vec.v / value); } public static bool operator ==(Vec2d left, Vec2d right) { return left.v == right.v; } public static bool operator !=(Vec2d left, Vec2d right) { return !(left == right); } public float Cross(Vec2d right) { return X * right.Y - Y * right.X; } } }