DirectTextureRenderer.java 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 DirectTextureRenderer
  9. {
  10. private int vao;
  11. private int vbo;
  12. private ByteBuffer buffer = BufferUtils.createByteBuffer(OBJECT_LENGTH);
  13. private final static int BUFFER_BYTE_LENGTH = 1024 * 1024;
  14. private final static int OBJECT_LENGTH = 80;
  15. private int offset = BUFFER_BYTE_LENGTH - OBJECT_LENGTH;
  16. private float depth = 0.0f;
  17. protected DirectTextureRenderer()
  18. {
  19. Shader.addTask(() ->
  20. {
  21. vao = glGenVertexArrays();
  22. vbo = glGenBuffers();
  23. GLHelper.glBindVertexArray(vao);
  24. GLHelper.glBindBuffer(vbo);
  25. glEnableVertexAttribArray(0);
  26. glVertexAttribPointer(0, 3, GL_FLOAT, false, 20, 0);
  27. glEnableVertexAttribArray(1);
  28. glVertexAttribPointer(1, 2, GL_FLOAT, false, 20, 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, float tMinX, float tMinY, float tMaxX, float tMaxY)
  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. buffer.putFloat(minX);
  50. buffer.putFloat(maxY);
  51. buffer.putFloat(depth);
  52. buffer.putFloat(tMinX);
  53. buffer.putFloat(tMaxY);
  54. buffer.putFloat(minX);
  55. buffer.putFloat(minY);
  56. buffer.putFloat(depth);
  57. buffer.putFloat(tMinX);
  58. buffer.putFloat(tMinY);
  59. buffer.putFloat(maxX);
  60. buffer.putFloat(maxY);
  61. buffer.putFloat(depth);
  62. buffer.putFloat(tMaxX);
  63. buffer.putFloat(tMaxY);
  64. buffer.putFloat(maxX);
  65. buffer.putFloat(minY);
  66. buffer.putFloat(depth);
  67. buffer.putFloat(tMaxX);
  68. buffer.putFloat(tMinY);
  69. buffer.flip();
  70. glUnmapBuffer(GL_ARRAY_BUFFER);
  71. GLHelper.glBindVertexArray(vao);
  72. glDrawArrays(GL_TRIANGLE_STRIP, offset / 20, 4);
  73. }
  74. }