DirectTextureRenderer.java 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package me.hammerle.snuviengine.api;
  2. import java.nio.ByteBuffer;
  3. import static org.lwjgl.opengl.GL11.*;
  4. import static org.lwjgl.opengl.GL15.*;
  5. import static org.lwjgl.opengl.GL20.*;
  6. import static org.lwjgl.opengl.GL30.*;
  7. public final class DirectTextureRenderer {
  8. private final static int BUFFER_BYTE_LENGTH = 1024 * 1024; // 1 MiB
  9. private final static int OBJECT_LENGTH = 80; // 20 Floats
  10. private final int vertexArray;
  11. private final int vertexBuffer;
  12. private ByteBuffer buffer;
  13. private int offset = BUFFER_BYTE_LENGTH;
  14. private float depth = 0.0f;
  15. protected DirectTextureRenderer() {
  16. vertexArray = glGenVertexArrays();
  17. vertexBuffer = glGenBuffers();
  18. GLHelper.glBindVertexArray(vertexArray);
  19. GLHelper.glBindBuffer(vertexBuffer);
  20. glEnableVertexAttribArray(0);
  21. glVertexAttribPointer(0, 3, GL_FLOAT, false, 20, 0);
  22. glEnableVertexAttribArray(1);
  23. glVertexAttribPointer(1, 2, GL_FLOAT, false, 20, 12);
  24. }
  25. public void setDepth(float depth) {
  26. this.depth = depth;
  27. }
  28. public void drawRectangle(float minX, float minY, float maxX, float maxY, float tMinX, float tMinY, float tMaxX, float tMaxY) {
  29. buffer = getNextBuffer();
  30. if(buffer == null) {
  31. return;
  32. }
  33. addToBuffer(minX, maxY, tMinX, tMaxY);
  34. addToBuffer(minX, minY, tMinX, tMinY);
  35. addToBuffer(maxX, maxY, tMaxX, tMaxY);
  36. addToBuffer(maxX, minY, tMaxX, tMinY);
  37. finishBuffer();
  38. drawBuffer();
  39. }
  40. private ByteBuffer getNextBuffer() {
  41. GLHelper.glBindBuffer(vertexBuffer);
  42. offset += OBJECT_LENGTH;
  43. if(offset + OBJECT_LENGTH >= BUFFER_BYTE_LENGTH) {
  44. offset = 0;
  45. glBufferData(GL_ARRAY_BUFFER, BUFFER_BYTE_LENGTH, GL_STREAM_DRAW);
  46. }
  47. return glMapBufferRange(GL_ARRAY_BUFFER, offset, OBJECT_LENGTH, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT, buffer);
  48. }
  49. private void addToBuffer(float x, float y, float tx, float ty) {
  50. buffer.putFloat(x);
  51. buffer.putFloat(y);
  52. buffer.putFloat(depth);
  53. buffer.putFloat(tx);
  54. buffer.putFloat(ty);
  55. }
  56. private void finishBuffer() {
  57. buffer.flip();
  58. glUnmapBuffer(GL_ARRAY_BUFFER);
  59. }
  60. private void drawBuffer() {
  61. GLHelper.glBindVertexArray(vertexArray);
  62. glDrawArrays(GL_TRIANGLE_STRIP, offset / 20, 4);
  63. }
  64. }