package me.hammerle.snuviengine.api; import java.nio.ByteBuffer; import org.lwjgl.BufferUtils; 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 class ColorRenderer { private int vao; private int vbo; private ByteBuffer buffer = BufferUtils.createByteBuffer(48); private final static int BUFFER_BYTE_LENGTH = 1024 * 1024; private final static int OBJECT_LENGTH = 64; private int offset = BUFFER_BYTE_LENGTH - OBJECT_LENGTH; private float depth = 0.0f; protected ColorRenderer() { Shader.addTask(() -> { vao = glGenVertexArrays(); vbo = glGenBuffers(); GLHelper.glBindVertexArray(vao); GLHelper.glBindBuffer(vbo); glEnableVertexAttribArray(0); glEnableVertexAttribArray(2); glVertexAttribPointer(0, 3, GL_FLOAT, false, 16, 0); glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, true, 16, 12); }); } public void setDepth(float depth) { this.depth = depth; } public void drawRectangle(float minX, float minY, float maxX, float maxY, int color) { GLHelper.glBindBuffer(vbo); offset += OBJECT_LENGTH; if(offset + OBJECT_LENGTH >= BUFFER_BYTE_LENGTH) { offset = 0; glBufferData(GL_ARRAY_BUFFER, BUFFER_BYTE_LENGTH, GL_STREAM_DRAW); } buffer = glMapBufferRange(GL_ARRAY_BUFFER, offset, OBJECT_LENGTH, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT, buffer); if(buffer == null) { return; } float fcolor = Float.intBitsToFloat(color); buffer.putFloat(minX); buffer.putFloat(maxY); buffer.putFloat(depth); buffer.putFloat(fcolor); buffer.putFloat(minX); buffer.putFloat(minY); buffer.putFloat(depth); buffer.putFloat(fcolor); buffer.putFloat(maxX); buffer.putFloat(maxY); buffer.putFloat(depth); buffer.putFloat(fcolor); buffer.putFloat(maxX); buffer.putFloat(minY); buffer.putFloat(depth); buffer.putFloat(fcolor); buffer.flip(); glUnmapBuffer(GL_ARRAY_BUFFER); GLHelper.glBindVertexArray(vao); glDrawArrays(GL_TRIANGLE_STRIP, offset / 16, 4); } }