#include
#include |
namespace td {
namespace GL {
VertexArray::~VertexArray() {
if (m_ID != 0)
glDeleteVertexArrays(1, &m_ID);
}
VertexArray::VertexArray(ElementBuffer&& indicies) : m_ElementBuffer(std::move(indicies)) {
glGenVertexArrays(1, &m_ID);
Bind();
BindElementArrayBuffer();
// Unbind();
}
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));
}
void VertexArray::BindElementArrayBuffer() {
m_ElementBuffer.Bind();
}
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 {
.m_Index = index,
.m_Size = coordinateSize,
.m_Offset = offset
};
m_VertexAttribs.push_back(pointer);
}
void VertexBuffer::BindVertexAttribs() const {
for (const VertexAttribPointer& pointer : m_VertexAttribs) {
glVertexAttribPointer(pointer.m_Index, static_cast(pointer.m_Size), GL_FLOAT, false, m_DataStride * sizeof(float),
reinterpret_cast(static_cast(pointer.m_Offset)));
glEnableVertexAttribArray(pointer.m_Index);
}
}
ElementBuffer::ElementBuffer(const std::vector& indicies) {
m_TriangleCount = indicies.size();
glGenBuffers(1, &m_ID);
Bind();
glBufferData(GL_ELEMENT_ARRAY_BUFFER, static_cast(indicies.size() * sizeof(unsigned int)), nullptr, GL_STATIC_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, static_cast(indicies.size() * sizeof(unsigned int)), indicies.data());
Unbind();
}
ElementBuffer::~ElementBuffer() {
if (m_ID != 0)
glDeleteBuffers(1, &m_ID);
}
void ElementBuffer::Bind() const {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ID);
}
void ElementBuffer::Unbind() const {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
} // namespace GL
} // namespace td |