#include "OpenGLVertexArray.h" #include "Plattform/OpenGL/OpenGLBuffer.h" #include "Deer/Log.h" #include "objload.h" #include "glad/glad.h" #include "GLFW/glfw3.h" namespace Deer { VertexArray* VertexArray::create() { return new OpenGLVertexArray(); } VertexArray* VertexArray::create(uint8_t* data, uint32_t size) { return new OpenGLVertexArray(data, size); } OpenGLVertexArray::OpenGLVertexArray() { glGenVertexArrays(1, &m_vertexArray); } OpenGLVertexArray::OpenGLVertexArray(uint8_t* data, uint32_t size) { Ref m_vertexBuffer; Ref m_uvBuffer; Ref m_normalBuffer; Ref m_indexBuffer; obj::Model model = obj::loadModelFromString((char*)data); std::vector& triangles = model.faces.at("default"); glGenVertexArrays(1, &m_vertexArray); m_vertexBuffer = VertexBuffer::create(&model.vertex[0], model.vertex.size() * sizeof(float)); BufferLayout vertexbufferLayout({ {"a_Position", DataType::Float3, ShaderDataType::FloatingPoint } }); m_vertexBuffer->setLayout(vertexbufferLayout); addVertexBuffer(m_vertexBuffer); m_uvBuffer = VertexBuffer::create(&model.texCoord[0], model.texCoord.size() * sizeof(float)); BufferLayout uvbufferLayout({ {"a_uv", DataType::Float2, ShaderDataType::FloatingPoint } }); m_uvBuffer->setLayout(uvbufferLayout); addVertexBuffer(m_uvBuffer); m_normalBuffer = VertexBuffer::create(&model.normal[0], model.normal.size() * sizeof(float)); BufferLayout normalBufferLayout({ {"a_normal", DataType::Float3, ShaderDataType::NormalizedFloatingPoint } }); m_normalBuffer->setLayout(normalBufferLayout); addVertexBuffer(m_normalBuffer); m_indexBuffer = IndexBuffer::create(&triangles[0], triangles.size() * sizeof(unsigned short), IndexDataType::Unsigned_Short); setIndexBuffer(m_indexBuffer); } OpenGLVertexArray::~OpenGLVertexArray() { glDeleteVertexArrays(1, &m_vertexArray); } void OpenGLVertexArray::bind() const { glBindVertexArray(m_vertexArray); } void OpenGLVertexArray::unbind() const { glBindVertexArray(0); } void OpenGLVertexArray::addVertexBuffer(const Ref& vertexBuffer) { if (vertexBuffer->getLayout().getElements().size() == 0) DEER_CORE_ERROR("Vertex buffer has no layout"); glBindVertexArray(m_vertexArray); vertexBuffer->bind(); BufferLayout& layout = vertexBuffer->getLayout(); for (auto& element : layout) { glEnableVertexAttribArray(index); switch (element.shaderType) { case ShaderDataType::None: DEER_CORE_ERROR("Shader datas type none not suported!"); break; case ShaderDataType::FloatingPoint: glVertexAttribPointer(index, dataTypeCount(element.type), getOpenGLDataType(element.type), GL_FALSE, layout.getStride(), (const void*)(uint64_t)element.offset); break; case ShaderDataType::NormalizedFloatingPoint: glVertexAttribPointer(index, dataTypeCount(element.type), getOpenGLDataType(element.type), GL_TRUE, layout.getStride(), (const void*)(uint64_t)element.offset); break; case ShaderDataType::Integer: glVertexAttribIPointer(index, dataTypeCount(element.type), getOpenGLDataType(element.type), layout.getStride(), (const void*)(uint64_t)element.offset); break; } index++; } m_vertexBuffers.push_back(vertexBuffer); } void OpenGLVertexArray::setIndexBuffer(const Ref& indexBuffer) { glBindVertexArray(m_vertexArray); indexBuffer->bind(); m_indexBuffer = indexBuffer; } }