1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
void OpenGLVertexArray::AddVertexBuffer(const X::Ref<VertexBuffer>& vertexBuffer) { X_PROFILE_FUNCTION(); X_CORE_ASSERT(vertexBuffer->GetLayout().GetElements().size(), "Vertex Buffer has no layout!"); glBindVertexArray(m_rendererID); vertexBuffer->Bind();
const auto& layout = vertexBuffer->GetLayout(); for (const auto& element : layout) { switch (element.type) { case ShaderDataType::kFloat: case ShaderDataType::kFloat2: case ShaderDataType::kFloat3: case ShaderDataType::kFloat4: { glEnableVertexAttribArray(m_vertexBufferIndex); glVertexAttribPointer( m_vertexBufferIndex, element.GetComponentCount(), ShaderDataTypeToOpenGLBaseType(element.type), element.normalized ? GL_TRUE : GL_FALSE, layout.GetStride(), reinterpret_cast<const void*>(element.offset) ); m_vertexBufferIndex++; break; } case ShaderDataType::kInt: case ShaderDataType::kInt2: case ShaderDataType::kInt3: case ShaderDataType::kInt4: case ShaderDataType::kBool: { glEnableVertexAttribArray(m_vertexBufferIndex); glVertexAttribIPointer(m_vertexBufferIndex, element.GetComponentCount(), ShaderDataTypeToOpenGLBaseType(element.type), layout.GetStride(), reinterpret_cast<const void*>(element.offset)); m_vertexBufferIndex++; break; } case ShaderDataType::kMat3: case ShaderDataType::kMat4: { uint8_t count = element.GetComponentCount(); for (uint8_t i = 0; i < count; i++) { glEnableVertexAttribArray(m_vertexBufferIndex); glVertexAttribPointer(m_vertexBufferIndex, count, ShaderDataTypeToOpenGLBaseType(element.type), element.normalized ? GL_TRUE : GL_FALSE, layout.GetStride(), reinterpret_cast<const void*>(element.offset + sizeof(float) * count * i)); glVertexAttribDivisor(m_vertexBufferIndex, 1); m_vertexBufferIndex++; } break; } default: X_CORE_ASSERT(false, "Unknown ShaderDataType!"); } } m_vertexBuffers.push_back(vertexBuffer); }
|