#region License /* MoonWorks - Game Development Framework * Copyright 2021 Evan Hemsley */ /* Derived from code by Ethan Lee (Copyright 2009-2021). * Released under the Microsoft Public License. * See fna.LICENSE for details. * Derived from code by the Mono.Xna Team (Copyright 2006). * Released under the MIT License. See monoxna.LICENSE for details. */ #endregion #region Using Statements using System; using MoonWorks.Math; #endregion namespace MoonWorks.Graphics { /// /// Packed vector type containing unsigned normalized values ranging from 0 to 1. /// The x and z components use 5 bits, and the y component uses 6 bits. /// public struct Bgr565 : IPackedVector, IEquatable, IPackedVector { #region Public Properties /// /// Gets and sets the packed value. /// public ushort PackedValue { get { return packedValue; } set { packedValue = value; } } #endregion #region Private Variables private ushort packedValue; #endregion #region Public Constructors /// /// Creates a new instance of Bgr565. /// /// The x component /// The y component /// The z component public Bgr565(float x, float y, float z) { packedValue = Pack(x, y, z); } /// /// Creates a new instance of Bgr565. /// /// /// Vector containing the components for the packed vector. /// public Bgr565(Vector3 vector) { packedValue = Pack(vector.X, vector.Y, vector.Z); } #endregion #region Public Methods /// /// Gets the packed vector in Vector3 format. /// /// The packed vector in Vector3 format public Vector3 ToVector3() { return new Vector3( (packedValue >> 11) / 31.0f, ((packedValue >> 5) & 0x3F) / 63.0f, (packedValue & 0x1F) / 31.0f ); } #endregion #region IPackedVector Methods /// /// Sets the packed vector from a Vector4. /// /// Vector containing the components. void IPackedVector.PackFromVector4(Vector4 vector) { Pack(vector.X, vector.Y, vector.Z); } /// /// Gets the packed vector in Vector4 format. /// /// The packed vector in Vector4 format Vector4 IPackedVector.ToVector4() { return new Vector4(ToVector3(), 1.0f); } #endregion #region Public Static Operators and Override Methods /// /// Compares an object with the packed vector. /// /// The object to compare. /// True if the object is equal to the packed vector. public override bool Equals(object obj) { return (obj is Bgr565) && Equals((Bgr565) obj); } /// /// Compares another Bgr565 packed vector with the packed vector. /// /// The Bgr565 packed vector to compare. /// True if the packed vectors are equal. public bool Equals(Bgr565 other) { return packedValue == other.packedValue; } /// /// Gets a string representation of the packed vector. /// /// A string representation of the packed vector. public override string ToString() { return packedValue.ToString("X"); } /// /// Gets a hash code of the packed vector. /// /// The hash code for the packed vector. public override int GetHashCode() { return packedValue.GetHashCode(); } public static bool operator ==(Bgr565 lhs, Bgr565 rhs) { return lhs.packedValue == rhs.packedValue; } public static bool operator !=(Bgr565 lhs, Bgr565 rhs) { return lhs.packedValue != rhs.packedValue; } #endregion #region Private Static Pack Method private static ushort Pack(float x, float y, float z) { return (ushort) ( (((ushort) System.Math.Round(MathHelper.Clamp(x, 0, 1) * 31.0f)) << 11) | (((ushort) System.Math.Round(MathHelper.Clamp(y, 0, 1) * 63.0f)) << 5) | ((ushort) System.Math.Round(MathHelper.Clamp(z, 0, 1) * 31.0f)) ); } #endregion } }