/// <summary> /// /// </summary> /// <param name="vertexArrayType"></param> public ArrayBufferItemAttribute(ArrayBufferItemType vertexArrayType) { mArrayType = ArrayBufferItem.GetArrayBaseType(vertexArrayType); mArrayLength = ArrayBufferItem.GetArrayLength(vertexArrayType); mArrayRank = ArrayBufferItem.GetArrayRank(vertexArrayType); }
/// <summary> /// Get the array components base type of the vertex array buffer item. /// </summary> /// <param name="vertexArrayType"> /// A <see cref="ArrayBufferItemType"/> that describe the vertex array buffer item. /// </param> /// <returns> /// It returns a <see cref="VertexBaseType"/> indicating the type of the components of /// the vertex array buffer item. /// </returns> public static VertexBaseType GetVertexBaseType(this ArrayBufferItemType vertexArrayType) { switch (vertexArrayType) { case ArrayBufferItemType.Byte: case ArrayBufferItemType.Byte2: case ArrayBufferItemType.Byte3: case ArrayBufferItemType.Byte4: return(VertexBaseType.Byte); case ArrayBufferItemType.UByte: case ArrayBufferItemType.UByte2: case ArrayBufferItemType.UByte3: case ArrayBufferItemType.UByte4: return(VertexBaseType.UByte); case ArrayBufferItemType.Short: case ArrayBufferItemType.Short2: case ArrayBufferItemType.Short3: case ArrayBufferItemType.Short4: return(VertexBaseType.Short); case ArrayBufferItemType.UShort: case ArrayBufferItemType.UShort2: case ArrayBufferItemType.UShort3: case ArrayBufferItemType.UShort4: return(VertexBaseType.UShort); case ArrayBufferItemType.Int: case ArrayBufferItemType.Int2: case ArrayBufferItemType.Int3: case ArrayBufferItemType.Int4: return(VertexBaseType.Int); case ArrayBufferItemType.UInt: case ArrayBufferItemType.UInt2: case ArrayBufferItemType.UInt3: case ArrayBufferItemType.UInt4: return(VertexBaseType.UInt); case ArrayBufferItemType.Float: case ArrayBufferItemType.Float2: case ArrayBufferItemType.Float3: case ArrayBufferItemType.Float4: case ArrayBufferItemType.Float2x2: case ArrayBufferItemType.Float2x3: case ArrayBufferItemType.Float2x4: case ArrayBufferItemType.Float3x2: case ArrayBufferItemType.Float3x3: case ArrayBufferItemType.Float3x4: case ArrayBufferItemType.Float4x2: case ArrayBufferItemType.Float4x3: case ArrayBufferItemType.Float4x4: return(VertexBaseType.Float); case ArrayBufferItemType.Double: case ArrayBufferItemType.Double2: case ArrayBufferItemType.Double3: case ArrayBufferItemType.Double4: case ArrayBufferItemType.Double2x2: case ArrayBufferItemType.Double2x3: case ArrayBufferItemType.Double2x4: case ArrayBufferItemType.Double3x2: case ArrayBufferItemType.Double3x3: case ArrayBufferItemType.Double3x4: case ArrayBufferItemType.Double4x2: case ArrayBufferItemType.Double4x3: case ArrayBufferItemType.Double4x4: return(VertexBaseType.Double); case ArrayBufferItemType.Half: case ArrayBufferItemType.Half2: case ArrayBufferItemType.Half3: case ArrayBufferItemType.Half4: return(VertexBaseType.Half); default: throw new NotSupportedException("unsupported vertex array base type of " + vertexArrayType); } }
/// <summary> /// Determine whether a vertex array type is composed by floating-point value(s). /// </summary> public static bool IsFloatBaseType(this ArrayBufferItemType vertexArrayType) { return(vertexArrayType.GetVertexBaseType().IsFloatBaseType()); }
/// <summary> /// Get whether a <see cref="ArrayBufferItemType"/> is a vector type (vec2, vec3, ...). /// </summary> /// <param name="vertexArrayType"> /// A <see cref="ArrayBufferItemType"/> that describe the vertex array buffer item. /// </param> /// <returns> /// It returns a boolean value indicating whether <paramref name="vertexArrayType"/> is a vector type. /// </returns> public static bool IsArrayVectorType(this ArrayBufferItemType vertexArrayType) { return((vertexArrayType.GetArrayLength() > 1) && (vertexArrayType.GetArrayRank() == 1)); }
/// <summary> /// Get whether a <see cref="ArrayBufferItemType"/> is a matrix type (mat2, mat4, ...). /// </summary> /// <param name="vertexArrayType"> /// A <see cref="ArrayBufferItemType"/> that describe the vertex array buffer item. /// </param> /// <returns> /// It returns a boolean value indicating whether <paramref name="vertexArrayType"/> is a matrix type. /// </returns> public static bool IsArrayMatrixType(this ArrayBufferItemType vertexArrayType) { return(GetArrayRank(vertexArrayType) > 1); }
/// <summary> /// Construct an ArrayBufferItem from a <see cref="ArrayBufferItemType"/>. /// </summary> /// <param name="vertexArrayType"> /// A <see cref="ArrayBufferItemType"/> that synthetize all informations about a vertex array buffer item. /// </param> public ArrayBufferItem(ArrayBufferItemType vertexArrayType) { ArrayType = vertexArrayType; }
/// <summary> /// Get the rank of the vertex array buffer item (that is, the number of <i>vec4</i> attributes requires). /// </summary> /// <param name="vertexArrayType"> /// A <see cref="ArrayBufferItemType"/> that describe the vertex array buffer item. /// </param> /// <returns> /// It returns the rank of the vertex array buffer item. It will be a value /// from 1 (inclusive) to 4 (inclusive). For matrices, this value indicates the matrix width (column-major order), /// while for simpler types the value will be 1. /// </returns> public static uint GetArrayRank(this ArrayBufferItemType vertexArrayType) { switch (vertexArrayType) { case ArrayBufferItemType.Float2x2: case ArrayBufferItemType.Float3x2: case ArrayBufferItemType.Float4x2: case ArrayBufferItemType.Double2x2: case ArrayBufferItemType.Double3x2: case ArrayBufferItemType.Double4x2: return(2); case ArrayBufferItemType.Float2x3: case ArrayBufferItemType.Float3x3: case ArrayBufferItemType.Float4x3: case ArrayBufferItemType.Double2x3: case ArrayBufferItemType.Double3x3: case ArrayBufferItemType.Double4x3: return(3); case ArrayBufferItemType.Float2x4: case ArrayBufferItemType.Float3x4: case ArrayBufferItemType.Float4x4: case ArrayBufferItemType.Double2x4: case ArrayBufferItemType.Double3x4: case ArrayBufferItemType.Double4x4: return(4); case ArrayBufferItemType.Byte: case ArrayBufferItemType.UByte: case ArrayBufferItemType.Short: case ArrayBufferItemType.UShort: case ArrayBufferItemType.Int: case ArrayBufferItemType.UInt: case ArrayBufferItemType.Float: case ArrayBufferItemType.Double: case ArrayBufferItemType.Half: case ArrayBufferItemType.Byte2: case ArrayBufferItemType.UByte2: case ArrayBufferItemType.Short2: case ArrayBufferItemType.UShort2: case ArrayBufferItemType.Int2: case ArrayBufferItemType.UInt2: case ArrayBufferItemType.Float2: case ArrayBufferItemType.Double2: case ArrayBufferItemType.Half2: case ArrayBufferItemType.Byte3: case ArrayBufferItemType.UByte3: case ArrayBufferItemType.Short3: case ArrayBufferItemType.UShort3: case ArrayBufferItemType.Int3: case ArrayBufferItemType.UInt3: case ArrayBufferItemType.Float3: case ArrayBufferItemType.Double3: case ArrayBufferItemType.Half3: case ArrayBufferItemType.Byte4: case ArrayBufferItemType.UByte4: case ArrayBufferItemType.Short4: case ArrayBufferItemType.UShort4: case ArrayBufferItemType.Int4: case ArrayBufferItemType.UInt4: case ArrayBufferItemType.Float4: case ArrayBufferItemType.Double4: case ArrayBufferItemType.Half4: return(1); default: throw new NotSupportedException("unsupported vertex array rank of " + vertexArrayType); } }
/// <summary> /// Check whether a <see cref="VertexBaseType"/> is supported by current OpenGL implementation. /// </summary> /// <param name="ctx"> /// A <see cref="GraphicsContext"/> that specify the OpenGL implementation. /// </param> /// <param name="arrayType"> /// A <see cref="ArrayBufferItemType"/> to test for support. /// </param> /// <returns> /// It returns a boolean value indicating whether vertex attributes data can be specified with vertices having /// the base type <paramref name="arrayType"/>. /// </returns> public static bool IsDataSupported(GraphicsContext ctx, ArrayBufferItemType arrayType) { return(IsDataSupported(ctx, arrayType.GetVertexBaseType())); }
/// <summary> /// /// </summary> /// <param name="vertexArrayType"></param> public ArrayBufferItemAttribute(ArrayBufferItemType vertexArrayType) { ArrayBaseType = ArrayBufferItem.GetArrayBaseType(vertexArrayType); ArrayLength = ArrayBufferItem.GetArrayLength(vertexArrayType); ArrayRank = ArrayBufferItem.GetArrayRank(vertexArrayType); }
/// <summary> /// Create a strongly typed array following <see cref="ArrayBufferItemType"/>. /// </summary> /// <param name="itemCount"> /// A <see cref="uint"/> that specify the length of the array returned. /// </param> /// <returns> /// It returns an uninitialized array, strongly typed depending on <see cref="ArrayBufferItemType"/>, with /// the length equals to <paramref name="itemCount"/>. /// </returns> protected Array CreateArray(ArrayBufferItemType arrayBufferItemType, uint itemCount) { switch (arrayBufferItemType) { case ArrayBufferItemType.Byte: return(new sbyte[itemCount]); case ArrayBufferItemType.Byte2: return(new Vertex2b[itemCount]); case ArrayBufferItemType.Byte3: return(new Vertex3b[itemCount]); case ArrayBufferItemType.Byte4: return(new Vertex4b[itemCount]); case ArrayBufferItemType.UByte: return(new byte[itemCount]); case ArrayBufferItemType.UByte2: return(new Vertex2ub[itemCount]); case ArrayBufferItemType.UByte3: return(new Vertex3ub[itemCount]); case ArrayBufferItemType.UByte4: return(new Vertex4ub[itemCount]); case ArrayBufferItemType.Short: return(new short[itemCount]); case ArrayBufferItemType.Short2: return(new Vertex2s[itemCount]); case ArrayBufferItemType.Short3: return(new Vertex3s[itemCount]); case ArrayBufferItemType.Short4: return(new Vertex4s[itemCount]); case ArrayBufferItemType.UShort: return(new ushort[itemCount]); case ArrayBufferItemType.UShort2: return(new Vertex2us[itemCount]); case ArrayBufferItemType.UShort3: return(new Vertex3us[itemCount]); case ArrayBufferItemType.UShort4: return(new Vertex4us[itemCount]); case ArrayBufferItemType.Int: return(new int[itemCount]); case ArrayBufferItemType.Int2: return(new Vertex2i[itemCount]); case ArrayBufferItemType.Int3: return(new Vertex3i[itemCount]); case ArrayBufferItemType.Int4: return(new Vertex4i[itemCount]); case ArrayBufferItemType.UInt: return(new uint[itemCount]); case ArrayBufferItemType.UInt2: return(new Vertex2ui[itemCount]); case ArrayBufferItemType.UInt3: return(new Vertex3ui[itemCount]); case ArrayBufferItemType.UInt4: return(new Vertex4ui[itemCount]); case ArrayBufferItemType.Float: return(new float[itemCount]); case ArrayBufferItemType.Float2: return(new Vertex2f[itemCount]); case ArrayBufferItemType.Float3: return(new Vertex3f[itemCount]); case ArrayBufferItemType.Float4: return(new Vertex4f[itemCount]); case ArrayBufferItemType.Double: return(new double[itemCount]); case ArrayBufferItemType.Double2: return(new Vertex2d[itemCount]); case ArrayBufferItemType.Double3: return(new Vertex3d[itemCount]); case ArrayBufferItemType.Double4: return(new Vertex4d[itemCount]); case ArrayBufferItemType.Half: return(new HalfFloat[itemCount]); case ArrayBufferItemType.Half2: return(new Vertex2hf[itemCount]); case ArrayBufferItemType.Half3: return(new Vertex3hf[itemCount]); case ArrayBufferItemType.Half4: return(new Vertex4hf[itemCount]); default: throw new NotImplementedException($"array type {arrayBufferItemType} not yet implemented"); } }
/// <summary> /// Copy this array buffer object to another one (strongly typed), but having a different array item type. /// </summary> /// <typeparam name="T"> /// A structure type used to determine the array items layout of the converted ArrayBufferObject. /// </typeparam> /// <returns> /// It returns a copy of this ArrayBufferObject, but having a different array item. The returned instance is actually /// a <see cref="ArrayBufferObject"/>; if it is desiderable a strongly typed <see cref="ArrayBufferObject"/>, use /// <see cref="ConvertItemType"/>. /// </returns> /// <exception cref="ArgumentException"> /// Exception thrown if the array base type of this ArrayBufferObject (<see cref="ArrayBaseType"/>) is different to the one /// derived from <typeparamref name="T"/>. /// </exception> /// <exception cref="InvalidOperationException"> /// Exception thrown if the number of base components of this ArrayBufferObject cannot be mapped into the base components /// count derived from <typeparamref name="T"/>. /// </exception> public ArrayBufferObject <T> ConvertItemType <T>() where T : struct { ArrayBufferItemType vertexArrayType = ArrayBufferItem.GetArrayType(typeof(T)); return((ArrayBufferObject <T>)ConvertItemType(vertexArrayType)); }
/// <summary> /// Create an array buffer object, using the generic class <see cref="ArrayBufferObject{T}"/>, depending on a <see cref="ArrayBufferItemType"/>. /// </summary> /// <param name="vertexArrayType"> /// A <see cref="ArrayBufferItemType"/> that determine the generic argument of the created array buffer object. /// </param> /// <param name="hint"> /// A <see cref="BufferObjectHint"/> required for creating a <see cref="ArrayBufferObject"/>. /// </param> /// <returns> /// /// </returns> public static ArrayBufferObject CreateArrayObject(ArrayBufferItemType vertexArrayType, BufferObjectHint hint) { switch (vertexArrayType) { case ArrayBufferItemType.Byte: return(new ArrayBufferObject <sbyte>(hint)); case ArrayBufferItemType.Byte2: return(new ArrayBufferObject <Vertex2b>(hint)); case ArrayBufferItemType.Byte3: return(new ArrayBufferObject <Vertex3b>(hint)); case ArrayBufferItemType.Byte4: return(new ArrayBufferObject <Vertex4b>(hint)); case ArrayBufferItemType.UByte: return(new ArrayBufferObject <byte>(hint)); case ArrayBufferItemType.UByte2: return(new ArrayBufferObject <Vertex2ub>(hint)); case ArrayBufferItemType.UByte3: return(new ArrayBufferObject <Vertex3ub>(hint)); case ArrayBufferItemType.UByte4: return(new ArrayBufferObject <Vertex4ub>(hint)); case ArrayBufferItemType.Short: return(new ArrayBufferObject <short>(hint)); case ArrayBufferItemType.Short2: return(new ArrayBufferObject <Vertex2s>(hint)); case ArrayBufferItemType.Short3: return(new ArrayBufferObject <Vertex3s>(hint)); case ArrayBufferItemType.Short4: return(new ArrayBufferObject <Vertex4s>(hint)); case ArrayBufferItemType.UShort: return(new ArrayBufferObject <ushort>(hint)); case ArrayBufferItemType.UShort2: return(new ArrayBufferObject <Vertex2us>(hint)); case ArrayBufferItemType.UShort3: return(new ArrayBufferObject <Vertex3us>(hint)); case ArrayBufferItemType.UShort4: return(new ArrayBufferObject <Vertex4us>(hint)); case ArrayBufferItemType.Int: return(new ArrayBufferObject <Int32>(hint)); case ArrayBufferItemType.Int2: return(new ArrayBufferObject <Vertex2i>(hint)); case ArrayBufferItemType.Int3: return(new ArrayBufferObject <Vertex3i>(hint)); case ArrayBufferItemType.Int4: return(new ArrayBufferObject <Vertex4i>(hint)); case ArrayBufferItemType.UInt: return(new ArrayBufferObject <UInt32>(hint)); case ArrayBufferItemType.UInt2: return(new ArrayBufferObject <Vertex2ui>(hint)); case ArrayBufferItemType.UInt3: return(new ArrayBufferObject <Vertex3ui>(hint)); case ArrayBufferItemType.UInt4: return(new ArrayBufferObject <Vertex4ui>(hint)); case ArrayBufferItemType.Float: return(new ArrayBufferObject <Single>(hint)); case ArrayBufferItemType.Float2: return(new ArrayBufferObject <Vertex2f>(hint)); case ArrayBufferItemType.Float3: return(new ArrayBufferObject <Vertex3f>(hint)); case ArrayBufferItemType.Float4: return(new ArrayBufferObject <Vertex4f>(hint)); case ArrayBufferItemType.Float2x4: return(new ArrayBufferObject <Matrix2x4>(hint)); case ArrayBufferItemType.Float4x4: return(new ArrayBufferObject <Matrix4>(hint)); case ArrayBufferItemType.Double: return(new ArrayBufferObject <Double>(hint)); case ArrayBufferItemType.Double2: return(new ArrayBufferObject <Vertex2d>(hint)); case ArrayBufferItemType.Double3: return(new ArrayBufferObject <Vertex3d>(hint)); case ArrayBufferItemType.Double4: return(new ArrayBufferObject <Vertex4d>(hint)); case ArrayBufferItemType.Half: return(new ArrayBufferObject <HalfFloat>(hint)); case ArrayBufferItemType.Half2: return(new ArrayBufferObject <Vertex2hf>(hint)); case ArrayBufferItemType.Half3: return(new ArrayBufferObject <Vertex3hf>(hint)); case ArrayBufferItemType.Half4: return(new ArrayBufferObject <Vertex4hf>(hint)); default: throw new ArgumentException(String.Format("vertex array type {0} not supported", vertexArrayType)); } }