//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// using System.Runtime.InteropServices; namespace BansheeEngine { /** @addtogroup Math * @{ */ /// /// Wrapper class which indicates a given angle value is in radians. Radian values are interchangeable with degree /// values, and conversions will be done automatically between them. /// [StructLayout(LayoutKind.Sequential), SerializeObject] public struct Radian // Note: Must match C++ class Radian { [SerializeField] readonly float value; /// /// Creates a new radian value. /// /// Value in radians. public Radian(float value = 0.0f) { this.value = value; } /// /// Creates a new radian value. /// /// Value in degrees. public Radian(Degree d) { this.value = d.Radians; } /// /// Converts a undefined angle value to a radian value. /// /// Value in degrees. /// Radian object wrapping the value. public static explicit operator Radian(float value) { return new Radian(value); } /// /// Converts a degree angle value to a radian value. /// /// Value in degrees. /// Radian object wrapping the value. public static implicit operator Radian(Degree d) { return new Radian(d.Radians); } /// /// Converts a radian value to a regular floating point value. /// /// Radian value to convert. /// Value in radians as floating point type. public static explicit operator float(Radian r) { return r.value; } /// /// Returns the value in degrees as a floating point type. /// public float Degrees { get { return value*MathEx.Rad2Deg; } } /// /// Returns the value in radians as a floating point type. /// public float Radians { get { return value; } } public static Radian operator +(Radian a) { return a; } public static Radian operator +(Radian a, Radian b) { return new Radian(a.value + b.value); } public static Radian operator +(Radian a, Degree d) { return new Radian(a.value + d.Radians); } public static Radian operator -(Radian a) { return new Radian(-a.value); } public static Radian operator -(Radian a, Radian b) { return new Radian(a.value - b.value); } public static Radian operator -(Radian a, Degree d) { return new Radian(a.value - d.Radians); } public static Radian operator *(Radian a, float s) { return new Radian(a.value * s); } public static Radian operator *(float s, Radian a) { return new Radian(a.value * s); } public static Radian operator *(Radian a, Radian b) { return new Radian(a.value * b.value); } public static Radian operator /(Radian a, float s) { return new Radian(a.value / s); } public static Radian operator /(float s, Radian a) { return new Radian(a.value / s); } public static Radian operator /(Radian a, Radian b) { return new Radian(a.value / b.value); } public static bool operator <(Radian a, Radian b) { return a.value < b.value; } public static bool operator >(Radian a, Radian b) { return a.value > b.value; } public static bool operator <=(Radian a, Radian b) { return a.value <= b.value; } public static bool operator >=(Radian a, Radian b) { return a.value >= b.value; } public static bool operator ==(Radian a, Radian b) { return a.value == b.value; } public static bool operator !=(Radian a, Radian b) { return a.value != b.value; } /// public override bool Equals(object other) { if (!(other is Radian)) return false; Radian radian = (Radian)other; if (value.Equals(radian.value)) return true; return false; } /// public override int GetHashCode() { return value.GetHashCode(); } /// public override string ToString() { return value.ToString(); } } /** @} */ }