#include #include #include "engine/renderer/mesh.h" namespace Core { Mesh::Mesh(const std::string& name) : m_materialName(name.c_str()) { std::cout << "Mesh init" << std::endl; // m_vao = 0; // m_vbo = 0; m_ebo = 0; // glGenVertexArrays(1, &m_vao); // glGenBuffers(1, &m_vbo); glGenBuffers(1, &m_ebo); Bind(); SetupVertexBuffer(GL_DYNAMIC_DRAW); // EBO (index buffer) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, 0, nullptr, GL_DYNAMIC_DRAW); // attributes glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast(offsetof(Vertex, position))); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast(offsetof(Vertex, normal))); glEnableVertexAttribArray(1); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast(offsetof(Vertex, uv))); glEnableVertexAttribArray(2); // TODO: delete after ebo moved in VertexArray // glBindBuffer(GL_DYNAMIC_DRAW, 0); Unbind(); } void Mesh::Upload() { Bind(); VertexBufferData(m_vertexBuffer.size() * sizeof(Vertex), m_vertexBuffer.data()); // Upload indices glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer.size() * sizeof(unsigned int), m_indexBuffer.data(), GL_DYNAMIC_DRAW); // TODO: delete after ebo moved in VertexArray // glBindBuffer(GL_DYNAMIC_DRAW, 0); Unbind(); } void Mesh::Render(unsigned int count) { Bind(); if (count > 1) { glDrawElementsInstanced(GL_TRIANGLES, static_cast(m_indexBuffer.size()), GL_UNSIGNED_INT, 0, count); } else { glDrawElements(GL_TRIANGLES, static_cast(m_indexBuffer.size()), GL_UNSIGNED_INT, 0); } Unbind(); } }