#include "Renderer.hpp" RenderObject::RenderObject(GpuMesh* mesh, Material* material) { glGenVertexArrays(1, &mVao); glBindVertexArray(mVao); auto& vf = mesh->vertFormat; auto& vBindings = mesh->vertBufBindings.bindings; auto& shaderInfo = material->GetShader()->GetInfo(); // Setup vertex buffers for (auto& elm : vf->elements) { assert(elm.bindingIndex < vBindings.size()); auto& buffer = vBindings[elm.bindingIndex]; int index = material->GetShader()->GetInfo().FindInputLocation(elm.semantic); glBindBuffer(GL_ARRAY_BUFFER, buffer->handle); glEnableVertexAttribArray(index); glVertexAttribPointer( index, Tags::VectorLenOf(elm.type), Tags::FindGLType(elm.type), Tags::IsNormalized(elm.type), vf->vertexSize, (void*)(uintptr_t)elm.offset); } // Setup index buffer glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->indexBuf->handle); glBindVertexArray(GL_NONE); } RenderObject::~RenderObject() { glDeleteVertexArrays(1, &mVao); } void Renderer::Draw(RenderObject& object) { auto indexType = object.GetMesh()->indexBuf->indexType; glBindVertexArray(object.GetGLVao()); glDrawElements(GL_TRIANGLES, 0, Tags::FindGLType(indexType), 0); }