ColorRenderer.java 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package me.hammerle.snuviengine.api;
  2. import java.nio.ByteBuffer;
  3. import org.lwjgl.BufferUtils;
  4. import static org.lwjgl.opengl.GL11.*;
  5. import static org.lwjgl.opengl.GL15.*;
  6. import static org.lwjgl.opengl.GL20.*;
  7. import static org.lwjgl.opengl.GL30.*;
  8. public class ColorRenderer
  9. {
  10. private int vao;
  11. private int vbo;
  12. private ByteBuffer buffer = BufferUtils.createByteBuffer(48);
  13. private final static int BUFFER_BYTE_LENGTH = 1024 * 1024;
  14. private final static int OBJECT_LENGTH = 64;
  15. private int offset = BUFFER_BYTE_LENGTH - OBJECT_LENGTH;
  16. private float depth = 0.0f;
  17. protected ColorRenderer()
  18. {
  19. Shader.addTask(() ->
  20. {
  21. vao = glGenVertexArrays();
  22. vbo = glGenBuffers();
  23. GLHelper.glBindVertexArray(vao);
  24. GLHelper.glBindBuffer(vbo);
  25. glEnableVertexAttribArray(0);
  26. glEnableVertexAttribArray(2);
  27. glVertexAttribPointer(0, 3, GL_FLOAT, false, 16, 0);
  28. glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, true, 16, 12);
  29. });
  30. }
  31. public void setDepth(float depth)
  32. {
  33. this.depth = depth;
  34. }
  35. public void drawRectangle(float minX, float minY, float maxX, float maxY, int color)
  36. {
  37. GLHelper.glBindBuffer(vbo);
  38. offset += OBJECT_LENGTH;
  39. if(offset + OBJECT_LENGTH >= BUFFER_BYTE_LENGTH)
  40. {
  41. offset = 0;
  42. glBufferData(GL_ARRAY_BUFFER, BUFFER_BYTE_LENGTH, GL_STREAM_DRAW);
  43. }
  44. buffer = glMapBufferRange(GL_ARRAY_BUFFER, offset, OBJECT_LENGTH, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT, buffer);
  45. if(buffer == null)
  46. {
  47. return;
  48. }
  49. float fcolor = Float.intBitsToFloat(color);
  50. buffer.putFloat(minX);
  51. buffer.putFloat(maxY);
  52. buffer.putFloat(depth);
  53. buffer.putFloat(fcolor);
  54. buffer.putFloat(minX);
  55. buffer.putFloat(minY);
  56. buffer.putFloat(depth);
  57. buffer.putFloat(fcolor);
  58. buffer.putFloat(maxX);
  59. buffer.putFloat(maxY);
  60. buffer.putFloat(depth);
  61. buffer.putFloat(fcolor);
  62. buffer.putFloat(maxX);
  63. buffer.putFloat(minY);
  64. buffer.putFloat(depth);
  65. buffer.putFloat(fcolor);
  66. buffer.flip();
  67. glUnmapBuffer(GL_ARRAY_BUFFER);
  68. GLHelper.glBindVertexArray(vao);
  69. glDrawArrays(GL_TRIANGLE_STRIP, offset / 16, 4);
  70. }
  71. }