buffer.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. #ifndef NDEBUG
  59. GLenum genErr = glGetError();
  60. if (genErr != GL_NO_ERROR) {
  61. qWarning() << "VertexArray glGenVertexArrays error" << genErr;
  62. }
  63. #endif
  64. }
  65. #ifndef NDEBUG
  66. while (glGetError() != GL_NO_ERROR) {
  67. }
  68. #endif
  69. glBindVertexArray(m_vao);
  70. #ifndef NDEBUG
  71. GLenum bindErr = glGetError();
  72. if (bindErr != GL_NO_ERROR) {
  73. qWarning() << "VertexArray glBindVertexArray error" << bindErr << "vao"
  74. << m_vao;
  75. }
  76. #endif
  77. }
  78. void VertexArray::unbind() { glBindVertexArray(0); }
  79. void VertexArray::add_vertexBuffer(Buffer &buffer,
  80. const std::vector<int> &layout) {
  81. bind();
  82. buffer.bind();
  83. int stride = 0;
  84. for (int const size : layout) {
  85. stride += size * sizeof(float);
  86. }
  87. int offset = 0;
  88. for (int const size : layout) {
  89. glEnableVertexAttribArray(m_currentAttribIndex);
  90. glVertexAttribPointer(m_currentAttribIndex, size, GL_FLOAT, GL_FALSE,
  91. stride, reinterpret_cast<void *>(offset));
  92. offset += size * sizeof(float);
  93. m_currentAttribIndex++;
  94. }
  95. }
  96. void VertexArray::set_index_buffer(Buffer &buffer) {
  97. bind();
  98. buffer.bind();
  99. }
  100. } // namespace Render::GL