This commit is contained in:
Andrea Cavalli 2018-03-29 01:05:45 +02:00
parent 7e82bde264
commit 872bc3f943

View File

@ -6,6 +6,7 @@ import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.Buffer; import java.nio.Buffer;
import java.nio.FloatBuffer; import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.file.Files; import java.nio.file.Files;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@ -26,9 +27,12 @@ public class GPURenderer implements Renderer {
public static GL2ES1 gl; public static GL2ES1 gl;
private static final int ELEMENT_VERTICES_COUNT = 6, vertSize = 3, texSize = 2, colSize = 4; private static final int ELEMENT_VERTICES_COUNT = 6,
vertSize = 3, texSize = 2, colSize = 4,
vertBuffer = 0, texBuffer = 1, colBuffer = 2;
private static final int ELEMENTS_MAX_COUNT_PER_BUFFER = StaticVars.enableVBO ? 128 : 1; private static final int ELEMENTS_MAX_COUNT_PER_BUFFER = StaticVars.enableVBO ? 128 : 1;
private IntBuffer handlers;
private final DeallocationHelper deallocationHelper = new DeallocationHelper(); private final DeallocationHelper deallocationHelper = new DeallocationHelper();
FloatBuffer fbVertices; FloatBuffer fbVertices;
FloatBuffer fbTextures; FloatBuffer fbTextures;
@ -294,14 +298,16 @@ public class GPURenderer implements Renderer {
public void initDrawCycle() { public void initDrawCycle() {
final boolean textureChange = precTexEnabled != currentTexEnabled || precTex != currentTex; final boolean textureChange = precTexEnabled != currentTexEnabled || precTex != currentTex;
startDrawSegment(false);
if (textureChange) {
changeTexture();
}
if (fbVertices == null) { if (fbVertices == null) {
fbVertices = Buffers.newDirectFloatBuffer(vertSize * ELEMENT_VERTICES_COUNT * ELEMENTS_MAX_COUNT_PER_BUFFER); fbVertices = Buffers.newDirectFloatBuffer(vertSize * ELEMENT_VERTICES_COUNT * ELEMENTS_MAX_COUNT_PER_BUFFER);
fbTextures = Buffers.newDirectFloatBuffer(texSize * ELEMENT_VERTICES_COUNT * ELEMENTS_MAX_COUNT_PER_BUFFER); fbTextures = Buffers.newDirectFloatBuffer(texSize * ELEMENT_VERTICES_COUNT * ELEMENTS_MAX_COUNT_PER_BUFFER);
fbColors = Buffers.newDirectFloatBuffer(colSize * ELEMENT_VERTICES_COUNT * ELEMENTS_MAX_COUNT_PER_BUFFER); fbColors = Buffers.newDirectFloatBuffer(colSize * ELEMENT_VERTICES_COUNT * ELEMENTS_MAX_COUNT_PER_BUFFER);
handlers = Buffers.newDirectIntBuffer(3);
gl.glGenBuffers(3, handlers);
}
startDrawSegment(false);
if (textureChange) {
changeTexture();
} }
} }
@ -328,6 +334,7 @@ public class GPURenderer implements Renderer {
} else { } else {
gl.glDisable(GL.GL_TEXTURE_2D); gl.glDisable(GL.GL_TEXTURE_2D);
} }
firstBufferTexDataCall = true;
} }
public void startDrawSegment(boolean continuation) { public void startDrawSegment(boolean continuation) {
@ -358,23 +365,62 @@ public class GPURenderer implements Renderer {
} }
} }
boolean firstBufferDataCall = true;
boolean firstBufferTexDataCall = true;
public void endDrawSegment() { public void endDrawSegment() {
fbVertices.limit(fbVertices.position()); fbVertices.flip();
fbTextures.limit(fbTextures.position()); fbTextures.flip();
fbColors.limit(fbColors.position()); fbColors.flip();
fbVertices.rewind();
fbTextures.rewind(); // gl.glVertexPointer(vertSize, GL.GL_FLOAT, 0, fbVertices);
fbColors.rewind(); gl.glBindBuffer(GL.GL_ARRAY_BUFFER, handlers.get(vertBuffer));
if (firstBufferTexDataCall) {
gl.glBufferData(
GL.GL_ARRAY_BUFFER, fbVertices.limit() * Buffers.SIZEOF_FLOAT,
fbVertices,
GL2ES1.GL_STATIC_DRAW);
} else {
gl.glBufferSubData(
GL.GL_ARRAY_BUFFER, 0, fbVertices.limit() * Buffers.SIZEOF_FLOAT,
fbVertices);
}
gl.glVertexPointer(vertSize, GL.GL_FLOAT, 0, 0l);
// gl.glTexCoordPointer(texSize, GL.GL_FLOAT, 0, fbTextures);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, handlers.get(texBuffer));
if (firstBufferTexDataCall) {
gl.glBufferData(
GL.GL_ARRAY_BUFFER, fbTextures.limit() * Buffers.SIZEOF_FLOAT,
fbTextures,
GL2ES1.GL_STATIC_DRAW);
} else {
gl.glBufferSubData(
GL.GL_ARRAY_BUFFER, 0, fbTextures.limit() * Buffers.SIZEOF_FLOAT,
fbTextures);
}
gl.glTexCoordPointer(texSize, GL.GL_FLOAT, 0, 0l);
// gl.glColorPointer(colSize, GL.GL_FLOAT, 0, fbColors);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, handlers.get(colBuffer));
if (firstBufferTexDataCall) {
gl.glBufferData(
GL.GL_ARRAY_BUFFER, fbColors.limit() * Buffers.SIZEOF_FLOAT,
fbColors,
GL2ES1.GL_STATIC_DRAW);
} else {
gl.glBufferSubData(
GL.GL_ARRAY_BUFFER, 0, fbColors.limit() * Buffers.SIZEOF_FLOAT,
fbColors);
}
gl.glColorPointer(colSize, GL.GL_FLOAT, 0, 0l);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glVertexPointer(vertSize, GL.GL_FLOAT, 0, fbVertices);
gl.glTexCoordPointer(texSize, GL.GL_FLOAT, 0, fbTextures);
gl.glColorPointer(colSize, GL.GL_FLOAT, 0, fbColors);
fbVertices.limit(fbVertices.capacity()); fbVertices.limit(fbVertices.capacity());
fbTextures.limit(fbTextures.capacity()); fbTextures.limit(fbTextures.capacity());
fbColors.limit(fbColors.capacity()); fbColors.limit(fbColors.capacity());
gl.glDrawArrays(GL.GL_TRIANGLES, 0, fbElements * ELEMENT_VERTICES_COUNT); gl.glDrawArrays(GL.GL_TRIANGLES, 0, fbElements * ELEMENT_VERTICES_COUNT);
//gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, fbElements * ELEMENT_VERTICES_COUNT); //gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, fbElements * ELEMENT_VERTICES_COUNT);
firstBufferDataCall = false;
firstBufferTexDataCall = false;
cycleEnded = true; cycleEnded = true;
// deleteBuffer(fbVertices); // deleteBuffer(fbVertices);