/// <summary>
		/// 
		/// </summary>
		/// <param name="vertexArrayType"></param>
		public ArrayBufferItemAttribute(ArrayBufferItemType vertexArrayType)
		{
			mArrayType = ArrayBufferItem.GetArrayBaseType(vertexArrayType);
			mArrayLength = ArrayBufferItem.GetArrayLength(vertexArrayType);
			mArrayRank = ArrayBufferItem.GetArrayRank(vertexArrayType);
		}
Пример #2
0
        /// <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);
            }
        }
Пример #3
0
 /// <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());
 }
Пример #4
0
 /// <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));
 }
Пример #5
0
 /// <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);
 }
Пример #6
0
 /// <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;
 }
Пример #7
0
        /// <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);
            }
        }
Пример #8
0
 /// <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);
 }
Пример #10
0
        /// <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");
            }
        }
Пример #11
0
        /// <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));
        }
Пример #12
0
        /// <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));
            }
        }