/* * GLLoader.cpp * * Created on: 4 nov. 2020 * Author: simon */ #include "render/loader/GLLoader.h" #include "render/GL.h" #include namespace GL { VertexArray::~VertexArray() { if (m_ID != 0) glDeleteVertexArrays(1, &m_ID); } VertexArray::VertexArray(unsigned int vertexCount) : m_VertexCount(vertexCount) { glGenVertexArrays(1, &m_ID); } void VertexArray::Bind() const { glBindVertexArray(m_ID); } void VertexArray::Unbind() const { glBindVertexArray(0); } void VertexArray::BindVertexBuffer(VertexBuffer& VertexBuffer) { VertexBuffer.Bind(); VertexBuffer.BindVertexAttribs(); m_VertexBuffers.push_back(std::move(VertexBuffer)); } VertexBuffer::~VertexBuffer() { if (m_ID != 0) glDeleteBuffers(1, &m_ID); } VertexBuffer::VertexBuffer(const std::vector& data, unsigned int stride) : m_DataStride(stride) { glGenBuffers(1, &m_ID); Bind(); glBufferData(GL_ARRAY_BUFFER, static_cast(data.size() * sizeof(float)), nullptr, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, static_cast(data.size() * sizeof(float)), data.data()); Unbind(); } void VertexBuffer::Bind() const { glBindBuffer(GL_ARRAY_BUFFER, m_ID); } void VertexBuffer::Unbind() const { glBindBuffer(GL_ARRAY_BUFFER, 0); } void VertexBuffer::AddVertexAttribPointer(unsigned int index, unsigned int coordinateSize, unsigned int offset) { VertexAttribPointer pointer; pointer.m_Index = index; pointer.m_Size = coordinateSize; pointer.m_Offset = offset; m_VertexAttribs.push_back(pointer); } void VertexBuffer::BindVertexAttribs() const { for (const VertexAttribPointer& pointer : m_VertexAttribs) { glEnableVertexAttribArray(pointer.m_Index); glVertexAttribPointer(pointer.m_Index, static_cast(pointer.m_Size), GL_FLOAT, false, m_DataStride * sizeof(float), reinterpret_cast(pointer.m_Offset)); } } Texture::Texture(const char* textureData, int width, int height, int comp) { glGenTextures(1, &m_ID); Bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); assert(comp == 3 || comp == 4); if (comp == 3) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textureData); else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); Unbind(); } Texture::~Texture() { glDeleteTextures(1, &m_ID); } void Texture::Bind() const { glBindTexture(GL_TEXTURE_2D, m_ID); } void Texture::Unbind() { glBindTexture(GL_TEXTURE_2D, 0); } }