#region License /* FNA - XNA4 Reimplementation for Desktop Platforms * Copyright 2009-2016 Ethan Lee and the MonoGame Team * * Released under the Microsoft Public License. * See LICENSE for details. */ #endregion #region Using Statements using System; #endregion namespace Microsoft.Xna.Framework.Graphics.PackedVector { /// /// Packed vector type containing four 8-bit unsigned integer values, ranging from 0 to 255. /// public struct Byte4 : IPackedVector, IEquatable, IPackedVector { #region Public Properties /// /// Directly gets or sets the packed representation of the value. /// /// The packed representation of the value. [CLSCompliant(false)] public uint PackedValue { get { return packedValue; } set { packedValue = value; } } #endregion #region Private Variables private uint packedValue; #endregion #region Public Constructors /// /// Initializes a new instance of the Byte4 class. /// /// /// A vector containing the initial values for the components of the Byte4 structure. /// public Byte4(Vector4 vector) { packedValue = Pack(ref vector); } /// /// Initializes a new instance of the Byte4 class. /// /// Initial value for the x component. /// Initial value for the y component. /// Initial value for the z component. /// Initial value for the w component. public Byte4(float x, float y, float z, float w) { Vector4 vector = new Vector4(x, y, z, w); packedValue = Pack(ref vector); } #endregion #region Public Methods /// /// Expands the packed representation into a Vector4. /// /// The expanded vector. public Vector4 ToVector4() { return new Vector4( (float) (packedValue & 0xFF), (float) ((packedValue >> 0x8) & 0xFF), (float) ((packedValue >> 0x10) & 0xFF), (float) ((packedValue >> 0x18) & 0xFF) ); } #endregion #region IPackedVector Methods /// /// Sets the packed representation from a Vector4. /// /// The vector to create the packed representation from. void IPackedVector.PackFromVector4(Vector4 vector) { packedValue = Pack(ref vector); } #endregion #region Public Static Operators and Override Methods /// /// Compares the current instance of a class to another instance to determine /// whether they are different. /// /// The object to the left of the equality operator. /// The object to the right of the equality operator. /// True if the objects are different; false otherwise. public static bool operator !=(Byte4 a, Byte4 b) { return a.packedValue != b.packedValue; } /// /// Compares the current instance of a class to another instance to determine /// whether they are the same. /// /// The object to the left of the equality operator. /// The object to the right of the equality operator. /// True if the objects are the same; false otherwise. public static bool operator ==(Byte4 a, Byte4 b) { return a.packedValue == b.packedValue; } /// /// Returns a value that indicates whether the current instance is equal to a /// specified object. /// /// The object with which to make the comparison. /// /// True if the current instance is equal to the specified object; false otherwise. /// public override bool Equals(object obj) { return (obj is Byte4) && Equals((Byte4) obj); } /// /// Returns a value that indicates whether the current instance is equal to a /// specified object. /// /// The object with which to make the comparison. /// /// True if the current instance is equal to the specified object; false otherwise. /// public bool Equals(Byte4 other) { return this == other; } /// /// Gets the hash code for the current instance. /// /// Hash code for the instance. public override int GetHashCode() { return packedValue.GetHashCode(); } /// /// Returns a string representation of the current instance. /// /// String that represents the object. public override string ToString() { return packedValue.ToString("x8"); } #endregion #region Private Static Pack Method /// /// Packs a vector into a uint. /// /// The vector containing the values to pack. /// The ulong containing the packed values. static uint Pack(ref Vector4 vector) { return ( ((uint) MathHelper.Clamp(vector.X, 0, 255) & 0xFF) | (((uint) MathHelper.Clamp(vector.Y, 0, 255) & 0xFF) << 0x8) | (((uint) MathHelper.Clamp(vector.Z, 0, 255) & 0xFF) << 0x10) | (((uint) MathHelper.Clamp(vector.W, 0, 255) & 0xFF) << 0x18) ); } #endregion } }