1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- 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);
- }
- }
|