Sfoglia il codice sorgente

direct texture renderer

Kajetan Johannes Hammerle 5 anni fa
parent
commit
b8244955d5

+ 1 - 1
src/me/hammerle/snuviengine/api/ColorRenderer.java

@@ -12,7 +12,7 @@ public class ColorRenderer
     private int vao;
     private int vbo;
     
-    private ByteBuffer buffer = BufferUtils.createByteBuffer(48);
+    private ByteBuffer buffer = BufferUtils.createByteBuffer(64);
     
     private final static int BUFFER_BYTE_LENGTH = 1024 * 1024;
     private final static int OBJECT_LENGTH = 64;

+ 94 - 0
src/me/hammerle/snuviengine/api/DirectTextureRenderer.java

@@ -0,0 +1,94 @@
+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);
+    }
+}

+ 6 - 0
src/me/hammerle/snuviengine/api/Shader.java

@@ -26,6 +26,7 @@ public final class Shader
     
     private final static FontRenderer FONT_RENDERER = new FontRenderer();
     private final static ColorRenderer COLOR_RENDERER = new ColorRenderer();
+    private final static DirectTextureRenderer TEXTURE_RENDERER = new DirectTextureRenderer();
     
     // uniform stuff
     private static int unifViewMatrix = -1;
@@ -107,6 +108,11 @@ public final class Shader
         return COLOR_RENDERER;
     }
     
+    public static DirectTextureRenderer getTextureRenderer()
+    {
+        return TEXTURE_RENDERER;
+    }
+    
     private static void updateViewMatrix()
     {
         FloatBuffer buffer = BufferUtils.createFloatBuffer(16);