buffer.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "buffer.h"
  2. #include <GL/gl.h>
  3. #include <QDebug>
  4. #include <cstddef>
  5. #include <qopenglext.h>
  6. #include <vector>
  7. namespace Render::GL {
  8. Buffer::Buffer(Type type) : m_type(type) {}
  9. Buffer::~Buffer() {
  10. if (m_buffer != 0) {
  11. glDeleteBuffers(1, &m_buffer);
  12. }
  13. }
  14. void Buffer::bind() {
  15. if (m_buffer == 0U) {
  16. initializeOpenGLFunctions();
  17. glGenBuffers(1, &m_buffer);
  18. }
  19. glBindBuffer(get_gl_type(), m_buffer);
  20. }
  21. void Buffer::unbind() { glBindBuffer(get_gl_type(), 0); }
  22. void Buffer::set_data(const void *data, size_t size, Usage usage) {
  23. bind();
  24. glBufferData(get_gl_type(), size, data, get_gl_usage(usage));
  25. }
  26. auto Buffer::get_gl_type() const -> GLenum {
  27. switch (m_type) {
  28. case Type::Vertex:
  29. return GL_ARRAY_BUFFER;
  30. case Type::Index:
  31. return GL_ELEMENT_ARRAY_BUFFER;
  32. case Type::Uniform:
  33. return GL_UNIFORM_BUFFER;
  34. }
  35. return GL_ARRAY_BUFFER;
  36. }
  37. auto Buffer::get_gl_usage(Usage usage) -> GLenum {
  38. switch (usage) {
  39. case Usage::Static:
  40. return GL_STATIC_DRAW;
  41. case Usage::Dynamic:
  42. return GL_DYNAMIC_DRAW;
  43. case Usage::Stream:
  44. return GL_STREAM_DRAW;
  45. }
  46. return GL_STATIC_DRAW;
  47. }
  48. VertexArray::VertexArray() = default;
  49. VertexArray::~VertexArray() {
  50. if (m_vao != 0) {
  51. glDeleteVertexArrays(1, &m_vao);
  52. }
  53. }
  54. void VertexArray::bind() {
  55. if (m_vao == 0U) {
  56. initializeOpenGLFunctions();
  57. glGenVertexArrays(1, &m_vao);
  58. GLenum genErr = glGetError();
  59. if (genErr != GL_NO_ERROR) {
  60. qWarning() << "VertexArray glGenVertexArrays error" << genErr;
  61. }
  62. }
  63. while (glGetError() != GL_NO_ERROR) {
  64. }
  65. glBindVertexArray(m_vao);
  66. GLenum bindErr = glGetError();
  67. if (bindErr != GL_NO_ERROR) {
  68. qWarning() << "VertexArray glBindVertexArray error" << bindErr << "vao"
  69. << m_vao;
  70. }
  71. }
  72. void VertexArray::unbind() { glBindVertexArray(0); }
  73. void VertexArray::add_vertexBuffer(Buffer &buffer,
  74. const std::vector<int> &layout) {
  75. bind();
  76. buffer.bind();
  77. int stride = 0;
  78. for (int const size : layout) {
  79. stride += size * sizeof(float);
  80. }
  81. int offset = 0;
  82. for (int const size : layout) {
  83. glEnableVertexAttribArray(m_currentAttribIndex);
  84. glVertexAttribPointer(m_currentAttribIndex, size, GL_FLOAT, GL_FALSE,
  85. stride, reinterpret_cast<void *>(offset));
  86. offset += size * sizeof(float);
  87. m_currentAttribIndex++;
  88. }
  89. }
  90. void VertexArray::set_index_buffer(Buffer &buffer) {
  91. bind();
  92. buffer.bind();
  93. }
  94. } // namespace Render::GL