buffer.cpp 2.2 KB

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