|
|
@@ -9,10 +9,10 @@ using ENCODING = SharpGLTF.Schema2.EncodingType;
|
|
|
namespace SharpGLTF.Memory
|
|
|
{
|
|
|
/// <summary>
|
|
|
- /// Defines the pattern in which a <see cref="ArraySegment{Byte}"/> is accessed and decoded to meaningful values.
|
|
|
+ /// Defines the memory encoding pattern for an arbitrary <see cref="ArraySegment{Byte}"/>.
|
|
|
/// </summary>
|
|
|
[System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
|
|
|
- public struct MemoryAccessInfo
|
|
|
+ public struct MemoryEncoding
|
|
|
{
|
|
|
#region debug
|
|
|
|
|
|
@@ -25,42 +25,42 @@ namespace SharpGLTF.Memory
|
|
|
|
|
|
#region constructor
|
|
|
|
|
|
- public static MemoryAccessInfo[] Create(params string[] attributes)
|
|
|
+ public static MemoryEncoding[] Create(params string[] attributes)
|
|
|
{
|
|
|
return attributes.Select(item => CreateDefaultElement(item)).ToArray();
|
|
|
}
|
|
|
|
|
|
- public static MemoryAccessInfo CreateDefaultElement(string attribute)
|
|
|
+ public static MemoryEncoding CreateDefaultElement(string attribute)
|
|
|
{
|
|
|
switch (attribute)
|
|
|
{
|
|
|
- case "INDEX": return new MemoryAccessInfo("INDEX", 0, 0, 0, DIMENSIONS.SCALAR, ENCODING.UNSIGNED_INT, false);
|
|
|
+ case "INDEX": return new MemoryEncoding("INDEX", 0, 0, 0, DIMENSIONS.SCALAR, ENCODING.UNSIGNED_INT, false);
|
|
|
|
|
|
- case "POSITION": return new MemoryAccessInfo("POSITION", 0, 0, 0, DIMENSIONS.VEC3);
|
|
|
- case "NORMAL": return new MemoryAccessInfo("NORMAL", 0, 0, 0, DIMENSIONS.VEC3);
|
|
|
- case "TANGENT": return new MemoryAccessInfo("TANGENT", 0, 0, 0, DIMENSIONS.VEC4);
|
|
|
+ case "POSITION": return new MemoryEncoding("POSITION", 0, 0, 0, DIMENSIONS.VEC3);
|
|
|
+ case "NORMAL": return new MemoryEncoding("NORMAL", 0, 0, 0, DIMENSIONS.VEC3);
|
|
|
+ case "TANGENT": return new MemoryEncoding("TANGENT", 0, 0, 0, DIMENSIONS.VEC4);
|
|
|
|
|
|
- case "TEXCOORD_0": return new MemoryAccessInfo("TEXCOORD_0", 0, 0, 0, DIMENSIONS.VEC2);
|
|
|
- case "TEXCOORD_1": return new MemoryAccessInfo("TEXCOORD_1", 0, 0, 0, DIMENSIONS.VEC2);
|
|
|
- case "TEXCOORD_2": return new MemoryAccessInfo("TEXCOORD_2", 0, 0, 0, DIMENSIONS.VEC2);
|
|
|
- case "TEXCOORD_3": return new MemoryAccessInfo("TEXCOORD_3", 0, 0, 0, DIMENSIONS.VEC2);
|
|
|
+ case "TEXCOORD_0": return new MemoryEncoding("TEXCOORD_0", 0, 0, 0, DIMENSIONS.VEC2);
|
|
|
+ case "TEXCOORD_1": return new MemoryEncoding("TEXCOORD_1", 0, 0, 0, DIMENSIONS.VEC2);
|
|
|
+ case "TEXCOORD_2": return new MemoryEncoding("TEXCOORD_2", 0, 0, 0, DIMENSIONS.VEC2);
|
|
|
+ case "TEXCOORD_3": return new MemoryEncoding("TEXCOORD_3", 0, 0, 0, DIMENSIONS.VEC2);
|
|
|
|
|
|
- case "COLOR_0": return new MemoryAccessInfo("COLOR_0", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
- case "COLOR_1": return new MemoryAccessInfo("COLOR_1", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
- case "COLOR_2": return new MemoryAccessInfo("COLOR_2", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
- case "COLOR_3": return new MemoryAccessInfo("COLOR_3", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
+ case "COLOR_0": return new MemoryEncoding("COLOR_0", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
+ case "COLOR_1": return new MemoryEncoding("COLOR_1", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
+ case "COLOR_2": return new MemoryEncoding("COLOR_2", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
+ case "COLOR_3": return new MemoryEncoding("COLOR_3", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
|
|
|
- case "JOINTS_0": return new MemoryAccessInfo("JOINTS_0", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE);
|
|
|
- case "JOINTS_1": return new MemoryAccessInfo("JOINTS_1", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE);
|
|
|
+ case "JOINTS_0": return new MemoryEncoding("JOINTS_0", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE);
|
|
|
+ case "JOINTS_1": return new MemoryEncoding("JOINTS_1", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE);
|
|
|
|
|
|
- case "WEIGHTS_0": return new MemoryAccessInfo("WEIGHTS_0", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
- case "WEIGHTS_1": return new MemoryAccessInfo("WEIGHTS_1", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
+ case "WEIGHTS_0": return new MemoryEncoding("WEIGHTS_0", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
+ case "WEIGHTS_1": return new MemoryEncoding("WEIGHTS_1", 0, 0, 0, DIMENSIONS.VEC4, ENCODING.UNSIGNED_BYTE, true);
|
|
|
}
|
|
|
|
|
|
throw new NotImplementedException();
|
|
|
}
|
|
|
|
|
|
- public MemoryAccessInfo(string name, int byteOffset, int itemsCount, int byteStride, DIMENSIONS dimensions, ENCODING encoding = ENCODING.FLOAT, Boolean normalized = false)
|
|
|
+ public MemoryEncoding(string name, int byteOffset, int itemsCount, int byteStride, DIMENSIONS dimensions, ENCODING encoding = ENCODING.FLOAT, Boolean normalized = false)
|
|
|
{
|
|
|
this.Name = name;
|
|
|
this.ByteOffset = byteOffset;
|
|
|
@@ -71,9 +71,9 @@ namespace SharpGLTF.Memory
|
|
|
this.Normalized = normalized;
|
|
|
}
|
|
|
|
|
|
- public MemoryAccessInfo Slice(int itemStart, int itemCount)
|
|
|
+ public MemoryEncoding Slice(int itemStart, int itemCount)
|
|
|
{
|
|
|
- var stride = GetRowByteLength();
|
|
|
+ var stride = _GetRowByteLength();
|
|
|
|
|
|
var clone = this;
|
|
|
clone.ByteOffset += itemStart * stride;
|
|
|
@@ -96,25 +96,12 @@ namespace SharpGLTF.Memory
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
- #region API
|
|
|
+ #region properties
|
|
|
|
|
|
/// <summary>
|
|
|
/// Gets the number of bytes of the current encoded Item, padded to 4 bytes.
|
|
|
/// </summary>
|
|
|
- public int PaddedByteLength => GetRowByteLength();
|
|
|
-
|
|
|
- public int GetRowByteLength()
|
|
|
- {
|
|
|
- var xlen = Encoding.ByteLength();
|
|
|
-
|
|
|
- if (Dimensions != Schema2.DimensionType.SCALAR || Name != "INDEX")
|
|
|
- {
|
|
|
- xlen *= this.Dimensions.DimCount();
|
|
|
- xlen = xlen.WordPadded();
|
|
|
- }
|
|
|
-
|
|
|
- return Math.Max(ByteStride, xlen);
|
|
|
- }
|
|
|
+ public int PaddedByteLength => _GetRowByteLength();
|
|
|
|
|
|
public Boolean IsValidVertexAttribute
|
|
|
{
|
|
|
@@ -151,7 +138,24 @@ namespace SharpGLTF.Memory
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public static int SetInterleavedInfo(MemoryAccessInfo[] attributes, int byteOffset, int itemsCount)
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region API
|
|
|
+
|
|
|
+ private int _GetRowByteLength()
|
|
|
+ {
|
|
|
+ var xlen = Encoding.ByteLength();
|
|
|
+
|
|
|
+ if (Dimensions != Schema2.DimensionType.SCALAR || Name != "INDEX")
|
|
|
+ {
|
|
|
+ xlen *= this.Dimensions.DimCount();
|
|
|
+ xlen = xlen.WordPadded();
|
|
|
+ }
|
|
|
+
|
|
|
+ return Math.Max(ByteStride, xlen);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static int SetInterleavedInfo(MemoryEncoding[] attributes, int byteOffset, int itemsCount)
|
|
|
{
|
|
|
Guard.NotNull(attributes, nameof(attributes));
|
|
|
|
|
|
@@ -182,11 +186,11 @@ namespace SharpGLTF.Memory
|
|
|
return byteStride;
|
|
|
}
|
|
|
|
|
|
- public static MemoryAccessInfo[] Slice(MemoryAccessInfo[] attributes, int start, int count)
|
|
|
+ public static MemoryEncoding[] Slice(MemoryEncoding[] attributes, int start, int count)
|
|
|
{
|
|
|
Guard.NotNull(attributes, nameof(attributes));
|
|
|
|
|
|
- var dst = new MemoryAccessInfo[attributes.Length];
|
|
|
+ var dst = new MemoryEncoding[attributes.Length];
|
|
|
|
|
|
for (int i = 0; i < dst.Length; ++i)
|
|
|
{
|
|
|
@@ -200,34 +204,11 @@ namespace SharpGLTF.Memory
|
|
|
|
|
|
#region nested types
|
|
|
|
|
|
- private static int _GetSortingScore(string attribute)
|
|
|
- {
|
|
|
- switch (attribute)
|
|
|
- {
|
|
|
- case "POSITION": return 0;
|
|
|
- case "NORMAL": return 1;
|
|
|
- case "TANGENT": return 2;
|
|
|
-
|
|
|
- case "COLOR_0": return 10;
|
|
|
- case "COLOR_1": return 11;
|
|
|
- case "COLOR_2": return 12;
|
|
|
- case "COLOR_3": return 13;
|
|
|
-
|
|
|
- case "TEXCOORD_0": return 20;
|
|
|
- case "TEXCOORD_1": return 21;
|
|
|
- case "TEXCOORD_2": return 22;
|
|
|
- case "TEXCOORD_3": return 23;
|
|
|
-
|
|
|
- case "JOINTS_0": return 50;
|
|
|
- case "JOINTS_1": return 51;
|
|
|
- case "WEIGHTS_0": return 50;
|
|
|
- case "WEIGHTS_1": return 51;
|
|
|
- default: return 100;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
internal static IComparer<string> NameComparer { get; private set; } = new AttributeComparer();
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Comparer used to sort attribute names in a friendly order.
|
|
|
+ /// </summary>
|
|
|
private class AttributeComparer : IComparer<String>
|
|
|
{
|
|
|
public int Compare(string x, string y)
|
|
|
@@ -237,6 +218,32 @@ namespace SharpGLTF.Memory
|
|
|
|
|
|
return xx.CompareTo(yy);
|
|
|
}
|
|
|
+
|
|
|
+ private static int _GetSortingScore(string attribute)
|
|
|
+ {
|
|
|
+ switch (attribute)
|
|
|
+ {
|
|
|
+ case "POSITION": return 0;
|
|
|
+ case "NORMAL": return 1;
|
|
|
+ case "TANGENT": return 2;
|
|
|
+
|
|
|
+ case "COLOR_0": return 10;
|
|
|
+ case "COLOR_1": return 11;
|
|
|
+ case "COLOR_2": return 12;
|
|
|
+ case "COLOR_3": return 13;
|
|
|
+
|
|
|
+ case "TEXCOORD_0": return 20;
|
|
|
+ case "TEXCOORD_1": return 21;
|
|
|
+ case "TEXCOORD_2": return 22;
|
|
|
+ case "TEXCOORD_3": return 23;
|
|
|
+
|
|
|
+ case "JOINTS_0": return 50;
|
|
|
+ case "JOINTS_1": return 51;
|
|
|
+ case "WEIGHTS_0": return 50;
|
|
|
+ case "WEIGHTS_1": return 51;
|
|
|
+ default: return 100;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
@@ -250,15 +257,15 @@ namespace SharpGLTF.Memory
|
|
|
{
|
|
|
#region constructor
|
|
|
|
|
|
- public MemoryAccessor(ArraySegment<Byte> data, MemoryAccessInfo info)
|
|
|
+ public MemoryAccessor(ArraySegment<Byte> data, MemoryEncoding info)
|
|
|
{
|
|
|
- this._Attribute = info;
|
|
|
+ this._Encoding = info;
|
|
|
this._Data = data;
|
|
|
}
|
|
|
|
|
|
- public MemoryAccessor(MemoryAccessInfo info)
|
|
|
+ public MemoryAccessor(MemoryEncoding info)
|
|
|
{
|
|
|
- this._Attribute = info;
|
|
|
+ this._Encoding = info;
|
|
|
this._Data = default;
|
|
|
}
|
|
|
|
|
|
@@ -266,10 +273,10 @@ namespace SharpGLTF.Memory
|
|
|
{
|
|
|
Guard.NotNull(bottom, nameof(bottom));
|
|
|
Guard.NotNull(topValues, nameof(topValues));
|
|
|
- Guard.IsTrue(bottom._Attribute.Dimensions == topValues._Attribute.Dimensions, nameof(topValues));
|
|
|
- Guard.IsTrue(topKeys.Count <= bottom._Attribute.ItemsCount, nameof(topKeys));
|
|
|
- Guard.IsTrue(topKeys.Count == topValues._Attribute.ItemsCount, nameof(topValues));
|
|
|
- Guard.IsTrue(topKeys.All(item => item < (uint)bottom._Attribute.ItemsCount), nameof(topKeys));
|
|
|
+ Guard.IsTrue(bottom._Encoding.Dimensions == topValues._Encoding.Dimensions, nameof(topValues));
|
|
|
+ Guard.IsTrue(topKeys.Count <= bottom._Encoding.ItemsCount, nameof(topKeys));
|
|
|
+ Guard.IsTrue(topKeys.Count == topValues._Encoding.ItemsCount, nameof(topValues));
|
|
|
+ Guard.IsTrue(topKeys.All(item => item < (uint)bottom._Encoding.ItemsCount), nameof(topKeys));
|
|
|
|
|
|
return new SparseArray<Single>(bottom.AsScalarArray(), topValues.AsScalarArray(), topKeys);
|
|
|
}
|
|
|
@@ -278,10 +285,10 @@ namespace SharpGLTF.Memory
|
|
|
{
|
|
|
Guard.NotNull(bottom, nameof(bottom));
|
|
|
Guard.NotNull(topValues, nameof(topValues));
|
|
|
- Guard.IsTrue(bottom._Attribute.Dimensions == topValues._Attribute.Dimensions, nameof(topValues));
|
|
|
- Guard.IsTrue(topKeys.Count <= bottom._Attribute.ItemsCount, nameof(topKeys));
|
|
|
- Guard.IsTrue(topKeys.Count == topValues._Attribute.ItemsCount, nameof(topValues));
|
|
|
- Guard.IsTrue(topKeys.All(item => item < (uint)bottom._Attribute.ItemsCount), nameof(topKeys));
|
|
|
+ Guard.IsTrue(bottom._Encoding.Dimensions == topValues._Encoding.Dimensions, nameof(topValues));
|
|
|
+ Guard.IsTrue(topKeys.Count <= bottom._Encoding.ItemsCount, nameof(topKeys));
|
|
|
+ Guard.IsTrue(topKeys.Count == topValues._Encoding.ItemsCount, nameof(topValues));
|
|
|
+ Guard.IsTrue(topKeys.All(item => item < (uint)bottom._Encoding.ItemsCount), nameof(topKeys));
|
|
|
|
|
|
return new SparseArray<Vector2>(bottom.AsVector2Array(), topValues.AsVector2Array(), topKeys);
|
|
|
}
|
|
|
@@ -290,10 +297,10 @@ namespace SharpGLTF.Memory
|
|
|
{
|
|
|
Guard.NotNull(bottom, nameof(bottom));
|
|
|
Guard.NotNull(topValues, nameof(topValues));
|
|
|
- Guard.IsTrue(bottom._Attribute.Dimensions == topValues._Attribute.Dimensions, nameof(topValues));
|
|
|
- Guard.IsTrue(topKeys.Count <= bottom._Attribute.ItemsCount, nameof(topKeys));
|
|
|
- Guard.IsTrue(topKeys.Count == topValues._Attribute.ItemsCount, nameof(topValues));
|
|
|
- Guard.IsTrue(topKeys.All(item => item < (uint)bottom._Attribute.ItemsCount), nameof(topKeys));
|
|
|
+ Guard.IsTrue(bottom._Encoding.Dimensions == topValues._Encoding.Dimensions, nameof(topValues));
|
|
|
+ Guard.IsTrue(topKeys.Count <= bottom._Encoding.ItemsCount, nameof(topKeys));
|
|
|
+ Guard.IsTrue(topKeys.Count == topValues._Encoding.ItemsCount, nameof(topValues));
|
|
|
+ Guard.IsTrue(topKeys.All(item => item < (uint)bottom._Encoding.ItemsCount), nameof(topKeys));
|
|
|
|
|
|
return new SparseArray<Vector3>(bottom.AsVector3Array(), topValues.AsVector3Array(), topKeys);
|
|
|
}
|
|
|
@@ -302,10 +309,10 @@ namespace SharpGLTF.Memory
|
|
|
{
|
|
|
Guard.NotNull(bottom, nameof(bottom));
|
|
|
Guard.NotNull(topValues, nameof(topValues));
|
|
|
- Guard.IsTrue(bottom._Attribute.Dimensions == topValues._Attribute.Dimensions, nameof(topValues));
|
|
|
- Guard.IsTrue(topKeys.Count <= bottom._Attribute.ItemsCount, nameof(topKeys));
|
|
|
- Guard.IsTrue(topKeys.Count == topValues._Attribute.ItemsCount, nameof(topValues));
|
|
|
- Guard.IsTrue(topKeys.All(item => item < (uint)bottom._Attribute.ItemsCount), nameof(topKeys));
|
|
|
+ Guard.IsTrue(bottom._Encoding.Dimensions == topValues._Encoding.Dimensions, nameof(topValues));
|
|
|
+ Guard.IsTrue(topKeys.Count <= bottom._Encoding.ItemsCount, nameof(topKeys));
|
|
|
+ Guard.IsTrue(topKeys.Count == topValues._Encoding.ItemsCount, nameof(topValues));
|
|
|
+ Guard.IsTrue(topKeys.All(item => item < (uint)bottom._Encoding.ItemsCount), nameof(topKeys));
|
|
|
|
|
|
return new SparseArray<Vector4>(bottom.AsVector4Array(), topValues.AsVector4Array(), topKeys);
|
|
|
}
|
|
|
@@ -314,10 +321,10 @@ namespace SharpGLTF.Memory
|
|
|
{
|
|
|
Guard.NotNull(bottom, nameof(bottom));
|
|
|
Guard.NotNull(topValues, nameof(topValues));
|
|
|
- Guard.IsTrue(bottom._Attribute.Dimensions == topValues._Attribute.Dimensions, nameof(topValues));
|
|
|
- Guard.IsTrue(topKeys.Count <= bottom._Attribute.ItemsCount, nameof(topKeys));
|
|
|
- Guard.IsTrue(topKeys.Count == topValues._Attribute.ItemsCount, nameof(topValues));
|
|
|
- Guard.IsTrue(topKeys.All(item => item < (uint)bottom._Attribute.ItemsCount), nameof(topKeys));
|
|
|
+ Guard.IsTrue(bottom._Encoding.Dimensions == topValues._Encoding.Dimensions, nameof(topValues));
|
|
|
+ Guard.IsTrue(topKeys.Count <= bottom._Encoding.ItemsCount, nameof(topKeys));
|
|
|
+ Guard.IsTrue(topKeys.Count == topValues._Encoding.ItemsCount, nameof(topValues));
|
|
|
+ Guard.IsTrue(topKeys.All(item => item < (uint)bottom._Encoding.ItemsCount), nameof(topKeys));
|
|
|
|
|
|
return new SparseArray<Vector4>(bottom.AsColorArray(defaultW), topValues.AsColorArray(defaultW), topKeys);
|
|
|
}
|
|
|
@@ -327,7 +334,7 @@ namespace SharpGLTF.Memory
|
|
|
#region data
|
|
|
|
|
|
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
|
|
|
- private MemoryAccessInfo _Attribute;
|
|
|
+ private MemoryEncoding _Encoding;
|
|
|
|
|
|
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
|
|
|
private ArraySegment<Byte> _Data;
|
|
|
@@ -336,7 +343,7 @@ namespace SharpGLTF.Memory
|
|
|
|
|
|
#region properties
|
|
|
|
|
|
- public MemoryAccessInfo Attribute => _Attribute;
|
|
|
+ public MemoryEncoding Attribute => _Encoding;
|
|
|
|
|
|
public ArraySegment<Byte> Data => _Data;
|
|
|
|
|
|
@@ -344,74 +351,74 @@ namespace SharpGLTF.Memory
|
|
|
|
|
|
#region API
|
|
|
|
|
|
- public void Update(ArraySegment<Byte> data, MemoryAccessInfo info)
|
|
|
+ public void Update(ArraySegment<Byte> data, MemoryEncoding info)
|
|
|
{
|
|
|
- this._Attribute = info;
|
|
|
+ this._Encoding = info;
|
|
|
this._Data = data;
|
|
|
}
|
|
|
|
|
|
public IntegerArray AsIntegerArray()
|
|
|
{
|
|
|
- Guard.IsTrue(_Attribute.IsValidIndexer, nameof(_Attribute));
|
|
|
- Guard.IsTrue(_Attribute.Dimensions == DIMENSIONS.SCALAR, nameof(_Attribute));
|
|
|
- return new IntegerArray(_Data, _Attribute.ByteOffset, _Attribute.ItemsCount, _Attribute.Encoding.ToIndex());
|
|
|
+ Guard.IsTrue(_Encoding.IsValidIndexer, nameof(_Encoding));
|
|
|
+ Guard.IsTrue(_Encoding.Dimensions == DIMENSIONS.SCALAR, nameof(_Encoding));
|
|
|
+ return new IntegerArray(_Data, _Encoding.ByteOffset, _Encoding.ItemsCount, _Encoding.Encoding.ToIndex());
|
|
|
}
|
|
|
|
|
|
public ScalarArray AsScalarArray()
|
|
|
{
|
|
|
- Guard.IsTrue(_Attribute.IsValidVertexAttribute, nameof(_Attribute));
|
|
|
- Guard.IsTrue(_Attribute.Dimensions == DIMENSIONS.SCALAR, nameof(_Attribute));
|
|
|
- return new ScalarArray(_Data, _Attribute.ByteOffset, _Attribute.ItemsCount, _Attribute.ByteStride, _Attribute.Encoding, _Attribute.Normalized);
|
|
|
+ Guard.IsTrue(_Encoding.IsValidVertexAttribute, nameof(_Encoding));
|
|
|
+ Guard.IsTrue(_Encoding.Dimensions == DIMENSIONS.SCALAR, nameof(_Encoding));
|
|
|
+ return new ScalarArray(_Data, _Encoding.ByteOffset, _Encoding.ItemsCount, _Encoding.ByteStride, _Encoding.Encoding, _Encoding.Normalized);
|
|
|
}
|
|
|
|
|
|
public Vector2Array AsVector2Array()
|
|
|
{
|
|
|
- Guard.IsTrue(_Attribute.IsValidVertexAttribute, nameof(_Attribute));
|
|
|
- Guard.IsTrue(_Attribute.Dimensions == DIMENSIONS.VEC2, nameof(_Attribute));
|
|
|
- return new Vector2Array(_Data, _Attribute.ByteOffset, _Attribute.ItemsCount, _Attribute.ByteStride, _Attribute.Encoding, _Attribute.Normalized);
|
|
|
+ Guard.IsTrue(_Encoding.IsValidVertexAttribute, nameof(_Encoding));
|
|
|
+ Guard.IsTrue(_Encoding.Dimensions == DIMENSIONS.VEC2, nameof(_Encoding));
|
|
|
+ return new Vector2Array(_Data, _Encoding.ByteOffset, _Encoding.ItemsCount, _Encoding.ByteStride, _Encoding.Encoding, _Encoding.Normalized);
|
|
|
}
|
|
|
|
|
|
public Vector3Array AsVector3Array()
|
|
|
{
|
|
|
- Guard.IsTrue(_Attribute.IsValidVertexAttribute, nameof(_Attribute));
|
|
|
- Guard.IsTrue(_Attribute.Dimensions == DIMENSIONS.VEC3, nameof(_Attribute));
|
|
|
- return new Vector3Array(_Data, _Attribute.ByteOffset, _Attribute.ItemsCount, _Attribute.ByteStride, _Attribute.Encoding, _Attribute.Normalized);
|
|
|
+ Guard.IsTrue(_Encoding.IsValidVertexAttribute, nameof(_Encoding));
|
|
|
+ Guard.IsTrue(_Encoding.Dimensions == DIMENSIONS.VEC3, nameof(_Encoding));
|
|
|
+ return new Vector3Array(_Data, _Encoding.ByteOffset, _Encoding.ItemsCount, _Encoding.ByteStride, _Encoding.Encoding, _Encoding.Normalized);
|
|
|
}
|
|
|
|
|
|
public Vector4Array AsVector4Array()
|
|
|
{
|
|
|
- Guard.IsTrue(_Attribute.IsValidVertexAttribute, nameof(_Attribute));
|
|
|
- Guard.IsTrue(_Attribute.Dimensions == DIMENSIONS.VEC4, nameof(_Attribute));
|
|
|
- return new Vector4Array(_Data, _Attribute.ByteOffset, _Attribute.ItemsCount, _Attribute.ByteStride, _Attribute.Encoding, _Attribute.Normalized);
|
|
|
+ Guard.IsTrue(_Encoding.IsValidVertexAttribute, nameof(_Encoding));
|
|
|
+ Guard.IsTrue(_Encoding.Dimensions == DIMENSIONS.VEC4, nameof(_Encoding));
|
|
|
+ return new Vector4Array(_Data, _Encoding.ByteOffset, _Encoding.ItemsCount, _Encoding.ByteStride, _Encoding.Encoding, _Encoding.Normalized);
|
|
|
}
|
|
|
|
|
|
public ColorArray AsColorArray(Single defaultW = 1)
|
|
|
{
|
|
|
- Guard.IsTrue(_Attribute.IsValidVertexAttribute, nameof(_Attribute));
|
|
|
- Guard.IsTrue(_Attribute.Dimensions == DIMENSIONS.VEC3 || _Attribute.Dimensions == DIMENSIONS.VEC4, nameof(_Attribute));
|
|
|
- return new ColorArray(_Data, _Attribute.ByteOffset, _Attribute.ItemsCount, _Attribute.ByteStride, _Attribute.Dimensions.DimCount(), _Attribute.Encoding, _Attribute.Normalized, defaultW);
|
|
|
+ Guard.IsTrue(_Encoding.IsValidVertexAttribute, nameof(_Encoding));
|
|
|
+ Guard.IsTrue(_Encoding.Dimensions == DIMENSIONS.VEC3 || _Encoding.Dimensions == DIMENSIONS.VEC4, nameof(_Encoding));
|
|
|
+ return new ColorArray(_Data, _Encoding.ByteOffset, _Encoding.ItemsCount, _Encoding.ByteStride, _Encoding.Dimensions.DimCount(), _Encoding.Encoding, _Encoding.Normalized, defaultW);
|
|
|
}
|
|
|
|
|
|
public QuaternionArray AsQuaternionArray()
|
|
|
{
|
|
|
- Guard.IsTrue(_Attribute.IsValidVertexAttribute, nameof(_Attribute));
|
|
|
- Guard.IsTrue(_Attribute.Dimensions == DIMENSIONS.VEC4, nameof(_Attribute));
|
|
|
- return new QuaternionArray(_Data, _Attribute.ByteOffset, _Attribute.ItemsCount, _Attribute.ByteStride, _Attribute.Encoding, _Attribute.Normalized);
|
|
|
+ Guard.IsTrue(_Encoding.IsValidVertexAttribute, nameof(_Encoding));
|
|
|
+ Guard.IsTrue(_Encoding.Dimensions == DIMENSIONS.VEC4, nameof(_Encoding));
|
|
|
+ return new QuaternionArray(_Data, _Encoding.ByteOffset, _Encoding.ItemsCount, _Encoding.ByteStride, _Encoding.Encoding, _Encoding.Normalized);
|
|
|
}
|
|
|
|
|
|
public Matrix4x4Array AsMatrix4x4Array()
|
|
|
{
|
|
|
- Guard.IsTrue(_Attribute.IsValidVertexAttribute, nameof(_Attribute));
|
|
|
- Guard.IsTrue(_Attribute.Dimensions == DIMENSIONS.MAT4, nameof(_Attribute));
|
|
|
- return new Matrix4x4Array(_Data, _Attribute.ByteOffset, _Attribute.ItemsCount, _Attribute.ByteStride, _Attribute.Encoding, _Attribute.Normalized);
|
|
|
+ Guard.IsTrue(_Encoding.IsValidVertexAttribute, nameof(_Encoding));
|
|
|
+ Guard.IsTrue(_Encoding.Dimensions == DIMENSIONS.MAT4, nameof(_Encoding));
|
|
|
+ return new Matrix4x4Array(_Data, _Encoding.ByteOffset, _Encoding.ItemsCount, _Encoding.ByteStride, _Encoding.Encoding, _Encoding.Normalized);
|
|
|
}
|
|
|
|
|
|
public MultiArray AsMultiArray(int dimensions)
|
|
|
{
|
|
|
- Guard.IsTrue(_Attribute.IsValidVertexAttribute, nameof(_Attribute));
|
|
|
- Guard.IsTrue(_Attribute.Dimensions == DIMENSIONS.SCALAR, nameof(_Attribute));
|
|
|
- Guard.IsTrue(_Attribute.ByteStride == 0, nameof(_Attribute));
|
|
|
- return new MultiArray(_Data, _Attribute.ByteOffset, _Attribute.ItemsCount, _Attribute.ByteStride, dimensions, _Attribute.Encoding, _Attribute.Normalized);
|
|
|
+ Guard.IsTrue(_Encoding.IsValidVertexAttribute, nameof(_Encoding));
|
|
|
+ Guard.IsTrue(_Encoding.Dimensions == DIMENSIONS.SCALAR, nameof(_Encoding));
|
|
|
+ Guard.IsTrue(_Encoding.ByteStride == 0, nameof(_Encoding));
|
|
|
+ return new MultiArray(_Data, _Encoding.ByteOffset, _Encoding.ItemsCount, _Encoding.ByteStride, dimensions, _Encoding.Encoding, _Encoding.Normalized);
|
|
|
}
|
|
|
|
|
|
#endregion
|