aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java')
-rw-r--r--src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java384
1 files changed, 193 insertions, 191 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java b/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java
index 111e2509e..986f6d8d3 100644
--- a/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java
+++ b/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java
@@ -34,28 +34,28 @@ import com.jogamp.opengl.util.glsl.ShaderState;
* to be either rendered directly via {@link #glEnd(GL)} or to be added to an internal display list
* via {@link #glEnd(GL, boolean) glEnd(gl, false)} for deferred rendering via {@link #draw(GL, boolean)}.
* </p>
- * <a name="storageDetails"><h5>Buffer storage and it's creation via {@link #createFixed(int, int, int, int, int, int, int, int, int, int) createFixed(..)}
- * and {@link #createGLSL(int, int, int, int, int, int, int, int, int, int, ShaderState) createGLSL(..)}</h5></a>
+ * <a name="storageDetails"><h5>Buffer storage and it's creation via {@link #createFixed(int, int, int, int, int, int, int, int, int, int) createFixed(..)}
+ * and {@link #createGLSL(int, int, int, int, int, int, int, int, int, int, ShaderState) createGLSL(..)}</h5></a>
* <p>
- * If unsure whether <i>colors</i>, <i>normals</i> and <i>textures</i> will be used,
+ * If unsure whether <i>colors</i>, <i>normals</i> and <i>textures</i> will be used,
* simply add them with an expected component count.
* This implementation will only render buffers which are being filled.<br/>
* The buffer growing implementation will only grow the exceeded buffers, unused buffers are not resized.
* </p>
* <p>
- * Note: Optional types, i.e. color, must be either not used or used w/ the same element count as vertex, etc.
+ * Note: Optional types, i.e. color, must be either not used or used w/ the same element count as vertex, etc.
* This is a semantic constraint, same as in the original OpenGL spec.
* </p>
*/
public class ImmModeSink {
protected static final boolean DEBUG_BEGIN_END;
- protected static final boolean DEBUG_DRAW;
+ protected static final boolean DEBUG_DRAW;
protected static final boolean DEBUG_BUFFER;
-
+
static {
Debug.initSingleton();
DEBUG_BEGIN_END = Debug.isPropertyDefined("jogl.debug.ImmModeSink.BeginEnd", true);
- DEBUG_DRAW = Debug.isPropertyDefined("jogl.debug.ImmModeSink.Draw", true);
+ DEBUG_DRAW = Debug.isPropertyDefined("jogl.debug.ImmModeSink.Draw", true);
DEBUG_BUFFER = Debug.isPropertyDefined("jogl.debug.ImmModeSink.Buffer", true);
}
@@ -68,7 +68,7 @@ public class ImmModeSink {
* <p>
* See <a href="#storageDetails"> buffer storage details</a>.
* </p>
- *
+ *
* @param initialElementCount initial buffer size, if subsequent mutable operations are about to exceed the buffer size, the buffer will grow about the initial size.
* @param vComps mandatory vertex component count, should be 2, 3 or 4.
* @param vDataType mandatory vertex data type, e.g. {@link GL#GL_FLOAT}
@@ -78,17 +78,17 @@ public class ImmModeSink {
* @param nDataType optional normal data type, e.g. {@link GL#GL_FLOAT}
* @param tComps optional texture-coordinate component count, may be 0, 2 or 3
* @param tDataType optional texture-coordinate data type, e.g. {@link GL#GL_FLOAT}
- * @param glBufferUsage VBO <code>usage</code> parameter for {@link GL#glBufferData(int, long, Buffer, int)}, e.g. {@link GL#GL_STATIC_DRAW},
+ * @param glBufferUsage VBO <code>usage</code> parameter for {@link GL#glBufferData(int, long, Buffer, int)}, e.g. {@link GL#GL_STATIC_DRAW},
* set to <code>0</code> for no VBO usage
*/
- public static ImmModeSink createFixed(int initialElementCount,
+ public static ImmModeSink createFixed(int initialElementCount,
int vComps, int vDataType,
int cComps, int cDataType,
- int nComps, int nDataType,
- int tComps, int tDataType,
+ int nComps, int nDataType,
+ int tComps, int tDataType,
int glBufferUsage) {
- return new ImmModeSink(initialElementCount,
- vComps, vDataType, cComps, cDataType, nComps, nDataType, tComps, tDataType,
+ return new ImmModeSink(initialElementCount,
+ vComps, vDataType, cComps, cDataType, nComps, nDataType, tComps, tDataType,
false, glBufferUsage, null, 0);
}
@@ -97,7 +97,7 @@ public class ImmModeSink {
* <p>
* See <a href="#storageDetails"> buffer storage details</a>.
* </p>
- *
+ *
* @param initialElementCount initial buffer size, if subsequent mutable operations are about to exceed the buffer size, the buffer will grow about the initial size.
* @param vComps mandatory vertex component count, should be 2, 3 or 4.
* @param vDataType mandatory vertex data type, e.g. {@link GL#GL_FLOAT}
@@ -107,21 +107,21 @@ public class ImmModeSink {
* @param nDataType optional normal data type, e.g. {@link GL#GL_FLOAT}
* @param tComps optional texture-coordinate component count, may be 0, 2 or 3
* @param tDataType optional texture-coordinate data type, e.g. {@link GL#GL_FLOAT}
- * @param glBufferUsage VBO <code>usage</code> parameter for {@link GL#glBufferData(int, long, Buffer, int)}, e.g. {@link GL#GL_STATIC_DRAW},
+ * @param glBufferUsage VBO <code>usage</code> parameter for {@link GL#glBufferData(int, long, Buffer, int)}, e.g. {@link GL#GL_STATIC_DRAW},
* set to <code>0</code> for no VBO usage
* @param st ShaderState to locate the vertex attributes
* @see #draw(GL, boolean)
* @see com.jogamp.opengl.util.glsl.ShaderState#useProgram(GL2ES2, boolean)
* @see com.jogamp.opengl.util.glsl.ShaderState#getCurrentShaderState()
*/
- public static ImmModeSink createGLSL(int initialElementCount,
+ public static ImmModeSink createGLSL(int initialElementCount,
int vComps, int vDataType,
int cComps, int cDataType,
- int nComps, int nDataType,
- int tComps, int tDataType,
+ int nComps, int nDataType,
+ int tComps, int tDataType,
int glBufferUsage, ShaderState st) {
- return new ImmModeSink(initialElementCount,
- vComps, vDataType, cComps, cDataType, nComps, nDataType, tComps, tDataType,
+ return new ImmModeSink(initialElementCount,
+ vComps, vDataType, cComps, cDataType, nComps, nDataType, tComps, tDataType,
true, glBufferUsage, st, 0);
}
@@ -130,7 +130,7 @@ public class ImmModeSink {
* <p>
* See <a href="#storageDetails"> buffer storage details</a>.
* </p>
- *
+ *
* @param initialElementCount initial buffer size, if subsequent mutable operations are about to exceed the buffer size, the buffer will grow about the initial size.
* @param vComps mandatory vertex component count, should be 2, 3 or 4.
* @param vDataType mandatory vertex data type, e.g. {@link GL#GL_FLOAT}
@@ -140,24 +140,24 @@ public class ImmModeSink {
* @param nDataType optional normal data type, e.g. {@link GL#GL_FLOAT}
* @param tComps optional texture-coordinate component count, may be 0, 2 or 3
* @param tDataType optional texture-coordinate data type, e.g. {@link GL#GL_FLOAT}
- * @param glBufferUsage VBO <code>usage</code> parameter for {@link GL#glBufferData(int, long, Buffer, int)}, e.g. {@link GL#GL_STATIC_DRAW},
+ * @param glBufferUsage VBO <code>usage</code> parameter for {@link GL#glBufferData(int, long, Buffer, int)}, e.g. {@link GL#GL_STATIC_DRAW},
* set to <code>0</code> for no VBO usage
* @param shaderProgram shader-program name to locate the vertex attributes
* @see #draw(GL, boolean)
* @see com.jogamp.opengl.util.glsl.ShaderState#useProgram(GL2ES2, boolean)
* @see com.jogamp.opengl.util.glsl.ShaderState#getCurrentShaderState()
*/
- public static ImmModeSink createGLSL(int initialElementCount,
+ public static ImmModeSink createGLSL(int initialElementCount,
int vComps, int vDataType,
int cComps, int cDataType,
- int nComps, int nDataType,
- int tComps, int tDataType,
+ int nComps, int nDataType,
+ int tComps, int tDataType,
int glBufferUsage, int shaderProgram) {
- return new ImmModeSink(initialElementCount,
- vComps, vDataType, cComps, cDataType, nComps, nDataType, tComps, tDataType,
+ return new ImmModeSink(initialElementCount,
+ vComps, vDataType, cComps, cDataType, nComps, nDataType, tComps, tDataType,
true, glBufferUsage, null, shaderProgram);
}
-
+
public void destroy(GL gl) {
destroyList(gl);
@@ -173,6 +173,7 @@ public class ImmModeSink {
vboSet.reset(gl);
}
+ @Override
public String toString() {
StringBuilder sb = new StringBuilder("ImmModeSink[");
sb.append(",\n\tVBO list: "+vboSetList.size()+" [");
@@ -346,7 +347,7 @@ public class ImmModeSink {
public final void glColor3ub(byte x, byte y, byte z) {
vboSet.glColor3ub(x,y,z);
}
-
+
public final void glColor4b(byte x, byte y, byte z, byte a) {
vboSet.glColor4b(x,y,z,a);
}
@@ -354,7 +355,7 @@ public class ImmModeSink {
public final void glColor4ub(byte x, byte y, byte z, byte a) {
vboSet.glColor4ub(x,y,z,a);
}
-
+
public final void glTexCoord2b(byte x, byte y) {
vboSet.glTexCoord2b(x,y);
}
@@ -363,26 +364,26 @@ public class ImmModeSink {
vboSet.glTexCoord3b(x,y,z);
}
- protected ImmModeSink(int initialElementCount,
- int vComps, int vDataType,
- int cComps, int cDataType,
- int nComps, int nDataType,
- int tComps, int tDataType,
+ protected ImmModeSink(int initialElementCount,
+ int vComps, int vDataType,
+ int cComps, int cDataType,
+ int nComps, int nDataType,
+ int tComps, int tDataType,
boolean useGLSL, int glBufferUsage, ShaderState st, int shaderProgram) {
- vboSet = new VBOSet(initialElementCount,
- vComps, vDataType, cComps, cDataType, nComps, nDataType, tComps, tDataType,
+ vboSet = new VBOSet(initialElementCount,
+ vComps, vDataType, cComps, cDataType, nComps, nDataType, tComps, tDataType,
useGLSL, glBufferUsage, st, shaderProgram);
this.vboSetList = new ArrayList<VBOSet>();
}
-
+
public boolean getUseVBO() { return vboSet.getUseVBO(); }
-
+
/**
* Returns the additional element count if buffer resize is required.
* @see #setResizeElementCount(int)
*/
public int getResizeElementCount() { return vboSet.getResizeElementCount(); }
-
+
/**
* Sets the additional element count if buffer resize is required,
* defaults to <code>initialElementCount</code> of factory method.
@@ -390,7 +391,7 @@ public class ImmModeSink {
* @see #createGLSL(int, int, int, int, int, int, int, int, int, int, ShaderState)
*/
public void setResizeElementCount(int v) { vboSet.setResizeElementCount(v); }
-
+
private void destroyList(GL gl) {
for(int i=0; i<vboSetList.size(); i++) {
vboSetList.get(i).destroy(gl);
@@ -402,11 +403,11 @@ public class ImmModeSink {
private final ArrayList<VBOSet> vboSetList;
protected static class VBOSet {
- protected VBOSet (int initialElementCount,
- int vComps, int vDataType,
- int cComps, int cDataType,
- int nComps, int nDataType,
- int tComps, int tDataType,
+ protected VBOSet (int initialElementCount,
+ int vComps, int vDataType,
+ int cComps, int cDataType,
+ int nComps, int nDataType,
+ int tComps, int tDataType,
boolean useGLSL, int glBufferUsage, ShaderState st, int shaderProgram) {
// final ..
this.glBufferUsage=glBufferUsage;
@@ -415,7 +416,7 @@ public class ImmModeSink {
this.useGLSL=useGLSL;
this.shaderState = st;
this.shaderProgram = shaderProgram;
-
+
if(useGLSL && null == shaderState && 0 == shaderProgram) {
throw new IllegalArgumentException("Using GLSL but neither a valid shader-program nor ShaderState has been passed!");
}
@@ -436,9 +437,9 @@ public class ImmModeSink {
this.tDataType=tDataType;
this.tDataTypeSigned=GLBuffers.isSignedGLType(tDataType);
this.tComps=tComps;
- this.tCompsBytes=tComps * GLBuffers.sizeOfGLType(tDataType);
+ this.tCompsBytes=tComps * GLBuffers.sizeOfGLType(tDataType);
this.vboName = 0;
-
+
this.vCount=0;
this.cCount=0;
this.nCount=0;
@@ -447,9 +448,9 @@ public class ImmModeSink {
this.cElems=0;
this.nElems=0;
this.tElems=0;
-
+
this.pageSize = Platform.getMachineDescription().pageSizeInBytes();
-
+
reallocateBuffer(initialElementCount);
rewind();
@@ -465,30 +466,30 @@ public class ImmModeSink {
protected int getResizeElementCount() { return resizeElementCount; }
protected void setResizeElementCount(int v) { resizeElementCount=v; }
-
+
protected boolean getUseVBO() { return useVBO; }
-
+
protected final VBOSet regenerate(GL gl) {
- return new VBOSet(initialElementCount, vComps,
- vDataType, cComps, cDataType, nComps, nDataType, tComps, tDataType,
+ return new VBOSet(initialElementCount, vComps,
+ vDataType, cComps, cDataType, nComps, nDataType, tComps, tDataType,
useGLSL, glBufferUsage, shaderState, shaderProgram);
}
protected void checkSeal(boolean test) throws GLException {
if(0==mode) {
- throw new GLException("No mode set yet, call glBegin(mode) first:\n\t"+this);
+ throw new GLException("No mode set yet, call glBegin(mode) first:\n\t"+this);
}
if(sealed!=test) {
if(test) {
- throw new GLException("Not Sealed yet, call glEnd() first:\n\t"+this);
+ throw new GLException("Not Sealed yet, call glEnd() first:\n\t"+this);
} else {
- throw new GLException("Already Sealed, can't modify VBO after glEnd():\n\t"+this);
+ throw new GLException("Already Sealed, can't modify VBO after glEnd():\n\t"+this);
}
}
}
private boolean usingShaderProgram = false;
-
+
protected void useShaderProgram(GL2ES2 gl, boolean force) {
if( force || !usingShaderProgram ) {
if(null != shaderState) {
@@ -499,19 +500,19 @@ public class ImmModeSink {
usingShaderProgram = true;
}
}
-
+
protected void draw(GL gl, Buffer indices, boolean disableBufferAfterDraw, int i)
{
enableBuffer(gl, true);
-
+
if(null != shaderState || 0 != shaderProgram) {
useShaderProgram(gl.getGL2ES2(), false);
}
-
+
if(DEBUG_DRAW) {
System.err.println("ImmModeSink.draw["+i+"].0 (disableBufferAfterDraw: "+disableBufferAfterDraw+"):\n\t"+this);
}
-
+
if (buffer!=null) {
if(null==indices) {
if ( GL_QUADS == mode && !gl.isGL2() ) {
@@ -523,7 +524,7 @@ public class ImmModeSink {
}
} else {
// FIXME: Impl. VBO usage .. or unroll.
- if( !gl.getContext().isCPUDataSourcingAvail() ) {
+ if( !gl.getContext().isCPUDataSourcingAvail() ) {
throw new GLException("CPU data sourcing n/a w/ "+gl.getContext());
}
final int type;
@@ -538,23 +539,23 @@ public class ImmModeSink {
}
final int idxLen = indices.remaining();
final int idx0 = indices.position();
-
+
if ( GL_QUADS == mode && !gl.isGL2() ) {
if( GL.GL_UNSIGNED_BYTE == type ) {
final ByteBuffer b = (ByteBuffer) indices;
for (int j = 0; j < idxLen; j++) {
gl.glDrawArrays(GL.GL_TRIANGLE_FAN, (int)(0x000000ff & b.get(idx0+j)), 4);
- }
+ }
} else if( GL.GL_UNSIGNED_SHORT == type ){
final ShortBuffer b = (ShortBuffer) indices;
for (int j = 0; j < idxLen; j++) {
gl.glDrawArrays(GL.GL_TRIANGLE_FAN, (int)(0x0000ffff & b.get(idx0+j)), 4);
- }
+ }
} else {
final IntBuffer b = (IntBuffer) indices;
for (int j = 0; j < idxLen; j++) {
gl.glDrawArrays(GL.GL_TRIANGLE_FAN, (int)(0xffffffff & b.get(idx0+j)), 4);
- }
+ }
}
} else {
((GL2ES1)gl).glDrawElements(mode, idxLen, type, indices);
@@ -566,7 +567,7 @@ public class ImmModeSink {
if(disableBufferAfterDraw) {
enableBuffer(gl, false);
}
-
+
if(DEBUG_DRAW) {
System.err.println("ImmModeSink.draw["+i+"].X (disableBufferAfterDraw: "+disableBufferAfterDraw+")");
}
@@ -592,7 +593,7 @@ public class ImmModeSink {
public void glVertex2b(byte x, byte y) {
checkSeal(false);
growBuffer(VERTEX);
- if(vComps>0)
+ if(vComps>0)
Buffers.putNb(vertexArray, vDataTypeSigned, x, true);
if(vComps>1)
Buffers.putNb(vertexArray, vDataTypeSigned, y, true);
@@ -614,7 +615,7 @@ public class ImmModeSink {
growBuffer(VERTEX);
if(vComps>0)
Buffers.putNs(vertexArray, vDataTypeSigned, x, true);
- if(vComps>1)
+ if(vComps>1)
Buffers.putNs(vertexArray, vDataTypeSigned, y, true);
countAndPadding(VERTEX, vComps-2);
}
@@ -623,16 +624,16 @@ public class ImmModeSink {
growBuffer(VERTEX);
if(vComps>0)
Buffers.putNs(vertexArray, vDataTypeSigned, x, true);
- if(vComps>1)
+ if(vComps>1)
Buffers.putNs(vertexArray, vDataTypeSigned, y, true);
- if(vComps>2)
+ if(vComps>2)
Buffers.putNs(vertexArray, vDataTypeSigned, z, true);
countAndPadding(VERTEX, vComps-3);
}
public void glVertex2f(float x, float y) {
checkSeal(false);
growBuffer(VERTEX);
- if(vComps>0)
+ if(vComps>0)
Buffers.putNf(vertexArray, vDataTypeSigned, x);
if(vComps>1)
Buffers.putNf(vertexArray, vDataTypeSigned, y);
@@ -641,11 +642,11 @@ public class ImmModeSink {
public void glVertex3f(float x, float y, float z) {
checkSeal(false);
growBuffer(VERTEX);
- if(vComps>0)
+ if(vComps>0)
Buffers.putNf(vertexArray, vDataTypeSigned, x);
if(vComps>1)
Buffers.putNf(vertexArray, vDataTypeSigned, y);
- if(vComps>2)
+ if(vComps>2)
Buffers.putNf(vertexArray, vDataTypeSigned, z);
countAndPadding(VERTEX, vComps-3);
}
@@ -653,33 +654,33 @@ public class ImmModeSink {
public void glNormal3b(byte x, byte y, byte z) {
checkSeal(false);
growBuffer(NORMAL);
- if(nComps>0)
+ if(nComps>0)
Buffers.putNb(normalArray, nDataTypeSigned, x, true);
- if(nComps>1)
+ if(nComps>1)
Buffers.putNb(normalArray, nDataTypeSigned, y, true);
- if(nComps>2)
+ if(nComps>2)
Buffers.putNb(normalArray, nDataTypeSigned, z, true);
countAndPadding(NORMAL, nComps-3);
}
public void glNormal3s(short x, short y, short z) {
checkSeal(false);
growBuffer(NORMAL);
- if(nComps>0)
+ if(nComps>0)
Buffers.putNs(normalArray, nDataTypeSigned, x, true);
- if(nComps>1)
+ if(nComps>1)
Buffers.putNs(normalArray, nDataTypeSigned, y, true);
- if(nComps>2)
+ if(nComps>2)
Buffers.putNs(normalArray, nDataTypeSigned, z, true);
countAndPadding(NORMAL, nComps-3);
}
public void glNormal3f(float x, float y, float z) {
checkSeal(false);
growBuffer(NORMAL);
- if(nComps>0)
+ if(nComps>0)
Buffers.putNf(normalArray, nDataTypeSigned, x);
if(nComps>1)
Buffers.putNf(normalArray, nDataTypeSigned, y);
- if(nComps>2)
+ if(nComps>2)
Buffers.putNf(normalArray, nDataTypeSigned, z);
countAndPadding(NORMAL, nComps-3);
}
@@ -687,96 +688,96 @@ public class ImmModeSink {
public void glColor3b(byte r, byte g, byte b) {
checkSeal(false);
growBuffer(COLOR);
- if(cComps>0)
+ if(cComps>0)
Buffers.putNb(colorArray, cDataTypeSigned, r, true);
- if(cComps>1)
+ if(cComps>1)
Buffers.putNb(colorArray, cDataTypeSigned, g, true);
- if(cComps>2)
+ if(cComps>2)
Buffers.putNb(colorArray, cDataTypeSigned, b, true);
countAndPadding(COLOR, cComps-3);
}
public void glColor3ub(byte r, byte g, byte b) {
checkSeal(false);
growBuffer(COLOR);
- if(cComps>0)
+ if(cComps>0)
Buffers.putNb(colorArray, cDataTypeSigned, r, false);
- if(cComps>1)
+ if(cComps>1)
Buffers.putNb(colorArray, cDataTypeSigned, g, false);
- if(cComps>2)
+ if(cComps>2)
Buffers.putNb(colorArray, cDataTypeSigned, b, false);
countAndPadding(COLOR, cComps-3);
}
public void glColor4b(byte r, byte g, byte b, byte a) {
checkSeal(false);
growBuffer(COLOR);
- if(cComps>0)
+ if(cComps>0)
Buffers.putNb(colorArray, cDataTypeSigned, r, true);
- if(cComps>1)
+ if(cComps>1)
Buffers.putNb(colorArray, cDataTypeSigned, g, true);
- if(cComps>2)
+ if(cComps>2)
Buffers.putNb(colorArray, cDataTypeSigned, b, true);
- if(cComps>3)
+ if(cComps>3)
Buffers.putNb(colorArray, cDataTypeSigned, a, true);
countAndPadding(COLOR, cComps-4);
}
public void glColor4ub(byte r, byte g, byte b, byte a) {
checkSeal(false);
growBuffer(COLOR);
- if(cComps>0)
+ if(cComps>0)
Buffers.putNb(colorArray, cDataTypeSigned, r, false);
- if(cComps>1)
+ if(cComps>1)
Buffers.putNb(colorArray, cDataTypeSigned, g, false);
- if(cComps>2)
+ if(cComps>2)
Buffers.putNb(colorArray, cDataTypeSigned, b, false);
- if(cComps>3)
+ if(cComps>3)
Buffers.putNb(colorArray, cDataTypeSigned, a, false);
countAndPadding(COLOR, cComps-4);
}
public void glColor3s(short r, short g, short b) {
checkSeal(false);
growBuffer(COLOR);
- if(cComps>0)
+ if(cComps>0)
Buffers.putNs(colorArray, cDataTypeSigned, r, true);
- if(cComps>1)
+ if(cComps>1)
Buffers.putNs(colorArray, cDataTypeSigned, g, true);
- if(cComps>2)
+ if(cComps>2)
Buffers.putNs(colorArray, cDataTypeSigned, b, true);
countAndPadding(COLOR, cComps-3);
}
public void glColor4s(short r, short g, short b, short a) {
checkSeal(false);
growBuffer(COLOR);
- if(cComps>0)
+ if(cComps>0)
Buffers.putNs(colorArray, cDataTypeSigned, r, true);
- if(cComps>1)
+ if(cComps>1)
Buffers.putNs(colorArray, cDataTypeSigned, g, true);
- if(cComps>2)
+ if(cComps>2)
Buffers.putNs(colorArray, cDataTypeSigned, b, true);
- if(cComps>3)
+ if(cComps>3)
Buffers.putNs(colorArray, cDataTypeSigned, a, true);
countAndPadding(COLOR, cComps-4);
}
public void glColor3f(float r, float g, float b) {
checkSeal(false);
growBuffer(COLOR);
- if(cComps>0)
+ if(cComps>0)
Buffers.putNf(colorArray, cDataTypeSigned, r);
- if(cComps>1)
+ if(cComps>1)
Buffers.putNf(colorArray, cDataTypeSigned, g);
- if(cComps>2)
+ if(cComps>2)
Buffers.putNf(colorArray, cDataTypeSigned, b);
countAndPadding(COLOR, cComps-3);
}
public void glColor4f(float r, float g, float b, float a) {
checkSeal(false);
growBuffer(COLOR);
- if(cComps>0)
+ if(cComps>0)
Buffers.putNf(colorArray, cDataTypeSigned, r);
- if(cComps>1)
+ if(cComps>1)
Buffers.putNf(colorArray, cDataTypeSigned, g);
- if(cComps>2)
+ if(cComps>2)
Buffers.putNf(colorArray, cDataTypeSigned, b);
- if(cComps>3)
+ if(cComps>3)
Buffers.putNf(colorArray, cDataTypeSigned, a);
countAndPadding(COLOR, cComps-4);
}
@@ -784,60 +785,60 @@ public class ImmModeSink {
public void glTexCoord2b(byte x, byte y) {
checkSeal(false);
growBuffer(TEXTCOORD);
- if(tComps>0)
+ if(tComps>0)
Buffers.putNb(textCoordArray, tDataTypeSigned, x, true);
- if(tComps>1)
+ if(tComps>1)
Buffers.putNb(textCoordArray, tDataTypeSigned, y, true);
countAndPadding(TEXTCOORD, tComps-2);
}
public void glTexCoord3b(byte x, byte y, byte z) {
checkSeal(false);
growBuffer(TEXTCOORD);
- if(tComps>0)
+ if(tComps>0)
Buffers.putNb(textCoordArray, tDataTypeSigned, x, true);
- if(tComps>1)
+ if(tComps>1)
Buffers.putNb(textCoordArray, tDataTypeSigned, y, true);
- if(tComps>2)
+ if(tComps>2)
Buffers.putNb(textCoordArray, tDataTypeSigned, z, true);
countAndPadding(TEXTCOORD, tComps-3);
}
public void glTexCoord2s(short x, short y) {
checkSeal(false);
growBuffer(TEXTCOORD);
- if(tComps>0)
+ if(tComps>0)
Buffers.putNs(textCoordArray, tDataTypeSigned, x, true);
- if(tComps>1)
+ if(tComps>1)
Buffers.putNs(textCoordArray, tDataTypeSigned, y, true);
countAndPadding(TEXTCOORD, tComps-2);
}
public void glTexCoord3s(short x, short y, short z) {
checkSeal(false);
growBuffer(TEXTCOORD);
- if(tComps>0)
+ if(tComps>0)
Buffers.putNs(textCoordArray, tDataTypeSigned, x, true);
- if(tComps>1)
+ if(tComps>1)
Buffers.putNs(textCoordArray, tDataTypeSigned, y, true);
- if(tComps>2)
+ if(tComps>2)
Buffers.putNs(textCoordArray, tDataTypeSigned, z, true);
countAndPadding(TEXTCOORD, tComps-3);
}
public void glTexCoord2f(float x, float y) {
checkSeal(false);
growBuffer(TEXTCOORD);
- if(tComps>0)
+ if(tComps>0)
Buffers.putNf(textCoordArray, tDataTypeSigned, x);
- if(tComps>1)
+ if(tComps>1)
Buffers.putNf(textCoordArray, tDataTypeSigned, y);
countAndPadding(TEXTCOORD, tComps-2);
}
public void glTexCoord3f(float x, float y, float z) {
checkSeal(false);
growBuffer(TEXTCOORD);
- if(tComps>0)
+ if(tComps>0)
Buffers.putNf(textCoordArray, tDataTypeSigned, x);
- if(tComps>1)
+ if(tComps>1)
Buffers.putNf(textCoordArray, tDataTypeSigned, y);
- if(tComps>2)
+ if(tComps>2)
Buffers.putNf(textCoordArray, tDataTypeSigned, z);
countAndPadding(TEXTCOORD, tComps-3);
}
@@ -864,20 +865,20 @@ public class ImmModeSink {
shaderProgram = program;
glslLocationSet = false; // enforce location reset!
}
-
+
/**
* @param gl
* @return true if all locations for all used arrays are found (min 1 array), otherwise false.
- * Also sets 'glslLocationSet' to the return value!
+ * Also sets 'glslLocationSet' to the return value!
*/
private boolean resetGLSLArrayLocation(GL2ES2 gl) {
int iA = 0;
int iL = 0;
-
+
if(null != vArrayData) {
iA++;
if( vArrayData.setLocation(gl, shaderProgram) >= 0 ) {
- iL++;
+ iL++;
}
}
if(null != cArrayData) {
@@ -901,7 +902,7 @@ public class ImmModeSink {
glslLocationSet = iA == iL;
return glslLocationSet;
}
-
+
public void destroy(GL gl) {
reset(gl);
@@ -931,7 +932,7 @@ public class ImmModeSink {
this.vElems=0;
this.cElems=0;
this.nElems=0;
- this.tElems=0;
+ this.tElems=0;
}
public void seal(GL glObj, boolean seal)
@@ -1016,20 +1017,20 @@ public class ImmModeSink {
}
} else {
gl.glBufferData(GL.GL_ARRAY_BUFFER, buffer.limit(), buffer, glBufferUsage);
- bufferWrittenOnce = true;
- }
+ bufferWrittenOnce = true;
+ }
}
-
+
private void enableBufferFixed(GL gl, boolean enable) {
GL2ES1 glf = gl.getGL2ES1();
-
+
final boolean useV = vComps>0 && vElems>0 ;
final boolean useC = cComps>0 && cElems>0 ;
final boolean useN = nComps>0 && nElems>0 ;
final boolean useT = tComps>0 && tElems>0 ;
-
+
if(DEBUG_DRAW) {
- System.err.println("ImmModeSink.enableFixed.0 "+enable+": use [ v "+useV+", c "+useC+", n "+useN+", t "+useT+"], "+getElemUseCountStr()+", "+buffer);
+ System.err.println("ImmModeSink.enableFixed.0 "+enable+": use [ v "+useV+", c "+useC+", n "+useN+", t "+useT+"], "+getElemUseCountStr()+", "+buffer);
}
if(enable) {
@@ -1038,7 +1039,7 @@ public class ImmModeSink {
throw new InternalError("Using VBO but no vboName");
}
glf.glBindBuffer(GL.GL_ARRAY_BUFFER, vboName);
-
+
if(!bufferWritten) {
writeBuffer(gl);
}
@@ -1051,7 +1052,7 @@ public class ImmModeSink {
glf.glEnableClientState(GLPointerFunc.GL_VERTEX_ARRAY);
glf.glVertexPointer(vArrayData);
} else {
- glf.glDisableClientState(GLPointerFunc.GL_VERTEX_ARRAY);
+ glf.glDisableClientState(GLPointerFunc.GL_VERTEX_ARRAY);
}
}
if(useC) {
@@ -1082,24 +1083,24 @@ public class ImmModeSink {
if(enable && useVBO) {
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
}
-
+
if(DEBUG_DRAW) {
- System.err.println("ImmModeSink.enableFixed.X ");
+ System.err.println("ImmModeSink.enableFixed.X ");
}
}
private void enableBufferGLSLShaderState(GL gl, boolean enable) {
GL2ES2 glsl = gl.getGL2ES2();
-
+
final boolean useV = vComps>0 && vElems>0 ;
final boolean useC = cComps>0 && cElems>0 ;
final boolean useN = nComps>0 && nElems>0 ;
final boolean useT = tComps>0 && tElems>0 ;
-
+
if(DEBUG_DRAW) {
- System.err.println("ImmModeSink.enableGLSL.A.0 "+enable+": use [ v "+useV+", c "+useC+", n "+useN+", t "+useT+"], "+getElemUseCountStr()+", "+buffer);
+ System.err.println("ImmModeSink.enableGLSL.A.0 "+enable+": use [ v "+useV+", c "+useC+", n "+useN+", t "+useT+"], "+getElemUseCountStr()+", "+buffer);
}
-
+
if(enable) {
if(useVBO) {
if(0 == vboName) {
@@ -1110,9 +1111,9 @@ public class ImmModeSink {
writeBuffer(gl);
}
}
- bufferWritten=true;
+ bufferWritten=true;
}
-
+
if(useV) {
if(enable) {
shaderState.enableVertexAttribArray(glsl, vArrayData);
@@ -1144,30 +1145,30 @@ public class ImmModeSink {
} else {
shaderState.disableVertexAttribArray(glsl, tArrayData);
}
- }
+ }
glslLocationSet = true; // ShaderState does set the location implicit
-
+
if(enable && useVBO) {
glsl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
}
-
+
if(DEBUG_DRAW) {
- System.err.println("ImmModeSink.enableGLSL.A.X ");
+ System.err.println("ImmModeSink.enableGLSL.A.X ");
}
}
private void enableBufferGLSLSimple(GL gl, boolean enable) {
GL2ES2 glsl = gl.getGL2ES2();
-
+
final boolean useV = vComps>0 && vElems>0 ;
final boolean useC = cComps>0 && cElems>0 ;
final boolean useN = nComps>0 && nElems>0 ;
final boolean useT = tComps>0 && tElems>0 ;
-
+
if(DEBUG_DRAW) {
- System.err.println("ImmModeSink.enableGLSL.B.0 "+enable+": use [ v "+useV+", c "+useC+", n "+useN+", t "+useT+"], "+getElemUseCountStr()+", "+buffer);
+ System.err.println("ImmModeSink.enableGLSL.B.0 "+enable+": use [ v "+useV+", c "+useC+", n "+useN+", t "+useT+"], "+getElemUseCountStr()+", "+buffer);
}
-
+
if(!glslLocationSet) {
if( !resetGLSLArrayLocation(glsl) ) {
if(DEBUG_DRAW) {
@@ -1180,7 +1181,7 @@ public class ImmModeSink {
return;
}
}
-
+
if(enable) {
if(useVBO) {
if(0 == vboName) {
@@ -1226,28 +1227,29 @@ public class ImmModeSink {
glsl.glDisableVertexAttribArray(tArrayData.getLocation());
}
}
-
+
if(enable && useVBO) {
glsl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
}
-
+
if(DEBUG_DRAW) {
- System.err.println("ImmModeSink.enableGLSL.B.X ");
+ System.err.println("ImmModeSink.enableGLSL.B.X ");
}
}
-
+
+ @Override
public String toString() {
- final String glslS = useGLSL ?
+ final String glslS = useGLSL ?
", useShaderState "+(null!=shaderState)+
", shaderProgram "+shaderProgram+
", glslLocationSet "+glslLocationSet : "";
-
- return "VBOSet[mode "+mode+
- ", modeOrig "+modeOrig+
+
+ return "VBOSet[mode "+mode+
+ ", modeOrig "+modeOrig+
", use/count "+getElemUseCountStr()+
- ", sealed "+sealed+
+ ", sealed "+sealed+
", sealedGL "+sealedGL+
- ", bufferEnabled "+bufferEnabled+
+ ", bufferEnabled "+bufferEnabled+
", bufferWritten "+bufferWritten+" (once "+bufferWrittenOnce+")"+
", useVBO "+useVBO+", vboName "+vboName+
", useGLSL "+useGLSL+
@@ -1264,7 +1266,7 @@ public class ImmModeSink {
protected String getElemUseCountStr() {
return "[v "+vElems+"/"+vCount+", c "+cElems+"/"+cCount+", n "+nElems+"/"+nCount+", t "+tElems+"/"+tCount+"]";
}
-
+
protected boolean fitElementInBuffer(int type) {
final int addElems = 1;
switch (type) {
@@ -1280,20 +1282,20 @@ public class ImmModeSink {
throw new InternalError("XXX");
}
}
-
+
protected boolean reallocateBuffer(int addElems) {
final int vAdd = addElems - ( vCount - vElems );
final int cAdd = addElems - ( cCount - cElems );
final int nAdd = addElems - ( nCount - nElems );
final int tAdd = addElems - ( tCount - tElems );
-
+
if( 0>=vAdd && 0>=cAdd && 0>=nAdd && 0>=tAdd) {
if(DEBUG_BUFFER) {
System.err.println("ImmModeSink.realloc: "+getElemUseCountStr()+" + "+addElems+" -> NOP");
}
return false;
}
-
+
if(DEBUG_BUFFER) {
System.err.println("ImmModeSink.realloc: "+getElemUseCountStr()+" + "+addElems);
}
@@ -1301,20 +1303,20 @@ public class ImmModeSink {
cCount += cAdd;
nCount += nAdd;
tCount += tAdd;
-
+
final int vBytes = vCount * vCompsBytes;
final int cBytes = cCount * cCompsBytes;
final int nBytes = nCount * nCompsBytes;
final int tBytes = tCount * tCompsBytes;
-
+
buffer = Buffers.newDirectByteBuffer( vBytes + cBytes + nBytes + tBytes );
vOffset = 0;
-
+
if(vBytes>0) {
vertexArray = GLBuffers.sliceGLBuffer(buffer, vOffset, vBytes, vDataType);
} else {
vertexArray = null;
- }
+ }
cOffset=vOffset+vBytes;
if(cBytes>0) {
@@ -1341,36 +1343,36 @@ public class ImmModeSink {
buffer.flip();
if(vComps>0) {
- vArrayData = GLArrayDataWrapper.createFixed(GLPointerFunc.GL_VERTEX_ARRAY, vComps,
+ vArrayData = GLArrayDataWrapper.createFixed(GLPointerFunc.GL_VERTEX_ARRAY, vComps,
vDataType, GLBuffers.isGLTypeFixedPoint(vDataType), 0,
vertexArray, 0, vOffset, GL.GL_STATIC_DRAW, GL.GL_ARRAY_BUFFER);
} else {
vArrayData = null;
}
if(cComps>0) {
- cArrayData = GLArrayDataWrapper.createFixed(GLPointerFunc.GL_COLOR_ARRAY, cComps,
+ cArrayData = GLArrayDataWrapper.createFixed(GLPointerFunc.GL_COLOR_ARRAY, cComps,
cDataType, GLBuffers.isGLTypeFixedPoint(cDataType), 0,
colorArray, 0, cOffset, GL.GL_STATIC_DRAW, GL.GL_ARRAY_BUFFER);
} else {
cArrayData = null;
}
if(nComps>0) {
- nArrayData = GLArrayDataWrapper.createFixed(GLPointerFunc.GL_NORMAL_ARRAY, nComps,
+ nArrayData = GLArrayDataWrapper.createFixed(GLPointerFunc.GL_NORMAL_ARRAY, nComps,
nDataType, GLBuffers.isGLTypeFixedPoint(nDataType), 0,
normalArray, 0, nOffset, GL.GL_STATIC_DRAW, GL.GL_ARRAY_BUFFER);
} else {
nArrayData = null;
}
if(tComps>0) {
- tArrayData = GLArrayDataWrapper.createFixed(GLPointerFunc.GL_TEXTURE_COORD_ARRAY, tComps,
+ tArrayData = GLArrayDataWrapper.createFixed(GLPointerFunc.GL_TEXTURE_COORD_ARRAY, tComps,
tDataType, GLBuffers.isGLTypeFixedPoint(tDataType), 0,
textCoordArray, 0, tOffset, GL.GL_STATIC_DRAW, GL.GL_ARRAY_BUFFER);
} else {
tArrayData = null;
}
-
+
bufferWrittenOnce = false; // new buffer data storage size!
-
+
if(DEBUG_BUFFER) {
System.err.println("ImmModeSink.realloc.X: "+this.toString());
Thread.dumpStack();
@@ -1384,7 +1386,7 @@ public class ImmModeSink {
if( !fitElementInBuffer(type) ) {
// save olde values ..
final Buffer _vertexArray=vertexArray, _colorArray=colorArray, _normalArray=normalArray, _textCoordArray=textCoordArray;
-
+
if ( reallocateBuffer(resizeElementCount) ) {
if(null!=_vertexArray) {
_vertexArray.flip();
@@ -1416,7 +1418,7 @@ public class ImmModeSink {
* vec4 v = vec4(0, 0, 0, 1);
* vec4 c = vec4(0, 0, 0, 1);
* </p>
- *
+ *
* @param type
* @param fill
*/
@@ -1426,7 +1428,7 @@ public class ImmModeSink {
final Buffer dest;
final boolean dSigned;
final int e; // either 0 or 1
-
+
switch (type) {
case VERTEX:
dest = vertexArray;
@@ -1459,7 +1461,7 @@ public class ImmModeSink {
while( fill > e ) {
fill--;
- Buffers.putNf(dest, dSigned, 0f);
+ Buffers.putNf(dest, dSigned, 0f);
}
if( fill > 0 ) { // e == 1, add missing '1f end component'
Buffers.putNf(dest, dSigned, 1f);
@@ -1480,18 +1482,18 @@ public class ImmModeSink {
private static final int NORMAL = 2;
private static final int TEXTCOORD = 3;
- private int vCount, cCount, nCount, tCount; // number of elements fit in each buffer
+ private int vCount, cCount, nCount, tCount; // number of elements fit in each buffer
private int vOffset, cOffset, nOffset, tOffset; // offset of specific array in common buffer
private int vElems, cElems, nElems, tElems; // number of used elements in each buffer
- private final int vComps, cComps, nComps, tComps; // number of components for each elements [2, 3, 4]
- private final int vCompsBytes, cCompsBytes, nCompsBytes, tCompsBytes; // byte size of all components
+ private final int vComps, cComps, nComps, tComps; // number of components for each elements [2, 3, 4]
+ private final int vCompsBytes, cCompsBytes, nCompsBytes, tCompsBytes; // byte size of all components
private final int vDataType, cDataType, nDataType, tDataType;
private final boolean vDataTypeSigned, cDataTypeSigned, nDataTypeSigned, tDataTypeSigned;
private final int pageSize;
private Buffer vertexArray, colorArray, normalArray, textCoordArray;
private GLArrayDataWrapper vArrayData, cArrayData, nArrayData, tArrayData;
- private boolean sealed, sealedGL;
+ private boolean sealed, sealedGL;
private boolean bufferEnabled, bufferWritten, bufferWrittenOnce;
private boolean glslLocationSet;
}