buffer.cpp 2.0 KB

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