Using short indices on android and desktop

This commit is contained in:
codeanticode
2012-03-31 15:16:27 +00:00
parent 1a05916a50
commit 67c0d5e9e4
5 changed files with 62 additions and 34 deletions

View File

@@ -50,6 +50,8 @@ import javax.media.opengl.glu.GLU;
import javax.media.opengl.glu.GLUtessellator;
import javax.media.opengl.glu.GLUtessellatorCallbackAdapter;
import processing.core.PGraphics;
import com.jogamp.newt.awt.NewtCanvasAWT;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.util.AnimatorBase;
@@ -75,10 +77,10 @@ public class PGL {
static final int SIZEOF_FLOAT = Float.SIZE / 8;
/** Size of a vertex index. */
static final int SIZEOF_INDEX = SIZEOF_INT;
static final int SIZEOF_INDEX = SIZEOF_SHORT;
/** Type of a vertex index. */
static final int INDEX_TYPE = GL.GL_UNSIGNED_INT;
static final int INDEX_TYPE = GL.GL_UNSIGNED_SHORT;
/** Initial sizes for arrays of input and tessellated data. */
public static final int DEFAULT_IN_VERTICES = 64;
@@ -93,8 +95,11 @@ public class PGL {
/** Maximum lights by default is 8, the minimum defined by OpenGL. */
public static final int MAX_LIGHTS = 8;
/** Maximum number of tessellated vertices, using 2^19 for Mac/PC. */
public static final int MAX_TESS_VERTICES = 524288;
/** Maximum number of tessellated vertices. GLES restricts the vertex indices
* to be of type unsigned short. Since Java only supports native shorts as
* primitive type we have 2^15 = 32768 as the maximum number of vertices
* that can be referred to within a single VBO. */
public static final int MAX_TESS_VERTICES = 32768;
/** Maximum number of indices. 2 times the max number of
* vertices to have good room for vertex reuse. */
@@ -1221,9 +1226,22 @@ public class PGL {
}
static public int makeIndex(int intIdx) {
return intIdx;
}
static public short makeIndex(int intIdx) {
// The old hack to have unsigned shorts as indices using Java's
// signed shorts:
// When the index value is greater than 32767, subtracting 65536
// will make it (as a short) to wrap around to the negative range, which
// is all we need to later pass these numbers to opengl (which will
// interpret them as unsigned shorts). See discussion here:
// http://stackoverflow.com/questions/4331021/java-opengl-gldrawelements-with-32767-vertices
//return 32767 < intIdx ? (short)(intIdx - 65536) : (short)intIdx;
if (32767 < intIdx) {
PGraphics.showWarning("P3D: Vertex index is greater than 32767");
return 32767;
} else {
return (short)intIdx;
}
}
public void enableTexturing(int target) {

View File

@@ -1152,7 +1152,7 @@ public class PGraphicsOpenGL extends PGraphics {
pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, glFillIndexBufferID);
pgl.glBufferData(PGL.GL_ELEMENT_ARRAY_BUFFER, tessGeo.fillIndexCount * PGL.SIZEOF_INDEX,
IntBuffer.wrap(tessGeo.fillIndices, 0, tessGeo.fillIndexCount), vboMode);
ShortBuffer.wrap(tessGeo.fillIndices, 0, tessGeo.fillIndexCount), vboMode);
}
@@ -1236,7 +1236,7 @@ public class PGraphicsOpenGL extends PGraphics {
pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, glLineIndexBufferID);
pgl.glBufferData(PGL.GL_ELEMENT_ARRAY_BUFFER, tessGeo.lineIndexCount * PGL.SIZEOF_INDEX,
IntBuffer.wrap(tessGeo.lineIndices, 0, tessGeo.lineIndexCount), vboMode);
ShortBuffer.wrap(tessGeo.lineIndices, 0, tessGeo.lineIndexCount), vboMode);
}
@@ -1304,7 +1304,7 @@ public class PGraphicsOpenGL extends PGraphics {
pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, glPointIndexBufferID);
pgl.glBufferData(PGL.GL_ELEMENT_ARRAY_BUFFER, tessGeo.pointIndexCount * PGL.SIZEOF_INDEX,
IntBuffer.wrap(tessGeo.pointIndices, 0, tessGeo.pointIndexCount), vboMode);
ShortBuffer.wrap(tessGeo.pointIndices, 0, tessGeo.pointIndexCount), vboMode);
}
@@ -2477,7 +2477,7 @@ public class PGraphicsOpenGL extends PGraphics {
int size = tessGeo.fillIndexCount;
int sizex = size * PGL.SIZEOF_INDEX;
pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, glFillIndexBufferID);
pgl.glBufferData(PGL.GL_ELEMENT_ARRAY_BUFFER, sizex, IntBuffer.wrap(tessGeo.fillIndices, 0, size), vboMode);
pgl.glBufferData(PGL.GL_ELEMENT_ARRAY_BUFFER, sizex, ShortBuffer.wrap(tessGeo.fillIndices, 0, size), vboMode);
pgl.glDrawElements(PGL.GL_TRIANGLES, size, PGL.INDEX_TYPE, 0);
pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, 0);
@@ -6823,7 +6823,7 @@ public class PGraphicsOpenGL extends PGraphics {
public int fillIndexCount;
public int firstFillIndex;
public int lastFillIndex;
public int[] fillIndices;
public short[] fillIndices;
// Tessellated line data
public int lineVertexCount;
@@ -6836,7 +6836,7 @@ public class PGraphicsOpenGL extends PGraphics {
public int lineIndexCount;
public int firstLineIndex;
public int lastLineIndex;
public int[] lineIndices;
public short[] lineIndices;
// Tessellated point data
public int pointVertexCount;
@@ -6849,7 +6849,7 @@ public class PGraphicsOpenGL extends PGraphics {
public int pointIndexCount;
public int firstPointIndex;
public int lastPointIndex;
public int[] pointIndices;
public short[] pointIndices;
public boolean isStroked;
@@ -6880,17 +6880,17 @@ public class PGraphicsOpenGL extends PGraphics {
fillSpecular = new int[PGL.DEFAULT_TESS_VERTICES];
fillEmissive = new int[PGL.DEFAULT_TESS_VERTICES];
fillShininess = new float[PGL.DEFAULT_TESS_VERTICES];
fillIndices = new int[PGL.DEFAULT_TESS_VERTICES];
fillIndices = new short[PGL.DEFAULT_TESS_VERTICES];
lineVertices = new float[3 * PGL.DEFAULT_TESS_VERTICES];
lineColors = new int[PGL.DEFAULT_TESS_VERTICES];
lineDirWidths = new float[4 * PGL.DEFAULT_TESS_VERTICES];
lineIndices = new int[PGL.DEFAULT_TESS_VERTICES];
lineIndices = new short[PGL.DEFAULT_TESS_VERTICES];
pointVertices = new float[3 * PGL.DEFAULT_TESS_VERTICES];
pointColors = new int[PGL.DEFAULT_TESS_VERTICES];
pointSizes = new float[2 * PGL.DEFAULT_TESS_VERTICES];
pointIndices = new int[PGL.DEFAULT_TESS_VERTICES];
pointIndices = new short[PGL.DEFAULT_TESS_VERTICES];
clear();
}
@@ -6981,7 +6981,7 @@ public class PGraphicsOpenGL extends PGraphics {
}
public void trimFillIndices() {
int temp[] = new int[fillIndexCount];
short temp[] = new short[fillIndexCount];
PApplet.arrayCopy(fillIndices, 0, temp, 0, fillIndexCount);
fillIndices = temp;
}
@@ -7005,7 +7005,7 @@ public class PGraphicsOpenGL extends PGraphics {
}
protected void trimLineIndices() {
int temp[] = new int[lineIndexCount];
short temp[] = new short[lineIndexCount];
PApplet.arrayCopy(lineIndices, 0, temp, 0, lineIndexCount);
lineIndices = temp;
}
@@ -7029,7 +7029,7 @@ public class PGraphicsOpenGL extends PGraphics {
}
protected void trimPointIndices() {
int temp[] = new int[pointIndexCount];
short temp[] = new short[pointIndexCount];
PApplet.arrayCopy(pointIndices, 0, temp, 0, pointIndexCount);
pointIndices = temp;
}
@@ -7207,7 +7207,7 @@ public class PGraphicsOpenGL extends PGraphics {
}
public void expandFillIndices(int n) {
int temp[] = new int[n];
short temp[] = new short[n];
PApplet.arrayCopy(fillIndices, 0, temp, 0, fillIndexCount);
fillIndices = temp;
}
@@ -7413,7 +7413,7 @@ public class PGraphicsOpenGL extends PGraphics {
}
protected void expandLineIndices(int n) {
int temp[] = new int[n];
short temp[] = new short[n];
PApplet.arrayCopy(lineIndices, 0, temp, 0, lineIndexCount);
lineIndices = temp;
}
@@ -7465,7 +7465,7 @@ public class PGraphicsOpenGL extends PGraphics {
}
protected void expandPointIndices(int n) {
int temp[] = new int[n];
short temp[] = new short[n];
PApplet.arrayCopy(pointIndices, 0, temp, 0, pointIndexCount);
pointIndices = temp;
}

View File

@@ -41,6 +41,7 @@ import java.io.BufferedReader;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
@@ -3414,9 +3415,9 @@ public class PShape3D extends PShape {
}
protected void copyFillIndices(int offset, int size, int[] indices) {
protected void copyFillIndices(int offset, int size, short[] indices) {
pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, glFillIndexBufferID);
pgl.glBufferSubData(PGL.GL_ELEMENT_ARRAY_BUFFER, offset * PGL.SIZEOF_INDEX, size * PGL.SIZEOF_INDEX, IntBuffer.wrap(indices, 0, size));
pgl.glBufferSubData(PGL.GL_ELEMENT_ARRAY_BUFFER, offset * PGL.SIZEOF_INDEX, size * PGL.SIZEOF_INDEX, ShortBuffer.wrap(indices, 0, size));
pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, 0);
}
@@ -3508,9 +3509,9 @@ public class PShape3D extends PShape {
}
protected void copyLineIndices(int offset, int size, int[] indices) {
protected void copyLineIndices(int offset, int size, short[] indices) {
pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, glLineIndexBufferID);
pgl.glBufferSubData(PGL.GL_ELEMENT_ARRAY_BUFFER, offset * PGL.SIZEOF_INDEX, size * PGL.SIZEOF_INDEX, IntBuffer.wrap(indices, 0, size));
pgl.glBufferSubData(PGL.GL_ELEMENT_ARRAY_BUFFER, offset * PGL.SIZEOF_INDEX, size * PGL.SIZEOF_INDEX, ShortBuffer.wrap(indices, 0, size));
pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, 0);
}
@@ -3602,9 +3603,9 @@ public class PShape3D extends PShape {
}
protected void copyPointIndices(int offset, int size, int[] indices) {
protected void copyPointIndices(int offset, int size, short[] indices) {
pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, glPointIndexBufferID);
pgl.glBufferSubData(PGL.GL_ELEMENT_ARRAY_BUFFER, offset * PGL.SIZEOF_INDEX, size * PGL.SIZEOF_INDEX, IntBuffer.wrap(indices, 0, size));
pgl.glBufferSubData(PGL.GL_ELEMENT_ARRAY_BUFFER, offset * PGL.SIZEOF_INDEX, size * PGL.SIZEOF_INDEX, ShortBuffer.wrap(indices, 0, size));
pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, 0);
}