From ab5f65da9834bb5fa7221ed0737a3d3b2d48199c Mon Sep 17 00:00:00 2001
From: phil <philjord@ihug.co.nz>
Date: Wed, 16 Nov 2016 13:33:19 +1300
Subject: ReadRaster implemented in gl2es2Pipeline

Note execute depth raster adn read depth both do not work
---
 .../org/jogamp/java3d/Jogl2es2DEPPipeline.java     |  21 +-
 .../java/org/jogamp/java3d/Jogl2es2Pipeline.java   | 260 ++++++++++++++++-----
 2 files changed, 203 insertions(+), 78 deletions(-)

(limited to 'src/main/java')

diff --git a/src/main/java/org/jogamp/java3d/Jogl2es2DEPPipeline.java b/src/main/java/org/jogamp/java3d/Jogl2es2DEPPipeline.java
index c92a485..66fb91b 100644
--- a/src/main/java/org/jogamp/java3d/Jogl2es2DEPPipeline.java
+++ b/src/main/java/org/jogamp/java3d/Jogl2es2DEPPipeline.java
@@ -31,7 +31,7 @@ abstract class Jogl2es2DEPPipeline extends Pipeline
 	public static final String VALID_FORMAT_MESSAGE = "The Gl2ES2 pipeline only supports a subset of the Geometry data types and formats. \n"//
 			+ "Coordinates must be defined and float type, colors must be float type, if defined. \n"//
 			+ "J3DGraphics2D of Canvas3D is not supported \n"//
-			+ "Rasters and Decaling is not supported. \n"//
+			+ "Decaling is not supported. \n"//
 			+ "Model Clip is not supported and must be reimplemented in shaders \n"//
 			+ "QuadArray or IndexedQuadArray cannot be supported. \n"//
 			+ "Texture Coordinate generation cannot be supported. \n" //
@@ -39,6 +39,7 @@ abstract class Jogl2es2DEPPipeline extends Pipeline
 			+ "Texture3D cannot be supported. \n"//
 			+ "Accum style anti-aliasing cannot be supported. \n"//
 			+ "RasterOps from RenderingAttributes cannot be used. \n"//
+			+ "ReadRaster for depth requires a custom shader and color read instead. \n"//
 			+ "It is strongly recomended that you use the format GeometryArray.USE_NIO_BUFFER = true. \n"//
 			+ "Note LineArray and LineStripArray will not render as nicely as the fixed function pipeline.";//
 
@@ -90,23 +91,7 @@ abstract class Jogl2es2DEPPipeline extends Pipeline
 				+ "System.setProperty(\"j3d.displaylist\", \"false\"); to avoid this issue. \n"
 				+ "Please note the recommended solution is to use NIO buffers. \n" + VALID_FORMAT_MESSAGE);
 	}
-
-	// ---------------------------------------------------------------------
-
-	//
-	// GraphicsContext3D methods
-	//
-
-	// Native method for readRaster
-	// REMOVE FOR SIMPLICITY, POSSIBLY ADD BACK LATER
-	@Override
-	@Deprecated
-	void readRaster(Context ctx, int type, int xSrcOffset, int ySrcOffset, int width, int height, int hCanvas, int imageDataType,
-			int imageFormat, Object imageBuffer, int depthFormat, Object depthBuffer)
-	{
-
-		throw new UnsupportedOperationException("Read Raster call not support in the GL2ES2 pipeline.\n" + VALID_FORMAT_MESSAGE);
-	}
+ 
 
 	// ---------------------------------------------------------------------
 
diff --git a/src/main/java/org/jogamp/java3d/Jogl2es2Pipeline.java b/src/main/java/org/jogamp/java3d/Jogl2es2Pipeline.java
index 8cc5e3d..c6997cb 100644
--- a/src/main/java/org/jogamp/java3d/Jogl2es2Pipeline.java
+++ b/src/main/java/org/jogamp/java3d/Jogl2es2Pipeline.java
@@ -494,9 +494,9 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 							gd.geoToCoordBuf2 = tmp[1];
 
 							gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf1);
-							gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.BYTES), verts, GL2ES2.GL_DYNAMIC_DRAW);
+							gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.SIZE / 8), verts, GL2ES2.GL_DYNAMIC_DRAW);
 							gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf2);
-							gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.BYTES), verts, GL2ES2.GL_DYNAMIC_DRAW);
+							gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.SIZE / 8), verts, GL2ES2.GL_DYNAMIC_DRAW);
 
 							gd.geoToCoordBufSize = verts.remaining();
 
@@ -532,14 +532,14 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 							{
 								// update 1 but set to draw 2
 								gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf1);
-								gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (verts.remaining() * Float.BYTES), verts);
+								gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (verts.remaining() * Float.SIZE / 8), verts);
 								gd.geoToCoordBuf = gd.geoToCoordBuf2;
 							}
 							else
 							{
 								// update 2 but set to draw 1
 								gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf2);
-								gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (verts.remaining() * Float.BYTES), verts);
+								gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (verts.remaining() * Float.SIZE / 8), verts);
 								gd.geoToCoordBuf = gd.geoToCoordBuf1;
 							}
 
@@ -568,7 +568,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 				{
 					clrs.position(0);
 					gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToColorBuf);
-					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, clrs.remaining() * Float.BYTES, clrs);
+					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, clrs.remaining() * Float.SIZE / 8, clrs);
 				}
 			}
 
@@ -1107,9 +1107,11 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 								gd.geoToCoordBuf2 = tmp[1];
 
 								gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf1);
-								gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.BYTES), fverts, GL2ES2.GL_DYNAMIC_DRAW);
+								gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.SIZE / 8), fverts,
+										GL2ES2.GL_DYNAMIC_DRAW);
 								gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf2);
-								gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.BYTES), fverts, GL2ES2.GL_DYNAMIC_DRAW);
+								gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.SIZE / 8), fverts,
+										GL2ES2.GL_DYNAMIC_DRAW);
 
 								gd.geoToCoordBufSize = fverts.remaining();
 
@@ -1145,14 +1147,14 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 								{
 									// update 1 but set to draw 2
 									gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf1);
-									gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (fverts.remaining() * Float.BYTES), fverts);
+									gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (fverts.remaining() * Float.SIZE / 8), fverts);
 									gd.geoToCoordBuf = gd.geoToCoordBuf2;
 								}
 								else
 								{
 									// update 2 but set to draw 1
 									gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf2);
-									gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (fverts.remaining() * Float.BYTES), fverts);
+									gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (fverts.remaining() * Float.SIZE / 8), fverts);
 									gd.geoToCoordBuf = gd.geoToCoordBuf1;
 								}
 
@@ -1190,7 +1192,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 				{
 					fclrs.position(0);
 					gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToColorBuf);
-					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, fclrs.remaining() * Float.BYTES, fclrs);
+					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, fclrs.remaining() * Float.SIZE / 8, fclrs);
 				}
 			}
 			if (normalsDefined && locs.glNormal != -1)
@@ -1201,7 +1203,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 				{
 					norms.position(0);
 					gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToNormalBuf);
-					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, norms.remaining() * Float.BYTES, norms);
+					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, norms.remaining() * Float.SIZE / 8, norms);
 				}
 			}
 
@@ -1221,7 +1223,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 							HashMap<Integer, Integer> bufIds = gd.geoToVertAttribBuf;
 							Integer bufId = bufIds.get(index);
 							gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, bufId.intValue());
-							gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, vertexAttrs.remaining() * Float.BYTES, vertexAttrs);
+							gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, vertexAttrs.remaining() * Float.SIZE / 8, vertexAttrs);
 						}
 					}
 				}
@@ -1243,7 +1245,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 							HashMap<Integer, Integer> bufIds = gd.geoToTexCoordsBuf;
 							Integer bufId = bufIds.get(texUnit);
 							gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, bufId.intValue());
-							gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, buf.remaining() * Float.BYTES, buf);
+							gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, buf.remaining() * Float.SIZE / 8, buf);
 						}
 					}
 				}
@@ -1800,9 +1802,9 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 							gd.geoToCoordBuf2 = tmp[1];
 
 							gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf1);
-							gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.BYTES), verts, GL2ES2.GL_DYNAMIC_DRAW);
+							gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.SIZE / 8), verts, GL2ES2.GL_DYNAMIC_DRAW);
 							gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf2);
-							gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.BYTES), verts, GL2ES2.GL_DYNAMIC_DRAW);
+							gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.SIZE / 8), verts, GL2ES2.GL_DYNAMIC_DRAW);
 
 							gd.geoToCoordBufSize = verts.remaining();
 
@@ -1838,14 +1840,14 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 							{
 								// update 1 but set to draw 2
 								gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf1);
-								gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (verts.remaining() * Float.BYTES), verts);
+								gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (verts.remaining() * Float.SIZE / 8), verts);
 								gd.geoToCoordBuf = gd.geoToCoordBuf2;
 							}
 							else
 							{
 								// update 2 but set to draw 1
 								gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf2);
-								gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (verts.remaining() * Float.BYTES), verts);
+								gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (verts.remaining() * Float.SIZE / 8), verts);
 								gd.geoToCoordBuf = gd.geoToCoordBuf1;
 							}
 
@@ -1874,7 +1876,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 				{
 					clrs.position(0);
 					gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToColorBuf);
-					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, clrs.remaining() * Float.BYTES, clrs);
+					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, clrs.remaining() * Float.SIZE / 8, clrs);
 				}
 			}
 
@@ -2438,10 +2440,12 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 								gd.geoToCoordBuf2 = tmp[1];
 
 								gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf1);
-								gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.BYTES), fverts, GL2ES2.GL_STATIC_DRAW);
+								gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.SIZE / 8), fverts,
+										GL2ES2.GL_STATIC_DRAW);
 
 								gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf2);
-								gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.BYTES), fverts, GL2ES2.GL_STATIC_DRAW);
+								gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.SIZE / 8), fverts,
+										GL2ES2.GL_STATIC_DRAW);
 
 								gd.geoToCoordBufSize = fverts.remaining();
 
@@ -2477,7 +2481,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 								{
 									// update 1 but set to draw 2
 									gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf1);
-									gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (fverts.remaining() * Float.BYTES), fverts);
+									gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (fverts.remaining() * Float.SIZE / 8), fverts);
 									gd.geoToCoordBuf = gd.geoToCoordBuf2;
 
 								}
@@ -2485,7 +2489,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 								{
 									// update 2 but set to draw 1
 									gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf2);
-									gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (fverts.remaining() * Float.BYTES), fverts);
+									gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, (fverts.remaining() * Float.SIZE / 8), fverts);
 									gd.geoToCoordBuf = gd.geoToCoordBuf1;
 								}
 
@@ -2522,7 +2526,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 				{
 					fclrs.position(0);
 					gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToColorBuf);
-					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, fclrs.remaining() * Float.BYTES, fclrs);
+					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, fclrs.remaining() * Float.SIZE / 8, fclrs);
 				}
 			}
 			if (normalsDefined && locs.glNormal != -1)
@@ -2533,7 +2537,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 				{
 					norms.position(0);
 					gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToNormalBuf);
-					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, norms.remaining() * Float.BYTES, norms);
+					gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, norms.remaining() * Float.SIZE / 8, norms);
 				}
 			}
 
@@ -2553,7 +2557,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 							HashMap<Integer, Integer> bufIds = gd.geoToVertAttribBuf;
 							Integer bufId = bufIds.get(index);
 							gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, bufId.intValue());
-							gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, vertexAttrs.remaining() * Float.BYTES, vertexAttrs);
+							gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, vertexAttrs.remaining() * Float.SIZE / 8, vertexAttrs);
 						}
 					}
 				}
@@ -2575,7 +2579,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 							HashMap<Integer, Integer> bufIds = gd.geoToTexCoordsBuf;
 							Integer bufId = bufIds.get(texUnit);
 							gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, bufId.intValue());
-							gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, buf.remaining() * Float.BYTES, buf);
+							gl.glBufferSubData(GL2ES2.GL_ARRAY_BUFFER, 0, buf.remaining() * Float.SIZE / 8, buf);
 						}
 					}
 				}
@@ -3484,14 +3488,14 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 						locs.genAttIndexToLoc.put(index, new Integer(attribLoc));
 					}
 				}
-				
+
 				if (DO_OUTPUT_ERRORS)
 					outputErrors(ctx);
 			}
 
 			pd.programToLocationData = locs;
 		}
-		
+
 	}
 
 	private static GeometryData loadAllBuffers(Jogl2es2Context ctx, GL2ES2 gl, GeometryArrayRetained geo, boolean ignoreVertexColors,
@@ -3525,10 +3529,10 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 				gd.geoToCoordBuf2 = tmp[1];
 				gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf1);
 				int usage = morphable ? GL2ES2.GL_DYNAMIC_DRAW : GL2ES2.GL_STATIC_DRAW;
-				gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.BYTES), fverts, usage);
+				gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.SIZE / 8), fverts, usage);
 
 				gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf2);
-				gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.BYTES), fverts, usage);
+				gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.SIZE / 8), fverts, usage);
 			}
 			else
 			{
@@ -3538,7 +3542,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 
 				gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf);
 				int usage = morphable ? GL2ES2.GL_DYNAMIC_DRAW : GL2ES2.GL_STATIC_DRAW;
-				gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.BYTES), fverts, usage);
+				gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.SIZE / 8), fverts, usage);
 			}
 			if (DO_OUTPUT_ERRORS)
 				outputErrors(ctx);
@@ -3571,7 +3575,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 						gd.geoToColorBuf = tmp[0];
 
 						gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToColorBuf);
-						gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, fclrs.remaining() * Float.BYTES, fclrs, GL2ES2.GL_STATIC_DRAW);
+						gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, fclrs.remaining() * Float.SIZE / 8, fclrs, GL2ES2.GL_STATIC_DRAW);
 					}
 					else
 					{
@@ -3636,10 +3640,10 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 					gd.geoToCoordBuf2 = tmp[1];
 					gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf1);
 					int usage = morphable ? GL2ES2.GL_DYNAMIC_DRAW : GL2ES2.GL_STATIC_DRAW;
-					gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.BYTES), fverts, usage);
+					gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.SIZE / 8), fverts, usage);
 
 					gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf2);
-					gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.BYTES), fverts, usage);
+					gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.SIZE / 8), fverts, usage);
 				}
 				else
 				{
@@ -3649,7 +3653,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 
 					gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToCoordBuf);
 					int usage = morphable ? GL2ES2.GL_DYNAMIC_DRAW : GL2ES2.GL_STATIC_DRAW;
-					gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.BYTES), fverts, usage);
+					gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (fverts.remaining() * Float.SIZE / 8), fverts, usage);
 				}
 				if (DO_OUTPUT_ERRORS)
 					outputErrors(ctx);
@@ -3677,7 +3681,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 				gd.geoToColorBuf = tmp[0];
 
 				gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToColorBuf);
-				gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, fclrs.remaining() * Float.BYTES, fclrs, GL2ES2.GL_STATIC_DRAW);
+				gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, fclrs.remaining() * Float.SIZE / 8, fclrs, GL2ES2.GL_STATIC_DRAW);
 				if (DO_OUTPUT_ERRORS)
 					outputErrors(ctx);
 
@@ -3698,7 +3702,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 				gd.geoToNormalBuf = tmp[0];
 
 				gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, gd.geoToNormalBuf);
-				gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, norms.remaining() * Float.BYTES, norms, GL2ES2.GL_STATIC_DRAW);
+				gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, norms.remaining() * Float.SIZE / 8, norms, GL2ES2.GL_STATIC_DRAW);
 				if (DO_OUTPUT_ERRORS)
 					outputErrors(ctx);
 
@@ -3731,7 +3735,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 					bufIds.put(index, bufId);
 
 					gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, bufId.intValue());
-					gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, vertexAttrs.remaining() * Float.BYTES, vertexAttrs, GL2ES2.GL_STATIC_DRAW);
+					gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, vertexAttrs.remaining() * Float.SIZE / 8, vertexAttrs, GL2ES2.GL_STATIC_DRAW);
 					if (DO_OUTPUT_ERRORS)
 						outputErrors(ctx);
 
@@ -3770,7 +3774,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 						bufId = new Integer(tmp[0]);
 
 						gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, bufId.intValue());
-						gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, buf.remaining() * Float.BYTES, buf, GL2ES2.GL_STATIC_DRAW);
+						gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, buf.remaining() * Float.SIZE / 8, buf, GL2ES2.GL_STATIC_DRAW);
 						if (DO_OUTPUT_ERRORS)
 							outputErrors(ctx);
 						bufIds.put(texUnit, bufId);
@@ -3798,6 +3802,141 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 
 	// called by the 2 executes above
 
+	// Native method for readRaster
+	@Override
+	void readRaster(Context ctx, int type, int xSrcOffset, int ySrcOffset, int width, int height, int hCanvas, int imageDataType,
+			int imageFormat, Object imageBuffer, int depthFormat, Object depthBuffer)
+	{
+		Jogl2es2Context joglesctx = (Jogl2es2Context) ctx;
+		GL2ES2 gl = joglesctx.gl2es2();
+
+		//gl.glPixelStorei(GL2.GL_PACK_ROW_LENGTH, width);
+		gl.glPixelStorei(GL.GL_PACK_ALIGNMENT, 1);
+		if (DO_OUTPUT_ERRORS)
+			outputErrors(ctx);
+		int yAdjusted = hCanvas - height - ySrcOffset;
+
+		if ((type & Raster.RASTER_COLOR) != 0)
+		{
+			int oglFormat = 0;
+			if (imageDataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY)
+			{
+
+				switch (imageFormat)
+				{
+				case ImageComponentRetained.TYPE_BYTE_BGR:
+					oglFormat = GL2ES2.GL_BGR;
+					break;
+				case ImageComponentRetained.TYPE_BYTE_RGB:
+					oglFormat = GL2ES2.GL_RGB;
+					break;
+				case ImageComponentRetained.TYPE_BYTE_ABGR:
+					oglFormat = GL2ES2.GL_RGBA;
+					break;
+				case ImageComponentRetained.TYPE_BYTE_RGBA:
+					// all RGB types are stored as RGBA
+					oglFormat = GL2ES2.GL_RGBA;
+					break;
+				case ImageComponentRetained.TYPE_BYTE_LA:
+					// all LA types are stored as LA8
+					oglFormat = GL2ES2.GL_LUMINANCE_ALPHA;
+					break;
+				case ImageComponentRetained.TYPE_BYTE_GRAY:
+				case ImageComponentRetained.TYPE_USHORT_GRAY:
+				case ImageComponentRetained.TYPE_INT_BGR:
+				case ImageComponentRetained.TYPE_INT_RGB:
+				case ImageComponentRetained.TYPE_INT_ARGB:
+				default:
+					assert false;
+					return;
+				}
+
+				gl.glReadPixels(xSrcOffset, yAdjusted, width, height, oglFormat, GL.GL_UNSIGNED_BYTE,
+						ByteBuffer.wrap((byte[]) imageBuffer));
+				if (DO_OUTPUT_ERRORS)
+					outputErrors(ctx);
+			}
+			else if (imageDataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY)
+			{
+				int intType = GL2.GL_UNSIGNED_INT_8_8_8_8;
+				//boolean forceAlphaToOne = false;
+
+				switch (imageFormat)
+				{
+				/* GL_BGR */
+				case ImageComponentRetained.TYPE_INT_BGR: /* Assume XBGR format */
+					oglFormat = GL.GL_RGBA;
+					intType = GL2.GL_UNSIGNED_INT_8_8_8_8_REV;
+					//forceAlphaToOne = true;
+					break;
+				case ImageComponentRetained.TYPE_INT_RGB: /* Assume XRGB format */
+					//forceAlphaToOne = true;
+					/* Fall through to next case */
+				case ImageComponentRetained.TYPE_INT_ARGB:
+					oglFormat = GL2.GL_BGRA;
+					intType = GL2.GL_UNSIGNED_INT_8_8_8_8_REV;
+					break;
+				/* This method only supports 3 and 4 components formats and INT types. */
+				case ImageComponentRetained.TYPE_BYTE_LA:
+				case ImageComponentRetained.TYPE_BYTE_GRAY:
+				case ImageComponentRetained.TYPE_USHORT_GRAY:
+				case ImageComponentRetained.TYPE_BYTE_BGR:
+				case ImageComponentRetained.TYPE_BYTE_RGB:
+				case ImageComponentRetained.TYPE_BYTE_RGBA:
+				case ImageComponentRetained.TYPE_BYTE_ABGR:
+				default:
+					assert false;
+					return;
+				}
+
+				// Force Alpha to 1.0 if needed
+				//if (forceAlphaToOne
+				//{
+				//	gl.glPixelTransferf(GL2.GL_ALPHA_SCALE, 0.0f);
+				//	gl.glPixelTransferf(GL2.GL_ALPHA_BIAS, 1.0f);
+				//}
+
+				gl.glReadPixels(xSrcOffset, yAdjusted, width, height, oglFormat, intType, IntBuffer.wrap((int[]) imageBuffer));
+				if (DO_OUTPUT_ERRORS)
+					outputErrors(ctx);
+				// Restore Alpha scale and bias
+				//if (forceAlphaToOne)
+				//{
+				//	gl.glPixelTransferf(GL2.GL_ALPHA_SCALE, 1.0f);
+				//	gl.glPixelTransferf(GL2.GL_ALPHA_BIAS, 0.0f);
+				//}
+
+			}
+			else
+			{
+				assert false;
+			}
+		}
+
+		if ((type & Raster.RASTER_DEPTH) != 0)
+		{
+			throw new UnsupportedOperationException("To get depth you should use a shader that return depth info for gl2es2 then read from color");
+			/*if (depthFormat == DepthComponentRetained.DEPTH_COMPONENT_TYPE_INT)
+			{
+				// yOffset is adjusted for OpenGL - Y upward
+				gl.glReadPixels(xSrcOffset, yAdjusted, width, height, GL2.GL_DEPTH_COMPONENT, GL.GL_UNSIGNED_INT,
+						IntBuffer.wrap((int[]) depthBuffer));
+				if (DO_OUTPUT_ERRORS)
+					outputErrors(ctx);
+			}
+			else
+			{
+				// DEPTH_COMPONENT_TYPE_FLOAT
+				// yOffset is adjusted for OpenGL - Y upward
+				gl.glReadPixels(xSrcOffset, yAdjusted, width, height, GL2.GL_DEPTH_COMPONENT, GL.GL_FLOAT,
+						FloatBuffer.wrap((float[]) depthBuffer));
+				if (DO_OUTPUT_ERRORS)
+					outputErrors(ctx);
+			}*/
+		}
+
+	}
+
 	// ---------------------------------------------------------------------
 
 	//
@@ -4458,7 +4597,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 	private static int unbox(ShaderAttrLoc loc)
 	{
 		if (loc == null)
-			return -1;
+			return -1;//0 is a valid location
 		return ((JoglShaderObject) loc).getValue();
 	}
 
@@ -7470,8 +7609,8 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 
 		//NOTE .order(ByteOrder.nativeOrder())!!!
 		int vcount = 6;
-		FloatBuffer verts = ByteBuffer.allocateDirect(Float.BYTES * 3 * vcount).order(ByteOrder.nativeOrder()).asFloatBuffer();
-		FloatBuffer tcs = ByteBuffer.allocateDirect(Float.BYTES * 2 * vcount).order(ByteOrder.nativeOrder()).asFloatBuffer();
+		FloatBuffer verts = ByteBuffer.allocateDirect(Float.SIZE / 8 * 3 * vcount).order(ByteOrder.nativeOrder()).asFloatBuffer();
+		FloatBuffer tcs = ByteBuffer.allocateDirect(Float.SIZE / 8 * 2 * vcount).order(ByteOrder.nativeOrder()).asFloatBuffer();
 
 		// add a Z so we stay closer to textureFillRaster
 		float mapZ = 0f;
@@ -7504,11 +7643,11 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 		if (DO_OUTPUT_ERRORS)
 			outputErrors(ctx);
 		gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, vertBufId);
-		gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.BYTES), verts, GL2ES2.GL_STREAM_DRAW);
+		gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.SIZE / 8), verts, GL2ES2.GL_STREAM_DRAW);
 		if (DO_OUTPUT_ERRORS)
 			outputErrors(ctx);
 		gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, tcBufId);
-		gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (tcs.remaining() * Float.BYTES), tcs, GL2ES2.GL_STREAM_DRAW);
+		gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (tcs.remaining() * Float.SIZE / 8), tcs, GL2ES2.GL_STREAM_DRAW);
 		if (DO_OUTPUT_ERRORS)
 			outputErrors(ctx);
 
@@ -7599,7 +7738,7 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 		Jogl2es2Context jctx = (Jogl2es2Context) ctx;
 		GL2ES2 gl = jctx.gl2es2();
 
-		disableAttribForRaster(gl); 
+		disableAttribForRaster(gl);
 
 		// Setup filter mode if needed 
 		if (useBilinearFilter)
@@ -7622,8 +7761,8 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 
 		//NOTE .order(ByteOrder.nativeOrder())!!!
 		int vcount = 6;
-		FloatBuffer verts = ByteBuffer.allocateDirect(Float.BYTES * 3 * vcount).order(ByteOrder.nativeOrder()).asFloatBuffer();
-		FloatBuffer tcs = ByteBuffer.allocateDirect(Float.BYTES * 2 * vcount).order(ByteOrder.nativeOrder()).asFloatBuffer();
+		FloatBuffer verts = ByteBuffer.allocateDirect(Float.SIZE / 8 * 3 * vcount).order(ByteOrder.nativeOrder()).asFloatBuffer();
+		FloatBuffer tcs = ByteBuffer.allocateDirect(Float.SIZE / 8 * 2 * vcount).order(ByteOrder.nativeOrder()).asFloatBuffer();
 
 		texMinV = 1 - texMinV;//Y-up has flipped them?
 		texMaxV = 1 - texMaxV;//Y-up has flipped them
@@ -7653,11 +7792,11 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 		if (DO_OUTPUT_ERRORS)
 			outputErrors(ctx);
 		gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, vertBufId);
-		gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.BYTES), verts, GL2ES2.GL_STREAM_DRAW);
+		gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (verts.remaining() * Float.SIZE / 8), verts, GL2ES2.GL_STREAM_DRAW);
 		if (DO_OUTPUT_ERRORS)
 			outputErrors(ctx);
 		gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, tcBufId);
-		gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (tcs.remaining() * Float.BYTES), tcs, GL2ES2.GL_STREAM_DRAW);
+		gl.glBufferData(GL2ES2.GL_ARRAY_BUFFER, (tcs.remaining() * Float.SIZE / 8), tcs, GL2ES2.GL_STREAM_DRAW);
 		if (DO_OUTPUT_ERRORS)
 			outputErrors(ctx);
 
@@ -7744,20 +7883,21 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 	{
 		if (VERBOSE)
 			System.err.println("JoglPipeline.executeRasterDepth()");
-		GLContext context = context(ctx);
-		GL2 gl = context.getGL().getGL2();
-
+		Jogl2es2Context jctx = (Jogl2es2Context) ctx;
+		GL2ES2 gl = jctx.gl2es2();
+		throw new UnsupportedOperationException("To get depth you should use a shader that return depth info for gl2es2 then read from color");
+		/*
 		gl.glRasterPos3f(posX, posY, posZ);
 
 		int[] drawBuf = new int[1];
 		gl.glGetIntegerv(GL2.GL_DRAW_BUFFER, drawBuf, 0);
-		/* disable draw buffer */
+		// disable draw buffer 
 		gl.glDrawBuffer(GL.GL_NONE);
 
-		/*
-		 * raster position is upper left corner, default for Java3D
-		 * ImageComponent currently has the data reverse in Y
-		 */
+		
+		 // raster position is upper left corner, default for Java3D
+		 // ImageComponent currently has the data reverse in Y
+		 
 		gl.glPixelZoom(1.0f, -1.0f);
 		gl.glPixelStorei(GL2.GL_UNPACK_ROW_LENGTH, depthWidth);
 		if (srcOffsetX >= 0)
@@ -7798,17 +7938,17 @@ class Jogl2es2Pipeline extends Jogl2es2DEPPipeline
 			gl.glDrawPixels(rasterWidth, rasterHeight, GL2.GL_DEPTH_COMPONENT, GL.GL_UNSIGNED_INT, IntBuffer.wrap((int[]) depthData));
 		}
 		else
-		{ /* DepthComponentRetained.DEPTH_COMPONENT_TYPE_FLOAT */
+		{ // DepthComponentRetained.DEPTH_COMPONENT_TYPE_FLOAT 
 			gl.glDrawPixels(rasterWidth, rasterHeight, GL2.GL_DEPTH_COMPONENT, GL.GL_FLOAT, FloatBuffer.wrap((float[]) depthData));
 		}
 
-		/* re-enable draw buffer */
+		// re-enable draw buffer 
 		gl.glDrawBuffer(drawBuf[0]);
 
 		gl.glPixelStorei(GL2.GL_UNPACK_ROW_LENGTH, 0);
 		gl.glPixelStorei(GL2.GL_UNPACK_SKIP_PIXELS, 0);
 		gl.glPixelStorei(GL2.GL_UNPACK_SKIP_ROWS, 0);
-
+*/
 	}
 
 	/**
-- 
cgit v1.2.3