示例#1
0
        /// <summary>
        /// Standard constructor for vertex buffers
        /// </summary>
        /// <param name="desc">VertexBufferDescriptor which describes each element in the structure T</param>
        /// <exception cref="InvalidCastException">Throws InvalidCastException if VertexBufferDescriptor describes anything other that T
        /// </exception>
        public VertexBuffer(VertexBufferDescriptor desc)
            : base()
        {
            uint[] arr = new uint[1];
            OpenGL.glGenVertexArrays(1, arr);
            vertex_array = arr[0];
            target       = (uint)VboTarget.GL_ARRAY_BUFFER;
            if (typeof(T) != desc.Type)
            {
                throw new InvalidCastException("Vertex buffer descriptor does not describe contained type");
            }
            this.desc = desc;
            int offset   = 0;
            int tot_size = desc.Types.Count() == 1 ? 0 : desc.TotalSize;

            initialize = new List <Action <VertexBuffer <T> .ElementInfo> >();
            elements   = new List <VertexBuffer <T> .ElementInfo>();
            types      = new List <uint>();
            uint gl_datatype = 0;



            foreach (var el in desc.Types)
            {
                int         tt = (int)el;
                ElementType type;
                int         size;
                ElementType data_type;
                data_type = (ElementType)(tt & 0x00003000);
                type      = (ElementType)(tt & 0xf);
                int dim  = (tt & 0x00000ff0) >> 4;
                int bits = ((tt & 0x00ff0000) >> 16);
                size = dim * bits;

                uint ch = ((uint)el & 0xff000000) >> 24;

                if (bits == 2 && data_type == ElementType.Integer)
                {
                    gl_datatype = (uint)OpenGL.Const.GL_SHORT;
                }
                else if (bits == 4 && data_type == ElementType.Integer)
                {
                    gl_datatype = (uint)OpenGL.Const.GL_INT;
                }
                else if (bits == 2 && data_type == ElementType.Float)
                {
                    gl_datatype = OpenGL.Const.GL_HALF_FLOAT;
                }
                else if (bits == 4 && data_type == ElementType.Float)
                {
                    gl_datatype = (uint)OpenGL.Const.GL_FLOAT;
                }
                else if (bits == 8 && data_type == ElementType.Float)
                {
                    gl_datatype = (uint)OpenGL.Const.GL_DOUBLE;
                }



                elements.Add(new VertexBuffer <T> .ElementInfo()
                {
                    dimensions   = dim,
                    gl_type      = gl_datatype,
                    offset_value = new IntPtr(offset),
                    channel      = ch,
                    attribute    = 0xffffffff
                });

                /*switch (type)
                 * {
                 *      case ElementType.Position:
                 *              initialize.Add(new Action<ElementInfo>(SetVertexPointer));
                 *              types.Add(OpenGL.Const.GL_VERTEX_ARRAY);
                 *              break;
                 *      case ElementType.Normals:
                 *              initialize.Add(new Action<ElementInfo>(SetNormalPointer));
                 *              types.Add(OpenGL.Const.GL_NORMAL_ARRAY);
                 *              break;
                 *      case ElementType.TexCoord:
                 *              initialize.Add(new Action<ElementInfo>(SetTexCoordPointer));
                 *              types.Add(OpenGL.Const.GL_TEXTURE_COORD_ARRAY);
                 *              break;
                 *      case ElementType.Color:
                 *              initialize.Add(new Action<ElementInfo>(SetColorPointer));
                 *              types.Add(OpenGL.Const.GL_COLOR_ARRAY);
                 *              break;
                 *      default:
                 *              initialize.Add(null);
                 *              types.Add(0);
                 *              break;
                 *
                 * }*/

                offset += size;
            }
        }