using System; using System.Collections.Generic; using System.Text; namespace SharpGLTF.Memory { using DIMENSIONS = SharpGLTF.Schema2.DimensionType; using ENCODING = SharpGLTF.Schema2.EncodingType; /// /// Defines the formatting in which a byte sequence can be encoded/decoded to attribute elements. /// [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")] public readonly struct AttributeFormat : IEquatable { #region debug internal string _GetDebuggerDisplay() { var txt = $"{Encoding}"; switch (Dimensions) { case DIMENSIONS.SCALAR: break; case DIMENSIONS.VEC2: txt += "2"; break; case DIMENSIONS.VEC3: txt += "3"; break; case DIMENSIONS.VEC4: txt += "4"; break; case DIMENSIONS.MAT2: txt += "2x2"; break; case DIMENSIONS.MAT3: txt += "3x3"; break; case DIMENSIONS.MAT4: txt += "4x4"; break; default: txt += "?"; break; } if (Normalized) txt += " Normalized"; return txt; } #endregion #region constructors public static implicit operator AttributeFormat(ENCODING enc) { return new AttributeFormat(enc); } public static implicit operator AttributeFormat(DIMENSIONS dim) { return new AttributeFormat(dim); } public static implicit operator AttributeFormat((DIMENSIONS dim, ENCODING enc) fmt) { return new AttributeFormat(fmt.dim, fmt.enc); } public static implicit operator AttributeFormat((DIMENSIONS dim, ENCODING enc, Boolean nrm) fmt) { return new AttributeFormat(fmt.dim, fmt.enc, fmt.nrm); } public AttributeFormat(ENCODING enc) { Dimensions = DIMENSIONS.SCALAR; Encoding = enc; Normalized = false; ByteSize = Dimensions.DimCount() * Encoding.ByteLength(); } public AttributeFormat(DIMENSIONS dim) { Dimensions = dim; Encoding = ENCODING.FLOAT; Normalized = false; ByteSize = Dimensions.DimCount() * Encoding.ByteLength(); } public AttributeFormat(DIMENSIONS dim, ENCODING enc) { Dimensions = dim; Encoding = enc; Normalized = false; ByteSize = Dimensions.DimCount() * Encoding.ByteLength(); } public AttributeFormat(DIMENSIONS dim, ENCODING enc, Boolean nrm) { Dimensions = dim; Encoding = enc; Normalized = nrm; ByteSize = Dimensions.DimCount() * Encoding.ByteLength(); } #endregion #region data public readonly ENCODING Encoding; public readonly DIMENSIONS Dimensions; public readonly Boolean Normalized; public readonly Int32 ByteSize; public override int GetHashCode() { return Dimensions.GetHashCode() ^ Encoding.GetHashCode() ^ Normalized.GetHashCode(); } public static bool AreEqual(AttributeFormat a, AttributeFormat b) { if (a.Encoding != b.Encoding) return false; if (a.Dimensions != b.Dimensions) return false; if (a.Normalized != b.Normalized) return false; return true; } public Int32 ByteSizePadded => ByteSize.WordPadded(); #endregion #region API public override bool Equals(object obj) { return obj is AttributeFormat other ? AreEqual(this, other) : false; } public bool Equals(AttributeFormat other) { return AreEqual(this, other); } public static bool operator ==(AttributeFormat a, AttributeFormat b) { return AreEqual(a, b); } public static bool operator !=(AttributeFormat a, AttributeFormat b) { return !AreEqual(a, b); } #endregion } }