StreamBuffer.cpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include <GL/glew.h>
  2. #include <cassert>
  3. #include <cstring>
  4. #include "rendering/wrapper/StreamBuffer.h"
  5. StreamBuffer::StreamBuffer(uint size, uint bytesPerVertex) :
  6. bufferSize(size), offset(size), bytesPerVertex(bytesPerVertex), index(0), buffer(nullptr) {
  7. }
  8. void StreamBuffer::reset(uint size) {
  9. if(offset + size >= bufferSize) {
  10. offset = 0;
  11. glBufferData(GL_ARRAY_BUFFER, bufferSize, nullptr, GL_STREAM_DRAW);
  12. }
  13. buffer = static_cast<u8*> (glMapBufferRange(GL_ARRAY_BUFFER, offset, size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT));
  14. assert(buffer != nullptr);
  15. index = 0;
  16. }
  17. StreamBuffer& StreamBuffer::add(float f) {
  18. memcpy(buffer + index, &f, sizeof (f));
  19. index += sizeof (f);
  20. return *this;
  21. }
  22. StreamBuffer& StreamBuffer::addReversed(u32 i) {
  23. buffer[index++] = i >> 24;
  24. buffer[index++] = i >> 16;
  25. buffer[index++] = i >> 8;
  26. buffer[index++] = i >> 0;
  27. return *this;
  28. }
  29. void StreamBuffer::draw() {
  30. glUnmapBuffer(GL_ARRAY_BUFFER);
  31. glDrawArrays(GL_TRIANGLE_STRIP, offset / bytesPerVertex, index / bytesPerVertex);
  32. offset += index;
  33. }