12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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 DirectTextureRenderer
- {
- private int vao;
- private int vbo;
-
- private ByteBuffer buffer = BufferUtils.createByteBuffer(OBJECT_LENGTH);
-
- private final static int BUFFER_BYTE_LENGTH = 1024 * 1024;
- private final static int OBJECT_LENGTH = 80;
-
- private int offset = BUFFER_BYTE_LENGTH - OBJECT_LENGTH;
-
- private float depth = 0.0f;
-
- protected DirectTextureRenderer()
- {
- Shader.addTask(() ->
- {
- vao = glGenVertexArrays();
- vbo = glGenBuffers();
-
- GLHelper.glBindVertexArray(vao);
- GLHelper.glBindBuffer(vbo);
- 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)
- {
- 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;
- }
-
- buffer.putFloat(minX);
- buffer.putFloat(maxY);
- buffer.putFloat(depth);
- buffer.putFloat(tMinX);
- buffer.putFloat(tMaxY);
-
- buffer.putFloat(minX);
- buffer.putFloat(minY);
- buffer.putFloat(depth);
- buffer.putFloat(tMinX);
- buffer.putFloat(tMinY);
-
- buffer.putFloat(maxX);
- buffer.putFloat(maxY);
- buffer.putFloat(depth);
- buffer.putFloat(tMaxX);
- buffer.putFloat(tMaxY);
-
- buffer.putFloat(maxX);
- buffer.putFloat(minY);
- buffer.putFloat(depth);
- buffer.putFloat(tMaxX);
- buffer.putFloat(tMinY);
-
- buffer.flip();
- glUnmapBuffer(GL_ARRAY_BUFFER);
-
- GLHelper.glBindVertexArray(vao);
- glDrawArrays(GL_TRIANGLE_STRIP, offset / 20, 4);
- }
- }
|