buffer.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "buffer.h"
  2. namespace Render::GL {
  3. Buffer::Buffer(Type type) : m_type(type) {}
  4. Buffer::~Buffer() {
  5. if (m_buffer != 0) {
  6. glDeleteBuffers(1, &m_buffer);
  7. }
  8. }
  9. void Buffer::bind() {
  10. if (!m_buffer) {
  11. initializeOpenGLFunctions();
  12. glGenBuffers(1, &m_buffer);
  13. }
  14. glBindBuffer(getGLType(), m_buffer);
  15. }
  16. void Buffer::unbind() { glBindBuffer(getGLType(), 0); }
  17. void Buffer::setData(const void *data, size_t size, Usage usage) {
  18. bind();
  19. glBufferData(getGLType(), size, data, getGLUsage(usage));
  20. }
  21. GLenum Buffer::getGLType() const {
  22. switch (m_type) {
  23. case Type::Vertex:
  24. return GL_ARRAY_BUFFER;
  25. case Type::Index:
  26. return GL_ELEMENT_ARRAY_BUFFER;
  27. case Type::Uniform:
  28. return GL_UNIFORM_BUFFER;
  29. }
  30. return GL_ARRAY_BUFFER;
  31. }
  32. GLenum Buffer::getGLUsage(Usage usage) const {
  33. switch (usage) {
  34. case Usage::Static:
  35. return GL_STATIC_DRAW;
  36. case Usage::Dynamic:
  37. return GL_DYNAMIC_DRAW;
  38. case Usage::Stream:
  39. return GL_STREAM_DRAW;
  40. }
  41. return GL_STATIC_DRAW;
  42. }
  43. VertexArray::VertexArray() {}
  44. VertexArray::~VertexArray() {
  45. if (m_vao != 0) {
  46. glDeleteVertexArrays(1, &m_vao);
  47. }
  48. }
  49. void VertexArray::bind() {
  50. if (!m_vao) {
  51. initializeOpenGLFunctions();
  52. glGenVertexArrays(1, &m_vao);
  53. }
  54. glBindVertexArray(m_vao);
  55. }
  56. void VertexArray::unbind() { glBindVertexArray(0); }
  57. void VertexArray::addVertexBuffer(Buffer &buffer,
  58. const std::vector<int> &layout) {
  59. bind();
  60. buffer.bind();
  61. int stride = 0;
  62. for (int size : layout) {
  63. stride += size * sizeof(float);
  64. }
  65. int offset = 0;
  66. for (int size : layout) {
  67. glEnableVertexAttribArray(m_currentAttribIndex);
  68. glVertexAttribPointer(m_currentAttribIndex, size, GL_FLOAT, GL_FALSE,
  69. stride, reinterpret_cast<void *>(offset));
  70. offset += size * sizeof(float);
  71. m_currentAttribIndex++;
  72. }
  73. }
  74. void VertexArray::setIndexBuffer(Buffer &buffer) {
  75. bind();
  76. buffer.bind();
  77. }
  78. } // namespace Render::GL