Skip to content

Instantly share code, notes, and snippets.

@Metapyziks
Created September 19, 2014 18:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Metapyziks/de886423fa31c6ebfe65 to your computer and use it in GitHub Desktop.
Save Metapyziks/de886423fa31c6ebfe65 to your computer and use it in GitHub Desktop.
using System;
using Jurassic;
namespace GameAPI
{
/// <summary>
/// A two component vector of floats.
/// </summary>
[GenerateBindings]
public struct Vector2f
{
[BindMember]
public static explicit operator Vector2i(Vector2f vec)
{
return new Vector2i((int) vec.X, (int) vec.Y);
}
[BindMember]
public static readonly Vector2f Zero = new Vector2f(0f, 0f);
[BindMember]
public static readonly Vector2f UnitX = new Vector2f(1f, 0f);
[BindMember]
public static readonly Vector2f UnitY = new Vector2f(0f, 1f);
#region Operators
public static Vector2f operator +(Vector2f vec)
{
return vec;
}
[BindMember]
public static Vector2f operator+(Vector2f a, Vector2f b)
{
return new Vector2f(a.X + b.X, a.Y + b.Y);
}
public static Vector2f operator -(Vector2f vec)
{
return new Vector2f(-vec.X, -vec.Y);
}
[BindMember]
public static Vector2f operator -(Vector2f a, Vector2f b)
{
return new Vector2f(a.X - b.X, a.Y - b.Y);
}
[BindMember("mulVec")]
public static Vector2f operator *(Vector2f a, Vector2f b)
{
return new Vector2f(a.X * b.X, a.Y * b.Y);
}
[BindMember]
public static Vector2f operator *(Vector2f vec, float val)
{
return new Vector2f(vec.X * val, vec.Y * val);
}
public static Vector2f operator *(float val, Vector2f vec)
{
return new Vector2f(vec.X * val, vec.Y * val);
}
[BindMember("divVec")]
public static Vector2f operator /(Vector2f a, Vector2f b)
{
return new Vector2f(a.X / b.X, a.Y / b.Y);
}
[BindMember]
public static Vector2f operator /(Vector2f vec, float val)
{
return new Vector2f(vec.X / val, vec.Y / val);
}
public static Vector2f operator /(float val, Vector2f vec)
{
return new Vector2f(val / vec.X, val / vec.Y);
}
#endregion
[BindMember]
public static Vector2f FromAngle(float radians)
{
return new Vector2f(Mathf.Cos(radians), Mathf.Sin(radians));
}
[BindMember]
public static Vector2f New(float x, float y)
{
return new Vector2f(x, y);
}
[BindMember]
public float X;
[BindMember]
public float Y;
[BindMember]
public float Length { get { return Mathf.Sqrt(X * X + Y * Y); } }
[BindMember]
public float LengthSquared { get { return X * X + Y * Y; } }
[BindMember]
public Vector2f Normalized { get { return this / Length; } }
[BindMember]
public float Angle { get { return Mathf.Atan2(Y, X); } }
public Vector2f(float x, float y)
{
X = x; Y = y;
}
[BindMember]
public float Dot(Vector2f vec)
{
return X * vec.X + Y * vec.Y;
}
public override bool Equals(object obj)
{
return obj is Vector2f && Equals((Vector2f) obj);
}
[BindMember]
public bool Equals(Vector2f vec)
{
return X == vec.X && Y == vec.Y;
}
public override int GetHashCode()
{
return (int) (X * 65536f) ^ (int) (Y * 65536f);
}
[BindMember]
public override String ToString()
{
return String.Format("({0:F2}, {1:F2})", X, Y);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment