Exemplo n.º 1
0
        // every buffer needs it's layout now!
        public unsafe void AddVertexBuffer(VertexBuffer vb)
        {
            if (vb.GetLayout() == null || vb.GetLayout().GetElements().Length == 0)
            {
                Log.Core.Error("vertex buffer has no layout");
                return;
            }

            glBindVertexArray(id);
            vb.Bind();

            BufferElement[] elements = vb.GetLayout().GetElements();
            BufferLayout    layout   = vb.GetLayout();

            // when giving type to attrib pointer we need the BASE type
            for (int i = 0; i < elements.Length; i++)
            {
                switch (elements[i].type)
                {
                case ShaderDataType.Float:
                case ShaderDataType.Float2:
                case ShaderDataType.Float3:
                case ShaderDataType.Float4:
                {
                    glEnableVertexAttribArray(vertexBufferIndex);
                    glVertexAttribPointer(vertexBufferIndex, (int)elements[i].GetComponentCount(), BufferElement.ShaderDataTypeToBaseType(elements[i].type), elements[i].normalized, (int)layout.GetStride(), (void *)elements[i].offset);

                    glVertexAttribDivisor(vertexBufferIndex, elements[i].divisor);

                    vertexBufferIndex++;
                    break;
                }

                case ShaderDataType.Int:
                case ShaderDataType.Int2:
                case ShaderDataType.Int3:
                case ShaderDataType.Int4:
                case ShaderDataType.Bool:
                {
                    glEnableVertexAttribArray(vertexBufferIndex);
                    // be aware of the I in the glVertexAttribIPointer
                    glVertexAttribIPointer(vertexBufferIndex, (int)elements[i].GetComponentCount(), BufferElement.ShaderDataTypeToBaseType(elements[i].type), (int)layout.GetStride(), (void *)elements[i].offset);

                    glVertexAttribDivisor(vertexBufferIndex, elements[i].divisor);

                    vertexBufferIndex++;
                    break;
                }

                case ShaderDataType.Mat3:
                case ShaderDataType.Mat4:
                {
                    uint count = elements[i].GetComponentCount();
                    for (uint c = 0; c < count; c++)
                    {
                        glEnableVertexAttribArray(vertexBufferIndex);
                        glVertexAttribPointer(vertexBufferIndex, (int)count, BufferElement.ShaderDataTypeToBaseType(elements[i].type), elements[i].normalized, (int)layout.GetStride(), (void *)(elements[i].offset + sizeof(float) * count * c));

                        glVertexAttribDivisor(vertexBufferIndex, elements[i].divisor);

                        vertexBufferIndex++;
                    }
                    break;
                }

                default: Log.Core.Error("unknow shader data type"); break;
                }
            }

            vertexBuffers.Add(vb);
        }
Exemplo n.º 2
0
 public void SetLayout(BufferLayout layout) => this.layout = layout;