package me.hammerle.snuviengine.api; import java.nio.ByteBuffer; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL15.*; import static org.lwjgl.opengl.GL20.*; import static org.lwjgl.opengl.GL30.*; public final class DirectTextureRenderer { private final static int BUFFER_BYTE_LENGTH = 1024 * 1024; // 1 MiB private final static int OBJECT_LENGTH = 80; // 20 Floats private final int vertexArray; private final int vertexBuffer; private ByteBuffer buffer; private int offset = BUFFER_BYTE_LENGTH; private float depth = 0.0f; protected DirectTextureRenderer() { vertexArray = glGenVertexArrays(); vertexBuffer = glGenBuffers(); GLHelper.glBindVertexArray(vertexArray); GLHelper.glBindBuffer(vertexBuffer); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, false, 20, 0); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 2, GL_FLOAT, false, 20, 12); } public void setDepth(float depth) { this.depth = depth; } public void drawRectangle(float minX, float minY, float maxX, float maxY, float tMinX, float tMinY, float tMaxX, float tMaxY) { buffer = getNextBuffer(); if(buffer == null) { return; } addToBuffer(minX, maxY, tMinX, tMaxY); addToBuffer(minX, minY, tMinX, tMinY); addToBuffer(maxX, maxY, tMaxX, tMaxY); addToBuffer(maxX, minY, tMaxX, tMinY); finishBuffer(); drawBuffer(); } private ByteBuffer getNextBuffer() { GLHelper.glBindBuffer(vertexBuffer); offset += OBJECT_LENGTH; if(offset + OBJECT_LENGTH >= BUFFER_BYTE_LENGTH) { offset = 0; glBufferData(GL_ARRAY_BUFFER, BUFFER_BYTE_LENGTH, GL_STREAM_DRAW); } return glMapBufferRange(GL_ARRAY_BUFFER, offset, OBJECT_LENGTH, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT, buffer); } private void addToBuffer(float x, float y, float tx, float ty) { buffer.putFloat(x); buffer.putFloat(y); buffer.putFloat(depth); buffer.putFloat(tx); buffer.putFloat(ty); } private void finishBuffer() { buffer.flip(); glUnmapBuffer(GL_ARRAY_BUFFER); } private void drawBuffer() { GLHelper.glBindVertexArray(vertexArray); glDrawArrays(GL_TRIANGLE_STRIP, offset / 20, 4); } }