// 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); }
public void SetLayout(BufferLayout layout) => this.layout = layout;