| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #include "buffer.h"
- namespace Render::GL {
- Buffer::Buffer(Type type) : m_type(type) {
- initializeOpenGLFunctions();
- glGenBuffers(1, &m_buffer);
- }
- Buffer::~Buffer() {
- if (m_buffer != 0) {
- glDeleteBuffers(1, &m_buffer);
- }
- }
- void Buffer::bind() {
- glBindBuffer(getGLType(), m_buffer);
- }
- void Buffer::unbind() {
- glBindBuffer(getGLType(), 0);
- }
- void Buffer::setData(const void* data, size_t size, Usage usage) {
- bind();
- glBufferData(getGLType(), size, data, getGLUsage(usage));
- }
- GLenum Buffer::getGLType() const {
- switch (m_type) {
- case Type::Vertex: return GL_ARRAY_BUFFER;
- case Type::Index: return GL_ELEMENT_ARRAY_BUFFER;
- case Type::Uniform: return GL_UNIFORM_BUFFER;
- }
- return GL_ARRAY_BUFFER;
- }
- GLenum Buffer::getGLUsage(Usage usage) const {
- switch (usage) {
- case Usage::Static: return GL_STATIC_DRAW;
- case Usage::Dynamic: return GL_DYNAMIC_DRAW;
- case Usage::Stream: return GL_STREAM_DRAW;
- }
- return GL_STATIC_DRAW;
- }
- // VertexArray implementation
- VertexArray::VertexArray() {
- initializeOpenGLFunctions();
- glGenVertexArrays(1, &m_vao);
- }
- VertexArray::~VertexArray() {
- if (m_vao != 0) {
- glDeleteVertexArrays(1, &m_vao);
- }
- }
- void VertexArray::bind() {
- glBindVertexArray(m_vao);
- }
- void VertexArray::unbind() {
- glBindVertexArray(0);
- }
- void VertexArray::addVertexBuffer(Buffer& buffer, const std::vector<int>& layout) {
- bind();
- buffer.bind();
-
- int stride = 0;
- for (int size : layout) {
- stride += size * sizeof(float);
- }
-
- int offset = 0;
- for (int size : layout) {
- glEnableVertexAttribArray(m_currentAttribIndex);
- glVertexAttribPointer(m_currentAttribIndex, size, GL_FLOAT, GL_FALSE,
- stride, reinterpret_cast<void*>(offset));
- offset += size * sizeof(float);
- m_currentAttribIndex++;
- }
- }
- void VertexArray::setIndexBuffer(Buffer& buffer) {
- bind();
- buffer.bind();
- }
- } // namespace Render::GL
|