aboutsummaryrefslogtreecommitdiffstats
path: root/src/javax/media/j3d/JoglPipeline.java
diff options
context:
space:
mode:
authorJulien Gouesse <[email protected]>2015-11-28 15:11:48 +0100
committerJulien Gouesse <[email protected]>2015-11-28 15:11:48 +0100
commitdbc98deea1884e44da2c74d6ea807253cdefa693 (patch)
tree29c3ee7dea82d7dd773d81f33f645dde67e43a17 /src/javax/media/j3d/JoglPipeline.java
parent2c99f1329dc55bd496bce91b9aba956ecba3c67e (diff)
Relocate package prefix to org.jogamp.java3d
Diffstat (limited to 'src/javax/media/j3d/JoglPipeline.java')
-rw-r--r--src/javax/media/j3d/JoglPipeline.java8963
1 files changed, 0 insertions, 8963 deletions
diff --git a/src/javax/media/j3d/JoglPipeline.java b/src/javax/media/j3d/JoglPipeline.java
deleted file mode 100644
index 2f38fd8..0000000
--- a/src/javax/media/j3d/JoglPipeline.java
+++ /dev/null
@@ -1,8963 +0,0 @@
-/*
- * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- */
-
-package javax.media.j3d;
-
-import java.awt.BorderLayout;
-import java.awt.Canvas;
-import java.awt.DisplayMode;
-import java.awt.EventQueue;
-import java.awt.Frame;
-import java.awt.GraphicsConfigTemplate;
-import java.awt.GraphicsConfiguration;
-import java.awt.GraphicsDevice;
-import java.awt.GraphicsEnvironment;
-import java.io.UnsupportedEncodingException;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.nio.Buffer;
-import java.nio.ByteBuffer;
-import java.nio.DoubleBuffer;
-import java.nio.FloatBuffer;
-import java.nio.IntBuffer;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import com.jogamp.nativewindow.AbstractGraphicsDevice;
-import com.jogamp.nativewindow.AbstractGraphicsScreen;
-import com.jogamp.nativewindow.CapabilitiesChooser;
-import com.jogamp.nativewindow.GraphicsConfigurationFactory;
-import com.jogamp.nativewindow.NativeSurface;
-import com.jogamp.nativewindow.NativeWindowFactory;
-import com.jogamp.nativewindow.ProxySurface;
-import com.jogamp.nativewindow.UpstreamSurfaceHook;
-import com.jogamp.nativewindow.VisualIDHolder;
-import com.jogamp.opengl.DefaultGLCapabilitiesChooser;
-import com.jogamp.opengl.GL;
-import com.jogamp.opengl.GL2;
-import com.jogamp.opengl.GLCapabilities;
-import com.jogamp.opengl.GLCapabilitiesChooser;
-import com.jogamp.opengl.GLCapabilitiesImmutable;
-import com.jogamp.opengl.GLContext;
-import com.jogamp.opengl.GLDrawable;
-import com.jogamp.opengl.GLDrawableFactory;
-import com.jogamp.opengl.GLException;
-import com.jogamp.opengl.GLFBODrawable;
-import com.jogamp.opengl.GLProfile;
-import com.jogamp.opengl.Threading;
-
-import com.jogamp.common.nio.Buffers;
-import com.jogamp.nativewindow.awt.AWTGraphicsConfiguration;
-import com.jogamp.nativewindow.awt.AWTGraphicsDevice;
-import com.jogamp.nativewindow.awt.AWTGraphicsScreen;
-import com.jogamp.nativewindow.awt.JAWTWindow;
-import com.jogamp.opengl.FBObject;
-
-/**
- * Concrete implementation of Pipeline class for the JOGL rendering
- * pipeline.
- */
-class JoglPipeline extends Pipeline {
- // Currently prints for entry points not yet implemented
- private static final boolean DEBUG = true;
- // Currently prints for entry points already implemented
- private static final boolean VERBOSE = false;
- // Debugging output for graphics configuration selection
- private static final boolean DEBUG_CONFIG = false;
- // Prints extra debugging information
- private static final boolean EXTRA_DEBUGGING = false;
- // Number of milliseconds to wait for windows to pop up on screen
- private static final int WAIT_TIME = 1000;
- // Configurable constant just in case we want to change this later
- private static final int MIN_FRAME_SIZE = 1;
-
- private GLProfile profile;
-
- private Object mainThreadContext; // Fix for Bug 983
-
- /**
- * Constructor for singleton JoglPipeline instance
- */
- protected JoglPipeline() {
- // Fix for Bug 983
- try {
- // Retrieve main thread AppContext instance by reflection
- mainThreadContext = Class.forName("sun.awt.AppContext").getMethod("getAppContext").invoke(null);
- } catch (final Throwable ex) {
- // Let's consider app context is not necessary for the program
- }
- }
-
- /**
- * Initialize the pipeline
- */
- @Override
- void initialize(Pipeline.Type pipelineType) {
- super.initialize(pipelineType);
-
- assert pipelineType == Pipeline.Type.JOGL;
-
- // Java3D maintains strict control over which threads perform OpenGL work
- Threading.disableSingleThreading();
-
- profile = GLProfile.getMaxFixedFunc(true);
- // TODO: finish this with any other needed initialization
- }
-
- // ---------------------------------------------------------------------
-
- //
- // GeometryArrayRetained methods
- //
-
- // used for GeometryArrays by Copy or interleaved
- @Override
- void execute(Context ctx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale,
- boolean useAlpha,
- boolean ignoreVertexColors,
- int startVIndex, int vcount, int vformat,
- int texCoordSetCount, int[] texCoordSetMap,
- int texCoordSetMapLen,
- int[] texUnitOffset,
- int numActiveTexUnitState,
- int vertexAttrCount, int[] vertexAttrSizes,
- float[] varray, float[] carray, int cDirty) {
- if (VERBOSE) System.err.println("JoglPipeline.execute()");
-
- executeGeometryArray(ctx, geo, geo_type, isNonUniformScale, useAlpha,
- ignoreVertexColors, startVIndex, vcount, vformat,
- texCoordSetCount, texCoordSetMap, texCoordSetMapLen,
- texUnitOffset, numActiveTexUnitState,
- vertexAttrCount, vertexAttrSizes,
- varray, null, carray, cDirty);
- }
-
- // used by GeometryArray by Reference with java arrays
- @Override
- void executeVA(Context ctx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale,
- boolean ignoreVertexColors,
- int vcount,
- int vformat,
- int vdefined,
- int initialCoordIndex, float[] vfcoords, double[] vdcoords,
- int initialColorIndex, float[] cfdata, byte[] cbdata,
- int initialNormalIndex, float[] ndata,
- int vertexAttrCount, int[] vertexAttrSizes,
- int[] vertexAttrIndices, float[][] vertexAttrData,
- int texCoordMapLength,
- int[] texcoordoffset,
- int numActiveTexUnitState,
- int[] texIndex, int texstride, Object[] texCoords,
- int cdirty) {
- if (VERBOSE) System.err.println("JoglPipeline.executeVA()");
-
- boolean floatCoordDefined = ((vdefined & GeometryArrayRetained.COORD_FLOAT) != 0);
- boolean doubleCoordDefined = ((vdefined & GeometryArrayRetained.COORD_DOUBLE) != 0);
- boolean floatColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_FLOAT) != 0);
- boolean byteColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_BYTE) != 0);
- boolean normalsDefined = ((vdefined & GeometryArrayRetained.NORMAL_FLOAT) != 0);
- boolean vattrDefined = ((vdefined & GeometryArrayRetained.VATTR_FLOAT) != 0);
- boolean textureDefined = ((vdefined & GeometryArrayRetained.TEXCOORD_FLOAT) != 0);
-
- FloatBuffer fverts = null;
- DoubleBuffer dverts = null;
- FloatBuffer fclrs = null;
- ByteBuffer bclrs = null;
- FloatBuffer[] texCoordBufs = null;
- FloatBuffer norms = null;
- FloatBuffer[] vertexAttrBufs = null;
-
- // Get vertex attribute arrays
- if (vattrDefined) {
- vertexAttrBufs = getVertexAttrSetBuffer(vertexAttrData);
- }
-
- // get texture arrays
- if (textureDefined) {
- texCoordBufs = getTexCoordSetBuffer(texCoords);
- }
-
- // get coordinate array
- if (floatCoordDefined) {
- fverts = getVertexArrayBuffer(vfcoords);
- } else if (doubleCoordDefined) {
- dverts = getVertexArrayBuffer(vdcoords);
- }
-
- // get color array
- if (floatColorsDefined) {
- fclrs = getColorArrayBuffer(cfdata);
- } else if (byteColorsDefined) {
- bclrs = getColorArrayBuffer(cbdata);
- }
-
- // get normal array
- if (normalsDefined) {
- norms = getNormalArrayBuffer(ndata);
- }
-
- int[] sarray = null;
- int[] start_array = null;
- int strip_len = 0;
- if (geo_type == GeometryRetained.GEO_TYPE_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_LINE_STRIP_SET) {
- sarray = ((GeometryStripArrayRetained) geo).stripVertexCounts;
- strip_len = sarray.length;
- start_array = ((GeometryStripArrayRetained) geo).stripStartOffsetIndices;
- }
-
- executeGeometryArrayVA(ctx, geo, geo_type,
- isNonUniformScale, ignoreVertexColors,
- vcount, vformat, vdefined,
- initialCoordIndex, fverts, dverts,
- initialColorIndex, fclrs, bclrs,
- initialNormalIndex, norms,
- vertexAttrCount, vertexAttrSizes,
- vertexAttrIndices, vertexAttrBufs,
- texCoordMapLength,
- texcoordoffset, numActiveTexUnitState,
- texIndex, texstride, texCoordBufs, cdirty,
- sarray, strip_len, start_array);
- }
-
- // used by GeometryArray by Reference with NIO buffer
- @Override
- void executeVABuffer(Context ctx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale,
- boolean ignoreVertexColors,
- int vcount,
- int vformat,
- int vdefined,
- int initialCoordIndex,
- Buffer vcoords,
- int initialColorIndex,
- Buffer cdataBuffer,
- float[] cfdata, byte[] cbdata,
- int initialNormalIndex, FloatBuffer ndata,
- int vertexAttrCount, int[] vertexAttrSizes,
- int[] vertexAttrIndices, FloatBuffer[] vertexAttrData,
- int texCoordMapLength,
- int[] texcoordoffset,
- int numActiveTexUnitState,
- int[] texIndex, int texstride, Object[] texCoords,
- int cdirty) {
- if (VERBOSE) System.err.println("JoglPipeline.executeVABuffer()");
-
- boolean floatCoordDefined = ((vdefined & GeometryArrayRetained.COORD_FLOAT) != 0);
- boolean doubleCoordDefined = ((vdefined & GeometryArrayRetained.COORD_DOUBLE) != 0);
- boolean floatColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_FLOAT) != 0);
- boolean byteColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_BYTE) != 0);
- boolean normalsDefined = ((vdefined & GeometryArrayRetained.NORMAL_FLOAT) != 0);
- boolean vattrDefined = ((vdefined & GeometryArrayRetained.VATTR_FLOAT) != 0);
- boolean textureDefined = ((vdefined & GeometryArrayRetained.TEXCOORD_FLOAT) != 0);
-
- FloatBuffer fverts = null;
- DoubleBuffer dverts = null;
- FloatBuffer fclrs = null;
- ByteBuffer bclrs = null;
- FloatBuffer[] texCoordBufs = null;
- FloatBuffer norms = null;
- FloatBuffer[] vertexAttrBufs = null;
-
- // Get vertex attribute arrays
- if (vattrDefined)
- vertexAttrBufs = vertexAttrData;
-
- // get texture arrays
- if (textureDefined) {
- texCoordBufs = new FloatBuffer[texCoords.length];
- for (int i = 0; i < texCoords.length; i++) {
- texCoordBufs[i] = (FloatBuffer) texCoords[i];
- }
- }
-
- // get coordinate array
- if (floatCoordDefined) {
- fverts = (FloatBuffer) vcoords;
- } else if (doubleCoordDefined) {
- dverts = (DoubleBuffer) vcoords;
- }
-
- if (fverts == null && dverts == null) {
- return;
- }
-
- // get color array
- if (floatColorsDefined) {
- if (cfdata != null)
- fclrs = getColorArrayBuffer(cfdata);
- else
- fclrs = (FloatBuffer) cdataBuffer;
- } else if (byteColorsDefined) {
- if (cbdata != null)
- bclrs = getColorArrayBuffer(cbdata);
- else
- bclrs = (ByteBuffer) cdataBuffer;
- }
-
- // get normal array
- if (normalsDefined) {
- norms = ndata;
- }
-
- int[] sarray = null;
- int[] start_array = null;
- int strip_len = 0;
- if (geo_type == GeometryRetained.GEO_TYPE_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_LINE_STRIP_SET) {
- sarray = ((GeometryStripArrayRetained) geo).stripVertexCounts;
- strip_len = sarray.length;
- start_array = ((GeometryStripArrayRetained) geo).stripStartOffsetIndices;
- }
-
- executeGeometryArrayVA(ctx, geo, geo_type,
- isNonUniformScale, ignoreVertexColors,
- vcount, vformat, vdefined,
- initialCoordIndex, fverts, dverts,
- initialColorIndex, fclrs, bclrs,
- initialNormalIndex, norms,
- vertexAttrCount, vertexAttrSizes,
- vertexAttrIndices, vertexAttrBufs,
- texCoordMapLength,
- texcoordoffset, numActiveTexUnitState,
- texIndex, texstride, texCoordBufs, cdirty,
- sarray, strip_len, start_array);
- }
-
- // used by GeometryArray by Reference in interleaved format with NIO buffer
- @Override
- void executeInterleavedBuffer(Context ctx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale,
- boolean useAlpha,
- boolean ignoreVertexColors,
- int startVIndex, int vcount, int vformat,
- int texCoordSetCount, int[] texCoordSetMap,
- int texCoordSetMapLen,
- int[] texUnitOffset,
- int numActiveTexUnit,
- FloatBuffer varray, float[] cdata, int cdirty) {
- if (VERBOSE) System.err.println("JoglPipeline.executeInterleavedBuffer()");
-
- executeGeometryArray(ctx, geo, geo_type,
- isNonUniformScale, useAlpha, ignoreVertexColors,
- startVIndex, vcount, vformat,
- texCoordSetCount, texCoordSetMap, texCoordSetMapLen,
- texUnitOffset, numActiveTexUnit, 0, null,
- null, varray, cdata, cdirty);
- }
-
- @Override
- void setVertexFormat(Context ctx, GeometryArrayRetained geo,
- int vformat, boolean useAlpha, boolean ignoreVertexColors) {
- if (VERBOSE) System.err.println("JoglPipeline.setVertexFormat()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- // Enable and disable the appropriate pointers
- if ((vformat & GeometryArray.NORMALS) != 0) {
- gl.glEnableClientState(GL2.GL_NORMAL_ARRAY);
- } else {
- gl.glDisableClientState(GL2.GL_NORMAL_ARRAY);
- }
- if (!ignoreVertexColors && ((vformat & GeometryArray.COLOR) != 0)) {
- gl.glEnableClientState(GL2.GL_COLOR_ARRAY);
- } else {
- gl.glDisableClientState(GL2.GL_COLOR_ARRAY);
- }
-
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
- } else {
- gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
- }
- }
-
- // used for GeometryArrays
- @Override
- void buildGA(Context ctx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale, boolean updateAlpha,
- float alpha,
- boolean ignoreVertexColors,
- int startVIndex,
- int vcount, int vformat,
- int texCoordSetCount, int[] texCoordSetMap,
- int texCoordSetMapLen, int[] texCoordSetMapOffset,
- int vertexAttrCount, int[] vertexAttrSizes,
- double[] xform, double[] nxform,
- float[] varray) {
- if (VERBOSE) System.err.println("JoglPipeline.buildGA()");
- JoglContext jctx = (JoglContext) ctx;
- GL2 gl = context(ctx).getGL().getGL2();
- FloatBuffer verts = null;
- int stride = 0, coordoff = 0, normoff = 0, coloroff = 0, texCoordoff = 0;
- int texStride = 0;
- int vAttrOff = 0;
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- stride += 3;
- }
- if ((vformat & GeometryArray.NORMALS) != 0) {
- stride += 3;
- coordoff += 3;
- }
-
- if ((vformat & GeometryArray.COLOR) != 0) {
- if ((vformat & GeometryArray.BY_REFERENCE) != 0) {
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) {
- stride += 4;
- normoff += 4;
- coordoff += 4;
- } else {
- stride += 3;
- normoff += 3;
- coordoff += 3;
- }
- } else {
- stride += 4;
- normoff += 4;
- coordoff += 4;
- }
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) {
- texStride = 2 * texCoordSetCount;
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_3) != 0) {
- texStride = 3 * texCoordSetCount;
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_4) != 0) {
- texStride = 4 * texCoordSetCount;
- }
- stride += texStride;
- normoff += texStride;
- coloroff += texStride;
- coordoff += texStride;
- }
-
- int vAttrStride = 0;
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- for (int i = 0; i < vertexAttrCount; i++) {
- vAttrStride += vertexAttrSizes[i];
- }
- stride += vAttrStride;
- normoff += vAttrStride;
- coloroff += vAttrStride;
- coordoff += vAttrStride;
- texCoordoff += vAttrStride;
- }
-
- int bstride = stride * Buffers.SIZEOF_FLOAT;
- // Start sending down from the startVIndex
- int initialOffset = startVIndex * stride;
- normoff += initialOffset;
- coloroff += initialOffset;
- coordoff += initialOffset;
- texCoordoff += initialOffset;
- vAttrOff += initialOffset;
-
- // process alpha for geometryArray without alpha
- boolean useAlpha = false;
- if (updateAlpha && !ignoreVertexColors) {
- useAlpha = true;
- }
-
- if (geo_type == GeometryRetained.GEO_TYPE_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_LINE_STRIP_SET) {
- int[] sarray = ((GeometryStripArrayRetained) geo).stripVertexCounts;
-
- int primType = 0;
- switch (geo_type) {
- case GeometryRetained.GEO_TYPE_TRI_STRIP_SET :
- primType = GL.GL_TRIANGLE_STRIP;
- break;
- case GeometryRetained.GEO_TYPE_TRI_FAN_SET :
- primType = GL.GL_TRIANGLE_FAN;
- break;
- case GeometryRetained.GEO_TYPE_LINE_STRIP_SET :
- primType = GL.GL_LINE_STRIP;
- break;
- }
-
- if (ignoreVertexColors) {
- vformat &= ~GeometryArray.COLOR;
- }
-
- for (int i = 0; i < sarray.length; i++) {
- gl.glBegin(primType);
- for (int j = 0; j < sarray[i]; j++) {
- if ((vformat & GeometryArray.NORMALS) != 0) {
- if (nxform != null) {
- float nx = (float) (nxform[0] * varray[normoff] +
- nxform[1] * varray[normoff+1] +
- nxform[2] * varray[normoff+2]);
- float ny = (float) (nxform[4] * varray[normoff] +
- nxform[5] * varray[normoff+1] +
- nxform[6] * varray[normoff+2]);
- float nz = (float) (nxform[8] * varray[normoff] +
- nxform[9] * varray[normoff+1] +
- nxform[10] * varray[normoff+2]);
- gl.glNormal3f(nx, ny, nz);
- } else {
- gl.glNormal3f(varray[normoff], varray[normoff+1], varray[normoff+2]);
- }
- }
- if ((vformat & GeometryArray.COLOR) != 0) {
- if (useAlpha) {
- gl.glColor4f(varray[coloroff],
- varray[coloroff+1],
- varray[coloroff+2],
- varray[coloroff+3] * alpha);
- } else {
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) { // alpha is present
- gl.glColor4f(varray[coloroff],
- varray[coloroff+1],
- varray[coloroff+2],
- varray[coloroff+3]);
- } else {
- gl.glColor3f(varray[coloroff],
- varray[coloroff+1],
- varray[coloroff+2]);
- }
- }
- }
-
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- int vaOff = vAttrOff;
- if (verts == null) {
- verts = FloatBuffer.wrap(varray);
- }
- for (int vaIdx = 0; vaIdx < vertexAttrCount; vaIdx++) {
- switch (vertexAttrSizes[vaIdx]) {
- case 1:
- verts.position(vaOff);
- jctx.vertexAttr1fv(gl, vaIdx, verts);
- break;
- case 2:
- verts.position(vaOff);
- jctx.vertexAttr2fv(gl, vaIdx, verts);
- break;
- case 3:
- verts.position(vaOff);
- jctx.vertexAttr3fv(gl, vaIdx, verts);
- break;
- case 4:
- verts.position(vaOff);
- jctx.vertexAttr4fv(gl, vaIdx, verts);
- break;
- }
-
- vaOff += vertexAttrSizes[vaIdx];
- }
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- if (texCoordSetMapLen > 0) {
- if (gl.isExtensionAvailable("GL_VERSION_1_3")) {
- if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) {
- for (int k = 0; k < texCoordSetMapLen; k++) {
- if (texCoordSetMapOffset[k] != -1) {
- int off = texCoordoff + texCoordSetMapOffset[k];
- gl.glMultiTexCoord2f(GL.GL_TEXTURE0 + k,
- varray[off],
- varray[off + 1]);
- }
- }
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_3) != 0) {
- for (int k = 0; k < texCoordSetMapLen; k++) {
- if (texCoordSetMapOffset[k] != -1) {
- int off = texCoordoff + texCoordSetMapOffset[k];
- gl.glMultiTexCoord3f(GL.GL_TEXTURE0 + k,
- varray[off],
- varray[off + 1],
- varray[off + 2]);
- }
- }
- } else {
- for (int k = 0; k < texCoordSetMapLen; k++) {
- if (texCoordSetMapOffset[k] != -1) {
- int off = texCoordoff + texCoordSetMapOffset[k];
- gl.glMultiTexCoord4f(GL.GL_TEXTURE0 + k,
- varray[off],
- varray[off + 1],
- varray[off + 2],
- varray[off + 3]);
- }
- }
- }
- } else { // no multitexture
- if (texCoordSetMapOffset[0] != -1) {
- int off = texCoordoff + texCoordSetMapOffset[0];
- if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) {
- gl.glTexCoord2f(varray[off], varray[off + 1]);
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_3) != 0) {
- gl.glTexCoord3f(varray[off], varray[off + 1], varray[off + 2]);
- } else {
- gl.glTexCoord4f(varray[off], varray[off + 1], varray[off + 2], varray[off + 3]);
- }
- }
- } // no multitexture
- }
- // texCoordSetMapLen can't be 0 if texture coordinates
- // is to be specified
- }
-
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- if (xform != null) {
- // transform the vertex data with the static transform
- float w = (float) (xform[12] * varray[coordoff] +
- xform[13] * varray[coordoff+1] +
- xform[14] * varray[coordoff+2] +
- xform[15]);
- float winv = 1.0f/w;
- float vx = (float) (xform[0] * varray[coordoff] +
- xform[1] * varray[coordoff+1] +
- xform[2] * varray[coordoff+2] +
- xform[3]) * winv;
- float vy = (float) (xform[4] * varray[coordoff] +
- xform[5] * varray[coordoff+1] +
- xform[6] * varray[coordoff+2] +
- xform[7]) * winv;
- float vz = (float) (xform[8] * varray[coordoff] +
- xform[9] * varray[coordoff+1] +
- xform[10] * varray[coordoff+2] +
- xform[11]) * winv;
- gl.glVertex3f(vx, vy, vz);
- } else {
- gl.glVertex3f(varray[coordoff], varray[coordoff + 1], varray[coordoff + 2]);
- }
- }
- normoff += stride;
- coloroff += stride;
- coordoff += stride;
- texCoordoff += stride;
- vAttrOff += stride;
- }
- gl.glEnd();
- }
- } else if ((geo_type == GeometryRetained.GEO_TYPE_QUAD_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_TRI_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_POINT_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_LINE_SET)) {
- int primType = 0;
- switch (geo_type) {
- case GeometryRetained.GEO_TYPE_QUAD_SET :
- primType = GL2.GL_QUADS;
- break;
- case GeometryRetained.GEO_TYPE_TRI_SET :
- primType = GL.GL_TRIANGLES;
- break;
- case GeometryRetained.GEO_TYPE_POINT_SET :
- primType = GL.GL_POINTS;
- break;
- case GeometryRetained.GEO_TYPE_LINE_SET :
- primType = GL.GL_LINES;
- break;
- }
-
- if (ignoreVertexColors) {
- vformat &= ~GeometryArray.COLOR;
- }
-
- gl.glBegin(primType);
- for (int j = 0; j < vcount; j++) {
- if ((vformat & GeometryArray.NORMALS) != 0) {
- if (nxform != null) {
- float nx = (float) (nxform[0] * varray[normoff] +
- nxform[1] * varray[normoff+1] +
- nxform[2] * varray[normoff+2]);
- float ny = (float) (nxform[4] * varray[normoff] +
- nxform[5] * varray[normoff+1] +
- nxform[6] * varray[normoff+2]);
- float nz = (float) (nxform[8] * varray[normoff] +
- nxform[9] * varray[normoff+1] +
- nxform[10] * varray[normoff+2]);
- gl.glNormal3f(nx, ny, nz);
- } else {
- gl.glNormal3f(varray[normoff], varray[normoff + 1], varray[normoff + 2]);
- }
- }
- if ((vformat & GeometryArray.COLOR) != 0) {
- if (useAlpha) {
- float cr, cg, cb, ca;
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) {
- cr = varray[coloroff];
- cg = varray[coloroff + 1];
- cb = varray[coloroff + 2];
- ca = varray[coloroff + 3] * alpha;
- } else {
- cr = varray[coloroff];
- cg = varray[coloroff + 1];
- cb = varray[coloroff + 2];
- ca = alpha;
- }
- gl.glColor4f(cr, cg, cb, ca);
- } else {
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) { // alpha is present
- gl.glColor4f(varray[coloroff],
- varray[coloroff + 1],
- varray[coloroff + 2],
- varray[coloroff + 3]);
- } else {
- gl.glColor3f(varray[coloroff],
- varray[coloroff + 1],
- varray[coloroff + 2]);
- }
- }
- }
-
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- int vaOff = vAttrOff;
- if (verts == null) {
- verts = FloatBuffer.wrap(varray);
- }
- for (int vaIdx = 0; vaIdx < vertexAttrCount; vaIdx++) {
- switch (vertexAttrSizes[vaIdx]) {
- case 1:
- verts.position(vaOff);
- jctx.vertexAttr1fv(gl, vaIdx, verts);
- break;
- case 2:
- verts.position(vaOff);
- jctx.vertexAttr2fv(gl, vaIdx, verts);
- break;
- case 3:
- verts.position(vaOff);
- jctx.vertexAttr3fv(gl, vaIdx, verts);
- break;
- case 4:
- verts.position(vaOff);
- jctx.vertexAttr4fv(gl, vaIdx, verts);
- break;
- }
-
- vaOff += vertexAttrSizes[vaIdx];
- }
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- if (texCoordSetMapLen > 0) {
- if (gl.isExtensionAvailable("GL_VERSION_1_3")) {
- if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) {
- for (int k = 0; k < texCoordSetMapLen; k++) {
- if (texCoordSetMapOffset[k] != -1) {
- int off = texCoordoff + texCoordSetMapOffset[k];
- gl.glMultiTexCoord2f(GL.GL_TEXTURE0 + k,
- varray[off],
- varray[off + 1]);
- }
- }
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_3) != 0) {
- for (int k = 0; k < texCoordSetMapLen; k++) {
- if (texCoordSetMapOffset[k] != -1) {
- int off = texCoordoff + texCoordSetMapOffset[k];
- gl.glMultiTexCoord3f(GL.GL_TEXTURE0 + k,
- varray[off],
- varray[off + 1],
- varray[off + 2]);
- }
- }
- } else {
- for (int k = 0; k < texCoordSetMapLen; k++) {
- if (texCoordSetMapOffset[k] != -1) {
- int off = texCoordoff + texCoordSetMapOffset[k];
- gl.glMultiTexCoord4f(GL.GL_TEXTURE0 + k,
- varray[off],
- varray[off + 1],
- varray[off + 2],
- varray[off + 3]);
- }
- }
- }
- } else { // no multitexture
- if (texCoordSetMapOffset[0] != -1) {
- int off = texCoordoff + texCoordSetMapOffset[0];
- if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) {
- gl.glTexCoord2f(varray[off], varray[off + 1]);
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_3) != 0) {
- gl.glTexCoord3f(varray[off], varray[off + 1], varray[off + 2]);
- } else {
- gl.glTexCoord4f(varray[off], varray[off + 1], varray[off + 2], varray[off + 3]);
- }
- }
- } // no multitexture
- }
- // texCoordSetMapLen can't be 0 if texture coordinates is
- // to be specified
- }
-
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- if (xform != null) {
- // transform the vertex data with the static transform
- float w = (float) (xform[12] * varray[coordoff] +
- xform[13] * varray[coordoff+1] +
- xform[14] * varray[coordoff+2] +
- xform[15]);
- float winv = 1.0f/w;
- float vx = (float) (xform[0] * varray[coordoff] +
- xform[1] * varray[coordoff+1] +
- xform[2] * varray[coordoff+2] +
- xform[3]) * winv;
- float vy = (float) (xform[4] * varray[coordoff] +
- xform[5] * varray[coordoff+1] +
- xform[6] * varray[coordoff+2] +
- xform[7]) * winv;
- float vz = (float) (xform[8] * varray[coordoff] +
- xform[9] * varray[coordoff+1] +
- xform[10] * varray[coordoff+2] +
- xform[11]) * winv;
- gl.glVertex3f(vx, vy, vz);
- } else {
- gl.glVertex3f(varray[coordoff], varray[coordoff + 1], varray[coordoff + 2]);
- }
- }
- normoff += stride;
- coloroff += stride;
- coordoff += stride;
- texCoordoff += stride;
- vAttrOff += stride;
- }
- gl.glEnd();
- }
- }
-
- // used to Build Dlist GeometryArray by Reference with java arrays
- @Override
- void buildGAForByRef(Context ctx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale, boolean updateAlpha,
- float alpha,
- boolean ignoreVertexColors,
- int vcount,
- int vformat,
- int vdefined,
- int initialCoordIndex, float[] vfcoords, double[] vdcoords,
- int initialColorIndex, float[] cfdata, byte[] cbdata,
- int initialNormalIndex, float[] ndata,
- int vertexAttrCount, int[] vertexAttrSizes,
- int[] vertexAttrIndices, float[][] vertexAttrData,
- int texCoordMapLength,
- int[] tcoordsetmap,
- int[] texIndices, int texStride, Object[] texCoords,
- double[] xform, double[] nxform) {
- if (VERBOSE) System.err.println("JoglPipeline.buildGAForByRef()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- boolean floatCoordDefined = ((vdefined & GeometryArrayRetained.COORD_FLOAT) != 0);
- boolean doubleCoordDefined = ((vdefined & GeometryArrayRetained.COORD_DOUBLE) != 0);
- boolean floatColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_FLOAT) != 0);
- boolean byteColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_BYTE) != 0);
- boolean normalsDefined = ((vdefined & GeometryArrayRetained.NORMAL_FLOAT) != 0);
- boolean vattrDefined = ((vdefined & GeometryArrayRetained.VATTR_FLOAT) != 0);
- boolean textureDefined = ((vdefined & GeometryArrayRetained.TEXCOORD_FLOAT) != 0);
-
- FloatBuffer fverts = null;
- DoubleBuffer dverts = null;
- FloatBuffer fclrs = null;
- ByteBuffer bclrs = null;
- FloatBuffer[] texCoordBufs = null;
- FloatBuffer norms = null;
- FloatBuffer[] vertexAttrBufs = null;
-
- // Get vertex attribute arrays
- if (vattrDefined) {
- vertexAttrBufs = getVertexAttrSetBuffer(vertexAttrData);
- }
-
- // get texture arrays
- if (textureDefined) {
- texCoordBufs = getTexCoordSetBuffer(texCoords);
- }
-
- // process alpha for geometryArray without alpha
- boolean useAlpha = false;
- if (updateAlpha && !ignoreVertexColors) {
- useAlpha = true;
- }
-
- int[] sarray = null;
- int[] start_array = null;
- int strip_len = 0;
- if (geo_type == GeometryRetained.GEO_TYPE_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_LINE_STRIP_SET) {
- sarray = ((GeometryStripArrayRetained) geo).stripVertexCounts;
- strip_len = sarray.length;
- start_array = ((GeometryStripArrayRetained) geo).stripStartOffsetIndices;
- }
-
- if (ignoreVertexColors) {
- vformat &= ~GeometryArray.COLOR;
- floatColorsDefined = false;
- byteColorsDefined = false;
- }
-
- // get coordinate array
- if (floatCoordDefined) {
- gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
- fverts = getVertexArrayBuffer(vfcoords, (xform == null));
- if (xform != null) {
- // Must copy in and transform data
- for (int i = initialCoordIndex; i < vcount * 3; i += 3) {
- fverts.put(i , (float) (xform[0] * vfcoords[i] +
- xform[1] * vfcoords[i+1] +
- xform[2] * vfcoords[i+2]));
- fverts.put(i+1, (float) (xform[4] * vfcoords[i] +
- xform[5] * vfcoords[i+1] +
- xform[6] * vfcoords[i+2]));
- fverts.put(i+2, (float) (xform[8] * vfcoords[i] +
- xform[9] * vfcoords[i+1] +
- xform[10] * vfcoords[i+2]));
- }
- }
- } else if (doubleCoordDefined) {
- gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
- dverts = getVertexArrayBuffer(vdcoords, (xform == null));
- if (xform != null) {
- // Must copy in and transform data
- for (int i = initialCoordIndex; i < vcount * 3; i += 3) {
- dverts.put(i , (xform[0] * vdcoords[i] +
- xform[1] * vdcoords[i+1] +
- xform[2] * vdcoords[i+2]));
- dverts.put(i+1, (xform[4] * vdcoords[i] +
- xform[5] * vdcoords[i+1] +
- xform[6] * vdcoords[i+2]));
- dverts.put(i+2, (xform[8] * vdcoords[i] +
- xform[9] * vdcoords[i+1] +
- xform[10] * vdcoords[i+2]));
- }
- }
- } else {
- gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
- }
-
- // get color array
- if (floatColorsDefined) {
- gl.glEnableClientState(GL2.GL_COLOR_ARRAY);
- fclrs = getColorArrayBuffer(cfdata, !useAlpha);
- if (useAlpha) {
- // Must copy in and modify color data
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) {
- for (int i = initialColorIndex; i < vcount * 4; i += 4) {
- fclrs.put(i , cfdata[i]);
- fclrs.put(i+1, cfdata[i+1]);
- fclrs.put(i+2, cfdata[i+2]);
- fclrs.put(i+3, alpha * cfdata[i+3]);
- }
- } else {
- int k = 0;
- for (int i = initialColorIndex; i < vcount * 4; i += 4) {
- fclrs.put(i , cfdata[k++]);
- fclrs.put(i+1, cfdata[k++]);
- fclrs.put(i+2, cfdata[k++]);
- fclrs.put(i+3, alpha);
- }
- }
- vformat |= GeometryArray.WITH_ALPHA;
- }
- } else if (byteColorsDefined) {
- gl.glEnableClientState(GL2.GL_COLOR_ARRAY);
- bclrs = getColorArrayBuffer(cbdata, !useAlpha);
- if (useAlpha) {
- // Must copy in and modify color data
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) {
- for (int i = initialColorIndex; i < vcount * 4; i += 4) {
- bclrs.put(i , cbdata[i]);
- bclrs.put(i+1, cbdata[i+1]);
- bclrs.put(i+2, cbdata[i+2]);
- bclrs.put(i+3, (byte) (alpha * (int) (cbdata[i+3] & 0xFF)));
- }
- } else {
- int k = 0;
- for (int i = initialColorIndex; i < vcount * 4; i += 4) {
- bclrs.put(i , cbdata[k++]);
- bclrs.put(i+1, cbdata[k++]);
- bclrs.put(i+2, cbdata[k++]);
- bclrs.put(i+3, (byte) (alpha * 255.0f));
- }
- }
- vformat |= GeometryArray.WITH_ALPHA;
- }
- } else {
- gl.glDisableClientState(GL2.GL_COLOR_ARRAY);
- }
-
- // get normal array
- if (normalsDefined) {
- gl.glEnableClientState(GL2.GL_NORMAL_ARRAY);
- norms = getNormalArrayBuffer(ndata, (nxform == null));
- if (nxform != null) {
- // Must copy in and transform data
- for (int i = initialNormalIndex; i < vcount * 3; i += 3) {
- norms.put(i , (float) (nxform[0] * ndata[i] +
- nxform[1] * ndata[i+1] +
- nxform[2] * ndata[i+2]));
- norms.put(i+1, (float) (nxform[4] * ndata[i] +
- nxform[5] * ndata[i+1] +
- nxform[6] * ndata[i+2]));
- norms.put(i+2, (float) (nxform[8] * ndata[i] +
- nxform[9] * ndata[i+1] +
- nxform[10] * ndata[i+2]));
- }
- }
- } else {
- gl.glDisableClientState(GL2.GL_NORMAL_ARRAY);
- }
-
- executeGeometryArrayVA(ctx, geo, geo_type,
- isNonUniformScale, ignoreVertexColors,
- vcount, vformat, vdefined,
- initialCoordIndex, fverts, dverts,
- initialColorIndex, fclrs, bclrs,
- initialNormalIndex, norms,
- vertexAttrCount, vertexAttrSizes,
- vertexAttrIndices, vertexAttrBufs,
- texCoordMapLength,
- tcoordsetmap, texCoordMapLength,
- texIndices, texStride, texCoordBufs, 0,
- sarray, strip_len, start_array);
- }
-
- //----------------------------------------------------------------------
- // Private helper methods for GeometryArrayRetained
- //
-
- private void
- testForInterleavedArrays(int vformat,
- boolean[] useInterleavedArrays,
- int[] iaFormat) {
- if (VERBOSE) System.err.println("JoglPipeline.testForInterleavedArrays()");
- useInterleavedArrays[0] = true;
- switch (vformat) {
- case GeometryArray.COORDINATES :
- iaFormat[0] = GL2.GL_V3F; break;
- case (GeometryArray.COORDINATES | GeometryArray.NORMALS) :
- iaFormat[0] = GL2.GL_N3F_V3F; break;
- case (GeometryArray.COORDINATES | GeometryArray.TEXTURE_COORDINATE_2) :
- iaFormat[0] = GL2.GL_T2F_V3F; break;
- case (GeometryArray.COORDINATES | GeometryArray.NORMALS | GeometryArray.COLOR) :
- case (GeometryArray.COORDINATES | GeometryArray.NORMALS | GeometryArray.COLOR | GeometryArray.WITH_ALPHA) :
- iaFormat[0] = GL2.GL_C4F_N3F_V3F; break;
- case (GeometryArray.COORDINATES | GeometryArray.NORMALS | GeometryArray.TEXTURE_COORDINATE_2) :
- iaFormat[0] = GL2.GL_T2F_N3F_V3F; break;
- case (GeometryArray.COORDINATES | GeometryArray.NORMALS | GeometryArray.COLOR | GeometryArray.TEXTURE_COORDINATE_2):
- case (GeometryArray.COORDINATES | GeometryArray.NORMALS | GeometryArray.COLOR | GeometryArray.WITH_ALPHA | GeometryArray.TEXTURE_COORDINATE_2):
- iaFormat[0] = GL2.GL_T2F_C4F_N3F_V3F; break;
- default:
- useInterleavedArrays[0] = false; break;
- }
- }
-
- private void
- enableTexCoordPointer(GL2 gl,
- int texUnit,
- int texSize,
- int texDataType,
- int stride,
- Buffer pointer) {
- if (VERBOSE) System.err.println("JoglPipeline.enableTexCoordPointer()");
- clientActiveTextureUnit(gl, texUnit);
- gl.glEnableClientState(GL2.GL_TEXTURE_COORD_ARRAY);
- gl.glTexCoordPointer(texSize, texDataType, stride, pointer);
- }
-
- private void disableTexCoordPointer(GL2 gl, int texUnit) {
- if (VERBOSE) System.err.println("JoglPipeline.disableTexCoordPointer()");
- clientActiveTextureUnit(gl, texUnit);
- gl.glDisableClientState(GL2.GL_TEXTURE_COORD_ARRAY);
- }
-
- private void clientActiveTextureUnit(GL2 gl, int texUnit) {
- if (VERBOSE) System.err.println("JoglPipeline.clientActiveTextureUnit()");
- if (gl.isExtensionAvailable("GL_VERSION_1_3")) {
- gl.glClientActiveTexture(texUnit + GL.GL_TEXTURE0);
- }
- }
-
-
- private void
- executeTexture(int texCoordSetMapLen,
- int texSize, int bstride, int texCoordoff,
- int[] texCoordSetMapOffset,
- int numActiveTexUnit,
- FloatBuffer verts, GL2 gl) {
- if (VERBOSE) System.err.println("JoglPipeline.executeTexture()");
- int tus = 0; /* texture unit state index */
-
- for (int i = 0; i < numActiveTexUnit; i++) {
-
- tus = i;
-
- /*
- * it's possible thattexture unit state index (tus)
- * is greater than the texCoordSetMapOffsetLen, in this
- * case, just disable TexCoordPointer.
- */
- if ((tus < texCoordSetMapLen) &&
- (texCoordSetMapOffset[tus] != -1)) {
- if (EXTRA_DEBUGGING) {
- System.err.println(" texCoord position " + i + ": " + (texCoordoff + texCoordSetMapOffset[tus]));
- }
- verts.position(texCoordoff + texCoordSetMapOffset[tus]);
- enableTexCoordPointer(gl, i,
- texSize, GL.GL_FLOAT, bstride,
- verts);
- } else {
- disableTexCoordPointer(gl, i);
- }
- }
- }
-
- private void resetTexture(GL2 gl, JoglContext ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.resetTexture()");
- /* Disable texture coordinate arrays for all texture units */
- for (int i = 0; i < ctx.getMaxTexCoordSets(); i++) {
- disableTexCoordPointer(gl, i);
- }
- /* Reset client active texture unit to 0 */
- clientActiveTextureUnit(gl, 0);
- }
-
- private void
- executeGeometryArray(Context absCtx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale,
- boolean useAlpha,
- boolean ignoreVertexColors,
- int startVIndex, int vcount, int vformat,
- int texCoordSetCount, int[] texCoordSetMap,
- int texCoordSetMapLen,
- int[] texCoordSetMapOffset,
- int numActiveTexUnitState,
- int vertexAttrCount, int[] vertexAttrSizes,
- float[] varray, FloatBuffer varrayBuffer,
- float[] carray, int cDirty) {
- if (VERBOSE) System.err.println("JoglPipeline.executeGeometryArray()");
- JoglContext ctx = (JoglContext) absCtx;
- GLContext context = context(ctx);
- GL2 gl = context.getGL().getGL2();
-
- boolean useInterleavedArrays;
- int iaFormat = 0;
- int primType = 0;
- int stride = 0, coordoff = 0, normoff = 0, coloroff = 0, texCoordoff = 0;
- int texSize = 0, texStride = 0;
- int vAttrOff = 0;
- int vAttrStride = 0;
- int bstride = 0, cbstride = 0;
- FloatBuffer verts = null;
- FloatBuffer clrs = null;
- int[] sarray = null;
- int[] start_array = null;
-
- if (EXTRA_DEBUGGING) {
- System.err.println("Vertex format: " + getVertexDescription(vformat));
- System.err.println("Geometry type: " + getGeometryDescription(geo_type));
- if (carray != null) {
- System.err.println(" Separate color array");
- } else {
- System.err.println(" Colors (if any) interleaved");
- }
- }
-
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- stride += 3;
- }
- if ((vformat & GeometryArray.NORMALS) != 0) {
- stride += 3;
- coordoff += 3;
- }
- if ((vformat & GeometryArray.COLOR) != 0) {
- if ((vformat & GeometryArray.WITH_ALPHA) != 0 ) {
- stride += 4;
- normoff += 4;
- coordoff += 4;
- } else { /* Handle the case of executeInterleaved 3f */
- stride += 3;
- normoff += 3;
- coordoff += 3;
- }
- }
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- if (EXTRA_DEBUGGING) {
- System.err.println(" Number of tex coord sets: " + texCoordSetCount);
- }
- if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) {
- texSize = 2;
- texStride = 2 * texCoordSetCount;
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_3) != 0) {
- texSize = 3;
- texStride = 3 * texCoordSetCount;
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_4) != 0) {
- texSize = 4;
- texStride = 4 * texCoordSetCount;
- }
- stride += texStride;
- normoff += texStride;
- coloroff += texStride;
- coordoff += texStride;
- }
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- for (int i = 0; i < vertexAttrCount; i++) {
- vAttrStride += vertexAttrSizes[i];
- }
- stride += vAttrStride;
- normoff += vAttrStride;
- coloroff += vAttrStride;
- coordoff += vAttrStride;
- texCoordoff += vAttrStride;
- }
-
- bstride = stride * Buffers.SIZEOF_FLOAT;
-
- if (geo_type == GeometryRetained.GEO_TYPE_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_LINE_STRIP_SET) {
- sarray = ((GeometryStripArrayRetained) geo).stripVertexCounts;
- start_array = ((GeometryStripArrayRetained) geo).stripStartOffsetIndices;
- }
-
- // We have to copy if the data isn't specified using NIO
- if (varray != null) {
- verts = getVertexArrayBuffer(varray);
- } else if (varrayBuffer != null) {
- verts = varrayBuffer;
- } else {
- // This should never happen
- throw new AssertionError("Unable to get vertex pointer");
- }
-
- // using byRef interleaved array and has a separate pointer, then ..
- int cstride = stride;
- if (carray != null) {
- clrs = getColorArrayBuffer(carray);
- cstride = 4;
- } else {
- // FIXME: need to "auto-slice" this buffer later
- clrs = verts;
- }
-
- cbstride = cstride * Buffers.SIZEOF_FLOAT;
-
- // Enable normalize for non-uniform scale (which rescale can't handle)
- if (isNonUniformScale) {
- gl.glEnable(GL2.GL_NORMALIZE);
- }
-
- int startVertex = stride * startVIndex;
- int startClrs = cstride * startVIndex;
- if (clrs == verts) {
- startClrs += coloroff;
- }
-
- /*** Handle non-indexed strip GeometryArray first *******/
- if (geo_type == GeometryRetained.GEO_TYPE_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_LINE_STRIP_SET) {
- if (ignoreVertexColors || (carray != null) ||
- ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0 && ((texCoordSetMapLen > 1) ||
- (texCoordSetCount > 1)))) {
- useInterleavedArrays = false;
- } else {
- boolean[] tmp = new boolean[1];
- int[] tmp2 = new int[1];
- testForInterleavedArrays(vformat, tmp, tmp2);
- useInterleavedArrays = tmp[0];
- iaFormat = tmp2[0];
- }
- if (useInterleavedArrays) {
- verts.position(startVertex);
- gl.glInterleavedArrays(iaFormat, bstride, verts);
- } else {
- if ((vformat & GeometryArray.NORMALS) != 0) {
- verts.position(startVertex + normoff);
- gl.glNormalPointer(GL.GL_FLOAT, bstride, verts);
- }
- if (!ignoreVertexColors && (vformat & GeometryArray.COLOR) != 0) {
- if (EXTRA_DEBUGGING) {
- System.err.println(" Doing colors");
- }
- clrs.position(startClrs);
- if ((vformat & GeometryArray.WITH_ALPHA) != 0 || useAlpha) {
- gl.glColorPointer(4, GL.GL_FLOAT, cbstride, clrs);
- } else {
- gl.glColorPointer(3, GL.GL_FLOAT, cbstride, clrs);
- }
- }
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- verts.position(startVertex + coordoff);
- gl.glVertexPointer(3, GL.GL_FLOAT, bstride, verts);
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- executeTexture(texCoordSetMapLen,
- texSize, bstride, texCoordoff,
- texCoordSetMapOffset,
- numActiveTexUnitState,
- verts, gl);
- }
-
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- int vAttrOffset = startVertex + vAttrOff;
- for (int i = 0; i < vertexAttrCount; i++) {
- ctx.enableVertexAttrArray(gl, i);
- verts.position(vAttrOffset);
- ctx.vertexAttrPointer(gl, i, vertexAttrSizes[i],
- GL.GL_FLOAT, bstride, verts);
- vAttrOffset += vertexAttrSizes[i];
- }
- }
- }
-
- switch (geo_type) {
- case GeometryRetained.GEO_TYPE_TRI_STRIP_SET:
- primType = GL.GL_TRIANGLE_STRIP;
- break;
- case GeometryRetained.GEO_TYPE_TRI_FAN_SET:
- primType = GL.GL_TRIANGLE_FAN;
- break;
- case GeometryRetained.GEO_TYPE_LINE_STRIP_SET:
- primType = GL.GL_LINE_STRIP;
- break;
- }
-
- if (gl.isExtensionAvailable("GL_EXT_multi_draw_arrays")) {
- gl.glMultiDrawArrays(primType, start_array, 0, sarray, 0, sarray.length);
- } else {
- for (int i = 0; i < sarray.length; i++) {
- gl.glDrawArrays(primType, start_array[i], sarray[i]);
- }
- }
- } else if ((geo_type == GeometryRetained.GEO_TYPE_QUAD_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_TRI_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_POINT_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_LINE_SET)) {
- /******* Handle non-indexed non-striped GeometryArray now *****/
- if (ignoreVertexColors || (carray != null) ||
- ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0 && ((texCoordSetMapLen > 1) ||
- (texCoordSetCount > 1)))) {
- useInterleavedArrays = false;
- } else {
- boolean[] tmp = new boolean[1];
- int[] tmp2 = new int[1];
- testForInterleavedArrays(vformat, tmp, tmp2);
- useInterleavedArrays = tmp[0];
- iaFormat = tmp2[0];
- }
-
- if (useInterleavedArrays) {
- verts.position(startVertex);
- gl.glInterleavedArrays(iaFormat, bstride, verts);
- } else {
- if (EXTRA_DEBUGGING) {
- System.err.println(" startVertex: " + startVertex);
- System.err.println(" stride: " + stride);
- System.err.println(" bstride: " + bstride);
- System.err.println(" normoff: " + normoff);
- System.err.println(" coloroff: " + coloroff);
- System.err.println(" coordoff: " + coordoff);
- System.err.println(" texCoordoff: " + texCoordoff);
- }
- if ((vformat & GeometryArray.NORMALS) != 0) {
- verts.position(startVertex + normoff);
- gl.glNormalPointer(GL.GL_FLOAT, bstride, verts);
- }
- if (!ignoreVertexColors && (vformat & GeometryArray.COLOR) != 0) {
- clrs.position(startClrs);
- if ((vformat & GeometryArray.WITH_ALPHA) != 0 || useAlpha) {
- gl.glColorPointer(4, GL.GL_FLOAT, cbstride, clrs);
- } else {
- gl.glColorPointer(3, GL.GL_FLOAT, cbstride, clrs);
- }
- }
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- verts.position(startVertex + coordoff);
- gl.glVertexPointer(3, GL.GL_FLOAT, bstride, verts);
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- executeTexture(texCoordSetMapLen,
- texSize, bstride, texCoordoff,
- texCoordSetMapOffset,
- numActiveTexUnitState,
- verts, gl);
- }
-
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- int vAttrOffset = startVertex + vAttrOff;
- for (int i = 0; i < vertexAttrCount; i++) {
- ctx.enableVertexAttrArray(gl, i);
- verts.position(vAttrOffset);
- ctx.vertexAttrPointer(gl, i, vertexAttrSizes[i],
- GL.GL_FLOAT, bstride, verts);
- vAttrOffset += vertexAttrSizes[i];
- }
- }
- }
- switch (geo_type){
- case GeometryRetained.GEO_TYPE_QUAD_SET : gl.glDrawArrays(GL2.GL_QUADS, 0, vcount); break;
- case GeometryRetained.GEO_TYPE_TRI_SET : gl.glDrawArrays(GL.GL_TRIANGLES, 0, vcount); break;
- case GeometryRetained.GEO_TYPE_POINT_SET: gl.glDrawArrays(GL.GL_POINTS, 0, vcount); break;
- case GeometryRetained.GEO_TYPE_LINE_SET : gl.glDrawArrays(GL.GL_LINES, 0, vcount); break;
- }
- }
-
- /* clean up if we turned on normalize */
- if (isNonUniformScale) {
- gl.glDisable(GL2.GL_NORMALIZE);
- }
-
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- resetVertexAttrs(gl, ctx, vertexAttrCount);
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- resetTexture(gl, ctx);
- }
- }
-
-
- // glLockArrays() is invoked only for indexed geometry, and the
- // vertexCount is guarenteed to be >= 0.
- private void lockArray(GL2 gl, int vertexCount) {
- if (gl.isExtensionAvailable("GL_EXT_compiled_vertex_array")) {
- gl.glLockArraysEXT(0, vertexCount);
- }
- }
-
- private void unlockArray(GL2 gl) {
- if (gl.isExtensionAvailable("GL_EXT_compiled_vertex_array")) {
- gl.glUnlockArraysEXT();
- }
- }
-
- private void
- executeGeometryArrayVA(Context absCtx,
- GeometryArrayRetained geo,
- int geo_type,
- boolean isNonUniformScale,
- boolean ignoreVertexColors,
- int vcount,
- int vformat,
- int vdefined,
- int initialCoordIndex, FloatBuffer fverts, DoubleBuffer dverts,
- int initialColorIndex, FloatBuffer fclrs, ByteBuffer bclrs,
- int initialNormalIndex, FloatBuffer norms,
- int vertexAttrCount, int[] vertexAttrSizes,
- int[] vertexAttrIndices, FloatBuffer[] vertexAttrData,
- int texCoordMapLength,
- int[] texCoordSetMap,
- int numActiveTexUnit,
- int[] texindices, int texStride, FloatBuffer[] texCoords,
- int cdirty,
- int[] sarray,
- int strip_len,
- int[] start_array) {
- JoglContext ctx = (JoglContext) absCtx;
- GLContext context = context(ctx);
- GL2 gl = context.getGL().getGL2();
-
- boolean floatCoordDefined = ((vdefined & GeometryArrayRetained.COORD_FLOAT) != 0);
- boolean doubleCoordDefined = ((vdefined & GeometryArrayRetained.COORD_DOUBLE) != 0);
- boolean floatColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_FLOAT) != 0);
- boolean byteColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_BYTE) != 0);
- boolean normalsDefined = ((vdefined & GeometryArrayRetained.NORMAL_FLOAT) != 0);
- boolean vattrDefined = ((vdefined & GeometryArrayRetained.VATTR_FLOAT) != 0);
- boolean textureDefined = ((vdefined & GeometryArrayRetained.TEXCOORD_FLOAT) != 0);
-
- // Enable normalize for non-uniform scale (which rescale can't handle)
- if (isNonUniformScale) {
- gl.glEnable(GL2.GL_NORMALIZE);
- }
-
- int coordoff = 3 * initialCoordIndex;
- // Define the data pointers
- if (floatCoordDefined) {
- fverts.position(coordoff);
- gl.glVertexPointer(3, GL.GL_FLOAT, 0, fverts);
- } else if (doubleCoordDefined){
- dverts.position(coordoff);
- gl.glVertexPointer(3, GL2.GL_DOUBLE, 0, dverts);
- }
-
- if (floatColorsDefined) {
- int coloroff;
- int sz;
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) {
- coloroff = 4 * initialColorIndex;
- sz = 4;
- } else {
- coloroff = 3 * initialColorIndex;
- sz = 3;
- }
- fclrs.position(coloroff);
- gl.glColorPointer(sz, GL.GL_FLOAT, 0, fclrs);
- } else if (byteColorsDefined) {
- int coloroff;
- int sz;
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) {
- coloroff = 4 * initialColorIndex;
- sz = 4;
- } else {
- coloroff = 3 * initialColorIndex;
- sz = 3;
- }
- bclrs.position(coloroff);
- gl.glColorPointer(sz, GL.GL_UNSIGNED_BYTE, 0, bclrs);
- }
- if (normalsDefined) {
- int normoff = 3 * initialNormalIndex;
- norms.position(normoff);
- gl.glNormalPointer(GL.GL_FLOAT, 0, norms);
- }
-
- if (vattrDefined) {
- for (int i = 0; i < vertexAttrCount; i++) {
- FloatBuffer vertexAttrs = vertexAttrData[i];
- int sz = vertexAttrSizes[i];
- int initIdx = vertexAttrIndices[i];
- ctx.enableVertexAttrArray(gl, i);
- vertexAttrs.position(initIdx * sz);
- ctx.vertexAttrPointer(gl, i, sz, GL.GL_FLOAT, 0, vertexAttrs);
- }
- }
-
- if (textureDefined) {
- int texSet = 0;
- for (int i = 0; i < numActiveTexUnit; i++) {
- if (( i < texCoordMapLength) &&
- ((texSet = texCoordSetMap[i]) != -1)) {
- FloatBuffer buf = texCoords[texSet];
- buf.position(texStride * texindices[texSet]);
- enableTexCoordPointer(gl, i, texStride,
- GL.GL_FLOAT, 0, buf);
- } else {
- disableTexCoordPointer(gl, i);
- }
- }
-
- // Reset client active texture unit to 0
- clientActiveTextureUnit(gl, 0);
- }
-
- if (geo_type == GeometryRetained.GEO_TYPE_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_LINE_STRIP_SET) {
- int primType = 0;
- switch (geo_type) {
- case GeometryRetained.GEO_TYPE_TRI_STRIP_SET:
- primType = GL.GL_TRIANGLE_STRIP;
- break;
- case GeometryRetained.GEO_TYPE_TRI_FAN_SET:
- primType = GL.GL_TRIANGLE_FAN;
- break;
- case GeometryRetained.GEO_TYPE_LINE_STRIP_SET:
- primType = GL.GL_LINE_STRIP;
- break;
- }
- if (gl.isExtensionAvailable("GL_EXT_multi_draw_arrays")) {
- gl.glMultiDrawArrays(primType, start_array, 0, sarray, 0, strip_len);
- } else if (gl.isExtensionAvailable("GL_VERSION_1_4")) {
- gl.glMultiDrawArrays(primType, start_array, 0, sarray, 0, strip_len);
- } else {
- for (int i = 0; i < strip_len; i++) {
- gl.glDrawArrays(primType, start_array[i], sarray[i]);
- }
- }
- } else {
- switch (geo_type){
- case GeometryRetained.GEO_TYPE_QUAD_SET : gl.glDrawArrays(GL2.GL_QUADS, 0, vcount); break;
- case GeometryRetained.GEO_TYPE_TRI_SET : gl.glDrawArrays(GL.GL_TRIANGLES, 0, vcount); break;
- case GeometryRetained.GEO_TYPE_POINT_SET : gl.glDrawArrays(GL.GL_POINTS, 0, vcount); break;
- case GeometryRetained.GEO_TYPE_LINE_SET : gl.glDrawArrays(GL.GL_LINES, 0, vcount); break;
- }
- }
-
- // clean up if we turned on normalize
- if (isNonUniformScale) {
- gl.glDisable(GL2.GL_NORMALIZE);
- }
-
- if (vattrDefined) {
- resetVertexAttrs(gl, ctx, vertexAttrCount);
- }
-
- if (textureDefined) {
- resetTexture(gl, ctx);
- }
- }
-
- private String getVertexDescription(int vformat) {
- String res = "";
- if ((vformat & GeometryArray.COORDINATES) != 0) res += "COORDINATES ";
- if ((vformat & GeometryArray.NORMALS) != 0) res += "NORMALS ";
- if ((vformat & GeometryArray.COLOR) != 0) res += "COLOR ";
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) res += "(WITH_ALPHA) ";
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) res += "TEXTURE_COORDINATE ";
- if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) res += "(2) ";
- if ((vformat & GeometryArray.TEXTURE_COORDINATE_3) != 0) res += "(3) ";
- if ((vformat & GeometryArray.TEXTURE_COORDINATE_4) != 0) res += "(4) ";
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) res += "VERTEX_ATTRIBUTES ";
- return res;
- }
-
- private String getGeometryDescription(int geo_type) {
- switch (geo_type) {
- case GeometryRetained.GEO_TYPE_TRI_STRIP_SET : return "GEO_TYPE_TRI_STRIP_SET";
- case GeometryRetained.GEO_TYPE_TRI_FAN_SET : return "GEO_TYPE_TRI_FAN_SET";
- case GeometryRetained.GEO_TYPE_LINE_STRIP_SET: return "GEO_TYPE_LINE_STRIP_SET";
- case GeometryRetained.GEO_TYPE_QUAD_SET : return "GEO_TYPE_QUAD_SET";
- case GeometryRetained.GEO_TYPE_TRI_SET : return "GEO_TYPE_TRI_SET";
- case GeometryRetained.GEO_TYPE_POINT_SET : return "GEO_TYPE_POINT_SET";
- case GeometryRetained.GEO_TYPE_LINE_SET : return "GEO_TYPE_LINE_SET";
- default: return "(unknown " + geo_type + ")";
- }
- }
-
- private void resetVertexAttrs(GL gl, JoglContext ctx, int vertexAttrCount) {
- // Disable specified vertex attr arrays
- for (int i = 0; i < vertexAttrCount; i++) {
- ctx.disableVertexAttrArray(gl, i);
- }
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // IndexedGeometryArrayRetained methods
- //
-
- // by-copy or interleaved, by reference, Java arrays
- @Override
- void executeIndexedGeometry(Context ctx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale,
- boolean useAlpha,
- boolean ignoreVertexColors,
- int initialIndexIndex,
- int indexCount,
- int vertexCount, int vformat,
- int vertexAttrCount, int[] vertexAttrSizes,
- int texCoordSetCount, int[] texCoordSetMap,
- int texCoordSetMapLen,
- int[] texCoordSetOffset,
- int numActiveTexUnitState,
- float[] varray, float[] carray,
- int cdirty,
- int[] indexCoord) {
- if (VERBOSE) System.err.println("JoglPipeline.executeIndexedGeometry()");
-
- executeIndexedGeometryArray(ctx, geo, geo_type,
- isNonUniformScale, useAlpha, ignoreVertexColors,
- initialIndexIndex, indexCount,
- vertexCount, vformat,
- vertexAttrCount, vertexAttrSizes,
- texCoordSetCount, texCoordSetMap, texCoordSetMapLen,
- texCoordSetOffset,
- numActiveTexUnitState,
- varray, null, carray,
- cdirty, indexCoord);
- }
-
- // interleaved, by reference, nio buffer
- @Override
- void executeIndexedGeometryBuffer(Context ctx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale,
- boolean useAlpha,
- boolean ignoreVertexColors,
- int initialIndexIndex,
- int indexCount,
- int vertexCount, int vformat,
- int texCoordSetCount, int[] texCoordSetMap,
- int texCoordSetMapLen,
- int[] texCoordSetOffset,
- int numActiveTexUnitState,
- FloatBuffer vdata, float[] carray,
- int cDirty,
- int[] indexCoord) {
- if (VERBOSE) System.err.println("JoglPipeline.executeIndexedGeometryBuffer()");
-
- executeIndexedGeometryArray(ctx, geo, geo_type,
- isNonUniformScale, useAlpha, ignoreVertexColors,
- initialIndexIndex, indexCount, vertexCount, vformat,
- 0, null,
- texCoordSetCount, texCoordSetMap, texCoordSetMapLen, texCoordSetOffset,
- numActiveTexUnitState,
- null, vdata, carray,
- cDirty, indexCoord);
- }
-
- // non interleaved, by reference, Java arrays
- @Override
- void executeIndexedGeometryVA(Context ctx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale,
- boolean ignoreVertexColors,
- int initialIndexIndex,
- int validIndexCount,
- int vertexCount,
- int vformat,
- int vdefined,
- float[] vfcoords, double[] vdcoords,
- float[] cfdata, byte[] cbdata,
- float[] ndata,
- int vertexAttrCount, int[] vertexAttrSizes,
- float[][] vertexAttrData,
- int texCoordMapLength,
- int[] texcoordoffset,
- int numActiveTexUnitState,
- int texStride, Object[] texCoords,
- int cdirty,
- int[] indexCoord) {
- if (VERBOSE) System.err.println("JoglPipeline.executeIndexedGeometryVA()");
-
- boolean floatCoordDefined = ((vdefined & GeometryArrayRetained.COORD_FLOAT) != 0);
- boolean doubleCoordDefined = ((vdefined & GeometryArrayRetained.COORD_DOUBLE) != 0);
- boolean floatColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_FLOAT) != 0);
- boolean byteColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_BYTE) != 0);
- boolean normalsDefined = ((vdefined & GeometryArrayRetained.NORMAL_FLOAT) != 0);
- boolean vattrDefined = ((vdefined & GeometryArrayRetained.VATTR_FLOAT) != 0);
- boolean textureDefined = ((vdefined & GeometryArrayRetained.TEXCOORD_FLOAT) != 0);
-
- FloatBuffer fverts = null;
- DoubleBuffer dverts = null;
- FloatBuffer fclrs = null;
- ByteBuffer bclrs = null;
- FloatBuffer[] texCoordBufs = null;
- FloatBuffer norms = null;
- FloatBuffer[] vertexAttrBufs = null;
-
- // Get vertex attribute arrays
- if (vattrDefined) {
- vertexAttrBufs = getVertexAttrSetBuffer(vertexAttrData);
- }
-
- // get texture arrays
- if (textureDefined) {
- texCoordBufs = getTexCoordSetBuffer(texCoords);
- }
-
- int[] sarray = null;
- int strip_len = 0;
- if (geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET) {
- sarray = ((IndexedGeometryStripArrayRetained) geo).stripIndexCounts;
- strip_len = sarray.length;
- }
-
- // get coordinate array
- if (floatCoordDefined) {
- fverts = getVertexArrayBuffer(vfcoords);
- } else if (doubleCoordDefined) {
- dverts = getVertexArrayBuffer(vdcoords);
- }
-
- // get color array
- if (floatColorsDefined) {
- fclrs = getColorArrayBuffer(cfdata);
- } else if (byteColorsDefined) {
- bclrs = getColorArrayBuffer(cbdata);
- }
-
- // get normal array
- if (normalsDefined) {
- norms = getNormalArrayBuffer(ndata);
- }
-
- executeIndexedGeometryArrayVA(ctx, geo, geo_type,
- isNonUniformScale, ignoreVertexColors,
- initialIndexIndex, validIndexCount, vertexCount,
- vformat, vdefined,
- fverts, dverts,
- fclrs, bclrs,
- norms,
- vertexAttrCount, vertexAttrSizes, vertexAttrBufs,
- texCoordMapLength, texcoordoffset,
- numActiveTexUnitState,
- texStride, texCoordBufs,
- cdirty, indexCoord,
- sarray, strip_len);
- }
-
- // non interleaved, by reference, nio buffer
- @Override
- void executeIndexedGeometryVABuffer(Context ctx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale,
- boolean ignoreVertexColors,
- int initialIndexIndex,
- int validIndexCount,
- int vertexCount,
- int vformat,
- int vdefined,
- Buffer vcoords,
- Buffer cdataBuffer,
- float[] cfdata, byte[] cbdata,
- FloatBuffer ndata,
- int vertexAttrCount, int[] vertexAttrSizes,
- FloatBuffer[] vertexAttrData,
- int texCoordMapLength,
- int[] texcoordoffset,
- int numActiveTexUnitState,
- int texStride, Object[] texCoords,
- int cdirty,
- int[] indexCoord) {
- if (VERBOSE) System.err.println("JoglPipeline.executeIndexedGeometryVABuffer()");
-
- boolean floatCoordDefined = ((vdefined & GeometryArrayRetained.COORD_FLOAT) != 0);
- boolean doubleCoordDefined = ((vdefined & GeometryArrayRetained.COORD_DOUBLE) != 0);
- boolean floatColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_FLOAT) != 0);
- boolean byteColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_BYTE) != 0);
- boolean normalsDefined = ((vdefined & GeometryArrayRetained.NORMAL_FLOAT) != 0);
- boolean vattrDefined = ((vdefined & GeometryArrayRetained.VATTR_FLOAT) != 0);
- boolean textureDefined = ((vdefined & GeometryArrayRetained.TEXCOORD_FLOAT) != 0);
-
- FloatBuffer fverts = null;
- DoubleBuffer dverts = null;
- FloatBuffer fclrs = null;
- ByteBuffer bclrs = null;
- FloatBuffer[] texCoordBufs = null;
- FloatBuffer norms = null;
- FloatBuffer[] vertexAttrBufs = null;
-
- // Get vertex attribute arrays
- if (vattrDefined) {
- vertexAttrBufs = vertexAttrData;
- }
-
- // get texture arrays
- if (textureDefined) {
- texCoordBufs = new FloatBuffer[texCoords.length];
- for (int i = 0; i < texCoords.length; i++) {
- texCoordBufs[i] = (FloatBuffer) texCoords[i];
- }
- }
-
- // get coordinate array
- if (floatCoordDefined) {
- fverts = (FloatBuffer) vcoords;
- } else if (doubleCoordDefined) {
- dverts = (DoubleBuffer) vcoords;
- }
-
- if (fverts == null && dverts == null) {
- return;
- }
-
- int[] sarray = null;
- int strip_len = 0;
- if (geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET) {
- sarray = ((IndexedGeometryStripArrayRetained) geo).stripIndexCounts;
- strip_len = sarray.length;
- }
-
- // get color array
- if (floatColorsDefined) {
- if (cfdata != null)
- fclrs = getColorArrayBuffer(cfdata);
- else
- fclrs = (FloatBuffer) cdataBuffer;
- } else if (byteColorsDefined) {
- if (cbdata != null)
- bclrs = getColorArrayBuffer(cbdata);
- else
- bclrs = (ByteBuffer) cdataBuffer;
- }
-
- // get normal array
- if (normalsDefined) {
- norms = ndata;
- }
-
- executeIndexedGeometryArrayVA(ctx, geo, geo_type,
- isNonUniformScale, ignoreVertexColors,
- initialIndexIndex, validIndexCount, vertexCount,
- vformat, vdefined,
- fverts, dverts,
- fclrs, bclrs,
- norms,
- vertexAttrCount, vertexAttrSizes, vertexAttrBufs,
- texCoordMapLength, texcoordoffset,
- numActiveTexUnitState,
- texStride, texCoordBufs,
- cdirty, indexCoord,
- sarray, strip_len);
- }
-
- // by-copy geometry
- @Override
- void buildIndexedGeometry(Context absCtx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale, boolean updateAlpha,
- float alpha,
- boolean ignoreVertexColors,
- int initialIndexIndex,
- int validIndexCount,
- int vertexCount,
- int vformat,
- int vertexAttrCount, int[] vertexAttrSizes,
- int texCoordSetCount, int[] texCoordSetMap,
- int texCoordSetMapLen,
- int[] texCoordSetMapOffset,
- double[] xform, double[] nxform,
- float[] varray, int[] indexCoord) {
- if (VERBOSE) System.err.println("JoglPipeline.buildIndexedGeometry()");
-
- JoglContext ctx = (JoglContext) absCtx;
- GL2 gl = context(ctx).getGL().getGL2();
-
- boolean useInterleavedArrays;
- int iaFormat = 0;
- int primType = 0;
- int stride = 0, coordoff = 0, normoff = 0, coloroff = 0, texCoordoff = 0;
- int texSize = 0, texStride = 0;
- int vAttrOff = 0;
- int vAttrStride = 0;
- int bstride = 0, cbstride = 0;
- FloatBuffer verts = null;
- FloatBuffer clrs = null;
- int[] sarray = null;
- int strip_len = 0;
- boolean useAlpha = false;
-
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
- stride += 3;
- } else {
- gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
- }
-
- if ((vformat & GeometryArray.NORMALS) != 0) {
- gl.glEnableClientState(GL2.GL_NORMAL_ARRAY);
- stride += 3;
- coordoff += 3;
- } else {
- gl.glDisableClientState(GL2.GL_NORMAL_ARRAY);
- }
-
- if ((vformat & GeometryArray.COLOR) != 0) {
- gl.glEnableClientState(GL2.GL_COLOR_ARRAY);
- stride += 4;
- normoff += 4;
- coordoff += 4;
- } else {
- gl.glDisableClientState(GL2.GL_COLOR_ARRAY);
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) {
- texSize = 2;
- texStride = 2 * texCoordSetCount;
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_3) != 0) {
- texSize = 3;
- texStride = 3 * texCoordSetCount;
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_4) != 0) {
- texSize = 4;
- texStride = 4 * texCoordSetCount;
- }
- stride += texStride;
- normoff += texStride;
- coloroff += texStride;
- coordoff += texStride;
- }
-
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- for (int i = 0; i < vertexAttrCount; i++) {
- vAttrStride += vertexAttrSizes[i];
- }
- stride += vAttrStride;
- normoff += vAttrStride;
- coloroff += vAttrStride;
- coordoff += vAttrStride;
- texCoordoff += vAttrStride;
- }
-
- bstride = stride * Buffers.SIZEOF_FLOAT;
-
- // process alpha for geometryArray without alpha
- if (updateAlpha && !ignoreVertexColors) {
- useAlpha = true;
- }
-
- if (geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET) {
- sarray = ((IndexedGeometryStripArrayRetained) geo).stripIndexCounts;
- strip_len = sarray.length;
- }
-
- // Copy data into NIO array
- verts = getVertexArrayBuffer(varray);
-
- // Apply normal transform if necessary
- if ((vformat & GeometryArray.NORMALS) != 0 && nxform != null) {
- int off = normoff;
- for (int i = 0; i < vertexCount * 3; i+=3) {
- verts.put(off , (float) (nxform[0] * varray[off] +
- nxform[1] * varray[off+1] +
- nxform[2] * varray[off+2]));
- verts.put(off+1, (float) (nxform[4] * varray[off] +
- nxform[5] * varray[off+1] +
- nxform[6] * varray[off+2]));
- verts.put(off+2, (float) (nxform[8] * varray[off] +
- nxform[9] * varray[off+1] +
- nxform[10] * varray[off+2]));
- off += stride;
- }
- }
-
- // Apply coordinate transform if necessary
- if ((vformat & GeometryArray.COORDINATES) != 0 && xform != null) {
- int off = coordoff;
- for (int i = 0; i < vertexCount * 3; i+=3) {
- verts.put(off , (float) (xform[0] * varray[off] +
- xform[1] * varray[off+1] +
- xform[2] * varray[off+2]));
- verts.put(off+1, (float) (xform[4] * varray[off] +
- xform[5] * varray[off+1] +
- xform[6] * varray[off+2]));
- verts.put(off+2, (float) (xform[8] * varray[off] +
- xform[9] * varray[off+1] +
- xform[10] * varray[off+2]));
- off += stride;
- }
- }
-
- if (geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET) {
- // Note we can use interleaved arrays even if we have a
- // non-null xform since we use the same data layout unlike the
- // C code
- if (ignoreVertexColors ||
- (((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) && ((texCoordSetMapLen > 1) ||
- (texCoordSetCount > 1)))) {
- useInterleavedArrays = false;
- } else {
- boolean[] tmp = new boolean[1];
- int[] tmp2 = new int[1];
- testForInterleavedArrays(vformat, tmp, tmp2);
- useInterleavedArrays = tmp[0];
- iaFormat = tmp2[0];
- }
-
- if (useInterleavedArrays) {
- verts.position(0);
- gl.glInterleavedArrays(iaFormat, bstride, verts);
- } else {
- if ((vformat & GeometryArray.NORMALS) != 0) {
- verts.position(normoff);
- gl.glNormalPointer(GL.GL_FLOAT, bstride, verts);
- }
- if (!ignoreVertexColors && ((vformat & GeometryArray.COLOR) != 0)) {
- verts.position(coloroff);
- if (((vformat & GeometryArray.WITH_ALPHA) != 0) || useAlpha) {
- gl.glColorPointer(4, GL.GL_FLOAT, bstride, verts);
- } else {
- gl.glColorPointer(3, GL.GL_FLOAT, bstride, verts);
- }
- }
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- verts.position(coordoff);
- gl.glVertexPointer(3, GL.GL_FLOAT, bstride, verts);
- }
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- executeTexture(texCoordSetMapLen,
- texSize, bstride, texCoordoff,
- texCoordSetMapOffset,
- texCoordSetMapLen,
- verts, gl);
- }
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- int vAttrOffset = vAttrOff;
- for (int i = 0; i < vertexAttrCount; i++) {
- ctx.enableVertexAttrArray(gl, i);
- verts.position(vAttrOffset);
- ctx.vertexAttrPointer(gl, i, vertexAttrSizes[i],
- GL.GL_FLOAT, bstride, verts);
- vAttrOffset += vertexAttrSizes[i];
- }
- }
- }
-
- switch (geo_type) {
- case GeometryRetained.GEO_TYPE_INDEXED_TRI_STRIP_SET:
- primType = GL.GL_TRIANGLE_STRIP;
- break;
- case GeometryRetained.GEO_TYPE_INDEXED_TRI_FAN_SET:
- primType = GL.GL_TRIANGLE_FAN;
- break;
- case GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET:
- primType = GL.GL_LINE_STRIP;
- break;
- }
-
- lockArray(gl, vertexCount);
-
- // Note: using MultiDrawElements is probably more expensive than
- // not in this case due to the need to allocate more temporary
- // direct buffers and slice up the incoming indices array
- int offset = initialIndexIndex;
- IntBuffer indicesBuffer = IntBuffer.wrap(indexCoord);
- for (int i = 0; i < strip_len; i++) {
- indicesBuffer.position(offset);
- int count = sarray[i];
- gl.glDrawElements(primType, count, GL.GL_UNSIGNED_INT, indicesBuffer);
- offset += count;
- }
- } else if ((geo_type == GeometryRetained.GEO_TYPE_INDEXED_QUAD_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_INDEXED_POINT_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_INDEXED_LINE_SET)) {
- // Note we can use interleaved arrays even if we have a
- // non-null xform since we use the same data layout unlike the
- // C code
- if (ignoreVertexColors ||
- (((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) && ((texCoordSetMapLen > 1) ||
- (texCoordSetCount > 1)))) {
- useInterleavedArrays = false;
- } else {
- boolean[] tmp = new boolean[1];
- int[] tmp2 = new int[1];
- testForInterleavedArrays(vformat, tmp, tmp2);
- useInterleavedArrays = tmp[0];
- iaFormat = tmp2[0];
- }
-
- if (useInterleavedArrays) {
- verts.position(0);
- gl.glInterleavedArrays(iaFormat, bstride, verts);
- } else {
- if ((vformat & GeometryArray.NORMALS) != 0) {
- verts.position(normoff);
- gl.glNormalPointer(GL.GL_FLOAT, bstride, verts);
- }
-
- if (!ignoreVertexColors && ((vformat & GeometryArray.COLOR) != 0)) {
- verts.position(coloroff);
- if (((vformat & GeometryArray.WITH_ALPHA) != 0) || useAlpha) {
- gl.glColorPointer(4, GL.GL_FLOAT, bstride, verts);
- } else {
- gl.glColorPointer(3, GL.GL_FLOAT, bstride, verts);
- }
- }
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- verts.position(coordoff);
- gl.glVertexPointer(3, GL.GL_FLOAT, bstride, verts);
- }
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- executeTexture(texCoordSetMapLen,
- texSize, bstride, texCoordoff,
- texCoordSetMapOffset,
- texCoordSetMapLen,
- verts, gl);
- }
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- int vAttrOffset = vAttrOff;
- for (int i = 0; i < vertexAttrCount; i++) {
- ctx.enableVertexAttrArray(gl, i);
- verts.position(vAttrOffset);
- ctx.vertexAttrPointer(gl, i, vertexAttrSizes[i],
- GL.GL_FLOAT, bstride, verts);
- vAttrOffset += vertexAttrSizes[i];
- }
- }
-
- switch (geo_type) {
- case GeometryRetained.GEO_TYPE_INDEXED_QUAD_SET :
- primType = GL2.GL_QUADS;
- break;
- case GeometryRetained.GEO_TYPE_INDEXED_TRI_SET :
- primType = GL.GL_TRIANGLES;
- break;
- case GeometryRetained.GEO_TYPE_INDEXED_POINT_SET :
- primType = GL.GL_POINTS;
- break;
- case GeometryRetained.GEO_TYPE_INDEXED_LINE_SET :
- primType = GL.GL_LINES;
- break;
- }
-
- lockArray(gl, vertexCount);
-
- IntBuffer indicesBuffer = IntBuffer.wrap(indexCoord);
- indicesBuffer.position(initialIndexIndex);
- gl.glDrawElements(primType, validIndexCount, GL.GL_UNSIGNED_INT, indicesBuffer);
- }
- }
-
- unlockArray(gl);
-
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- resetVertexAttrs(gl, ctx, vertexAttrCount);
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- resetTexture(gl, ctx);
- }
- }
-
-
- //----------------------------------------------------------------------
- //
- // Helper routines for IndexedGeometryArrayRetained
- //
-
- private void executeIndexedGeometryArray(Context absCtx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale,
- boolean useAlpha,
- boolean ignoreVertexColors,
- int initialIndexIndex,
- int indexCount,
- int vertexCount, int vformat,
- int vertexAttrCount, int[] vertexAttrSizes,
- int texCoordSetCount, int[] texCoordSetMap,
- int texCoordSetMapLen,
- int[] texCoordSetOffset,
- int numActiveTexUnitState,
- float[] varray, FloatBuffer vdata, float[] carray,
- int cDirty,
- int[] indexCoord) {
- JoglContext ctx = (JoglContext) absCtx;
- GL2 gl = context(ctx).getGL().getGL2();
-
- boolean useInterleavedArrays;
- int iaFormat = 0;
- int primType = 0;
- int stride = 0, coordoff = 0, normoff = 0, coloroff = 0, texCoordoff = 0;
- int texSize = 0, texStride = 0;
- int vAttrOff = 0;
- int vAttrStride = 0;
- int bstride = 0, cbstride = 0;
- FloatBuffer verts = null;
- FloatBuffer clrs = null;
- int[] sarray = null;
- int strip_len = 0;
-
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- stride += 3;
- }
- if ((vformat & GeometryArray.NORMALS) != 0) {
- stride += 3;
- coordoff += 3;
- }
-
- if ((vformat & GeometryArray.COLOR) != 0) {
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) {
- stride += 4;
- normoff += 4;
- coordoff += 4;
- } else { // Handle the case of executeInterleaved 3f
- stride += 3;
- normoff += 3;
- coordoff += 3;
- }
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) {
- texSize = 2;
- texStride = 2 * texCoordSetCount;
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_3) != 0) {
- texSize = 3;
- texStride = 3 * texCoordSetCount;
- } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_4) != 0) {
- texSize = 4;
- texStride = 4 * texCoordSetCount;
- }
- stride += texStride;
- normoff += texStride;
- coloroff += texStride;
- coordoff += texStride;
- }
-
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- for (int i = 0; i < vertexAttrCount; i++) {
- vAttrStride += vertexAttrSizes[i];
- }
- stride += vAttrStride;
- normoff += vAttrStride;
- coloroff += vAttrStride;
- coordoff += vAttrStride;
- texCoordoff += vAttrStride;
- }
-
- bstride = stride * Buffers.SIZEOF_FLOAT;
-
- if (geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET) {
- sarray = ((IndexedGeometryStripArrayRetained) geo).stripIndexCounts;
- strip_len = sarray.length;
- }
-
- // We have to copy if the data isn't specified using NIO
- if (varray != null) {
- verts = getVertexArrayBuffer(varray);
- } else if (vdata != null) {
- verts = vdata;
- } else {
- // This should never happen
- throw new AssertionError("Unable to get vertex pointer");
- }
-
- // using byRef interleaved array and has a separate pointer, then ..
- int cstride = stride;
- if (carray != null) {
- clrs = getColorArrayBuffer(carray);
- cstride = 4;
- } else {
- // FIXME: need to "auto-slice" this buffer later
- clrs = verts;
- }
-
- cbstride = cstride * Buffers.SIZEOF_FLOAT;
-
- // Enable normalize for non-uniform scale (which rescale can't handle)
- if (isNonUniformScale) {
- gl.glEnable(GL2.GL_NORMALIZE);
- }
-
- /*** Handle non-indexed strip GeometryArray first *******/
- if (geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET) {
- if (ignoreVertexColors || (carray != null) ||
- ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0 && ((texCoordSetMapLen > 1) ||
- (texCoordSetCount > 1)))) {
- useInterleavedArrays = false;
- } else {
- boolean[] tmp = new boolean[1];
- int[] tmp2 = new int[1];
- testForInterleavedArrays(vformat, tmp, tmp2);
- useInterleavedArrays = tmp[0];
- iaFormat = tmp2[0];
- }
- if (useInterleavedArrays) {
- verts.position(0);
- gl.glInterleavedArrays(iaFormat, bstride, verts);
- } else {
- if ((vformat & GeometryArray.NORMALS) != 0) {
- verts.position(normoff);
- gl.glNormalPointer(GL.GL_FLOAT, bstride, verts);
- }
- if (!ignoreVertexColors && (vformat & GeometryArray.COLOR) != 0) {
- if (clrs == verts) {
- clrs.position(coloroff);
- }
- if ((vformat & GeometryArray.WITH_ALPHA) != 0 || useAlpha) {
- gl.glColorPointer(4, GL.GL_FLOAT, cbstride, clrs);
- } else {
- gl.glColorPointer(3, GL.GL_FLOAT, cbstride, clrs);
- }
- }
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- verts.position(coordoff);
- gl.glVertexPointer(3, GL.GL_FLOAT, bstride, verts);
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- /* XXXX: texCoordoff == 0 ???*/
- executeTexture(texCoordSetMapLen,
- texSize, bstride, texCoordoff,
- texCoordSetOffset,
- numActiveTexUnitState,
- verts, gl);
- }
-
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- int vAttrOffset = vAttrOff;
- for (int i = 0; i < vertexAttrCount; i++) {
- ctx.enableVertexAttrArray(gl, i);
- verts.position(vAttrOffset);
- ctx.vertexAttrPointer(gl, i, vertexAttrSizes[i],
- GL.GL_FLOAT, bstride, verts);
- vAttrOffset += vertexAttrSizes[i];
- }
- }
- }
-
- switch (geo_type) {
- case GeometryRetained.GEO_TYPE_INDEXED_TRI_STRIP_SET:
- primType = GL.GL_TRIANGLE_STRIP;
- break;
- case GeometryRetained.GEO_TYPE_INDEXED_TRI_FAN_SET:
- primType = GL.GL_TRIANGLE_FAN;
- break;
- case GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET:
- primType = GL.GL_LINE_STRIP;
- break;
- }
-
- lockArray(gl, vertexCount);
-
- // Note: using MultiDrawElements is probably more expensive than
- // not in this case due to the need to allocate more temporary
- // direct buffers and slice up the incoming indices array
- int offset = initialIndexIndex;
- IntBuffer indicesBuffer = IntBuffer.wrap(indexCoord);
- for (int i = 0; i < strip_len; i++) {
- indicesBuffer.position(offset);
- int count = sarray[i];
- gl.glDrawElements(primType, count, GL.GL_UNSIGNED_INT, indicesBuffer);
- offset += count;
- }
- } else if ((geo_type == GeometryRetained.GEO_TYPE_INDEXED_QUAD_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_INDEXED_POINT_SET) ||
- (geo_type == GeometryRetained.GEO_TYPE_INDEXED_LINE_SET)) {
- /******* Handle non-indexed non-striped GeometryArray now *****/
- if (ignoreVertexColors || (carray != null) ||
- ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0 && ((texCoordSetMapLen > 1) ||
- (texCoordSetCount > 1)))) {
- useInterleavedArrays = false;
- } else {
- boolean[] tmp = new boolean[1];
- int[] tmp2 = new int[1];
- testForInterleavedArrays(vformat, tmp, tmp2);
- useInterleavedArrays = tmp[0];
- iaFormat = tmp2[0];
- }
-
- if (useInterleavedArrays) {
- verts.position(0);
- gl.glInterleavedArrays(iaFormat, bstride, verts);
- } else {
- if ((vformat & GeometryArray.NORMALS) != 0) {
- verts.position(normoff);
- gl.glNormalPointer(GL.GL_FLOAT, bstride, verts);
- }
-
- if (!ignoreVertexColors && (vformat & GeometryArray.COLOR) != 0) {
- if (clrs == verts) {
- clrs.position(coloroff);
- }
- if ((vformat & GeometryArray.WITH_ALPHA) != 0 || useAlpha) {
- gl.glColorPointer(4, GL.GL_FLOAT, cbstride, clrs);
- } else {
- gl.glColorPointer(3, GL.GL_FLOAT, cbstride, clrs);
- }
- }
- if ((vformat & GeometryArray.COORDINATES) != 0) {
- verts.position(coordoff);
- gl.glVertexPointer(3, GL.GL_FLOAT, bstride, verts);
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- /* XXXX: texCoordoff == 0 ???*/
- executeTexture(texCoordSetMapLen,
- texSize, bstride, texCoordoff,
- texCoordSetOffset,
- numActiveTexUnitState,
- verts, gl);
- }
-
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- int vAttrOffset = vAttrOff;
- for (int i = 0; i < vertexAttrCount; i++) {
- ctx.enableVertexAttrArray(gl, i);
- verts.position(vAttrOffset);
- ctx.vertexAttrPointer(gl, i, vertexAttrSizes[i],
- GL.GL_FLOAT, bstride, verts);
- vAttrOffset += vertexAttrSizes[i];
- }
- }
- }
-
- lockArray(gl, vertexCount);
- IntBuffer buf = IntBuffer.wrap(indexCoord);
- buf.position(initialIndexIndex);
- switch (geo_type){
- case GeometryRetained.GEO_TYPE_INDEXED_QUAD_SET : gl.glDrawElements(GL2.GL_QUADS, indexCount, GL.GL_UNSIGNED_INT, buf); break;
- case GeometryRetained.GEO_TYPE_INDEXED_TRI_SET : gl.glDrawElements(GL.GL_TRIANGLES, indexCount, GL.GL_UNSIGNED_INT, buf); break;
- case GeometryRetained.GEO_TYPE_INDEXED_POINT_SET: gl.glDrawElements(GL.GL_POINTS, indexCount, GL.GL_UNSIGNED_INT, buf); break;
- case GeometryRetained.GEO_TYPE_INDEXED_LINE_SET : gl.glDrawElements(GL.GL_LINES, indexCount, GL.GL_UNSIGNED_INT, buf); break;
- }
- }
-
- unlockArray(gl);
-
- if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
- resetVertexAttrs(gl, ctx, vertexAttrCount);
- }
-
- if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) {
- resetTexture(gl, ctx);
- }
-
- // clean up if we turned on normalize
- if (isNonUniformScale) {
- gl.glDisable(GL2.GL_NORMALIZE);
- }
- }
-
-
- private void executeIndexedGeometryArrayVA(Context absCtx,
- GeometryArrayRetained geo, int geo_type,
- boolean isNonUniformScale,
- boolean ignoreVertexColors,
- int initialIndexIndex,
- int validIndexCount,
- int vertexCount, int vformat, int vdefined,
- FloatBuffer fverts, DoubleBuffer dverts,
- FloatBuffer fclrs, ByteBuffer bclrs,
- FloatBuffer norms,
- int vertexAttrCount, int[] vertexAttrSizes, FloatBuffer[] vertexAttrBufs,
- int texCoordSetCount, int[] texCoordSetMap,
- int numActiveTexUnitState,
- int texStride,
- FloatBuffer[] texCoords,
- int cDirty, int[] indexCoord, int[] sarray, int strip_len) {
- JoglContext ctx = (JoglContext) absCtx;
- GL2 gl = context(ctx).getGL().getGL2();
-
- boolean floatCoordDefined = ((vdefined & GeometryArrayRetained.COORD_FLOAT) != 0);
- boolean doubleCoordDefined = ((vdefined & GeometryArrayRetained.COORD_DOUBLE) != 0);
- boolean floatColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_FLOAT) != 0);
- boolean byteColorsDefined = ((vdefined & GeometryArrayRetained.COLOR_BYTE) != 0);
- boolean normalsDefined = ((vdefined & GeometryArrayRetained.NORMAL_FLOAT) != 0);
- boolean vattrDefined = ((vdefined & GeometryArrayRetained.VATTR_FLOAT) != 0);
- boolean textureDefined = ((vdefined & GeometryArrayRetained.TEXCOORD_FLOAT) != 0);
-
- // Enable normalize for non-uniform scale (which rescale can't handle)
- if (isNonUniformScale) {
- gl.glEnable(GL2.GL_NORMALIZE);
- }
-
- // Define the data pointers
- if (floatCoordDefined) {
- fverts.position(0);
- gl.glVertexPointer(3, GL.GL_FLOAT, 0, fverts);
- } else if (doubleCoordDefined){
- dverts.position(0);
- gl.glVertexPointer(3, GL2.GL_DOUBLE, 0, dverts);
- }
- if (floatColorsDefined) {
- fclrs.position(0);
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) {
- gl.glColorPointer(4, GL.GL_FLOAT, 0, fclrs);
- } else {
- gl.glColorPointer(3, GL.GL_FLOAT, 0, fclrs);
- }
- } else if (byteColorsDefined) {
- bclrs.position(0);
- if ((vformat & GeometryArray.WITH_ALPHA) != 0) {
- gl.glColorPointer(4, GL.GL_UNSIGNED_BYTE, 0, bclrs);
- } else {
- gl.glColorPointer(3, GL.GL_UNSIGNED_BYTE, 0, bclrs);
- }
- }
- if (normalsDefined) {
- norms.position(0);
- gl.glNormalPointer(GL.GL_FLOAT, 0, norms);
- }
-
- if (vattrDefined) {
- for (int i = 0; i < vertexAttrCount; i++) {
- FloatBuffer vertexAttrs = vertexAttrBufs[i];
- int sz = vertexAttrSizes[i];
- ctx.enableVertexAttrArray(gl, i);
- vertexAttrs.position(0);
- ctx.vertexAttrPointer(gl, i, sz, GL.GL_FLOAT, 0, vertexAttrs);
- }
- }
-
- if (textureDefined) {
- int texSet = 0;
- for (int i = 0; i < numActiveTexUnitState; i++) {
- if ((i < texCoordSetCount) &&
- ((texSet = texCoordSetMap[i]) != -1)) {
- FloatBuffer buf = texCoords[texSet];
- buf.position(0);
- enableTexCoordPointer(gl, i, texStride,
- GL.GL_FLOAT, 0, buf);
- } else {
- disableTexCoordPointer(gl, i);
- }
- }
-
- // Reset client active texture unit to 0
- clientActiveTextureUnit(gl, 0);
- }
-
- lockArray(gl, vertexCount);
-
- if (geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_STRIP_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_TRI_FAN_SET ||
- geo_type == GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET) {
- int primType = 0;
- switch (geo_type) {
- case GeometryRetained.GEO_TYPE_INDEXED_TRI_STRIP_SET:
- primType = GL.GL_TRIANGLE_STRIP;
- break;
- case GeometryRetained.GEO_TYPE_INDEXED_TRI_FAN_SET:
- primType = GL.GL_TRIANGLE_FAN;
- break;
- case GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET:
- primType = GL.GL_LINE_STRIP;
- break;
- }
-
- // Note: using MultiDrawElements is probably more expensive than
- // not in this case due to the need to allocate more temporary
- // direct buffers and slice up the incoming indices array
- int offset = initialIndexIndex;
- IntBuffer indicesBuffer = IntBuffer.wrap(indexCoord);
- for (int i = 0; i < strip_len; i++) {
- indicesBuffer.position(offset);
- int count = sarray[i];
- gl.glDrawElements(primType, count, GL.GL_UNSIGNED_INT, indicesBuffer);
- offset += count;
- }
- } else {
- IntBuffer buf = IntBuffer.wrap(indexCoord);
- buf.position(initialIndexIndex);
- switch (geo_type){
- case GeometryRetained.GEO_TYPE_INDEXED_QUAD_SET : gl.glDrawElements(GL2.GL_QUADS, validIndexCount, GL.GL_UNSIGNED_INT, buf); break;
- case GeometryRetained.GEO_TYPE_INDEXED_TRI_SET : gl.glDrawElements(GL.GL_TRIANGLES, validIndexCount, GL.GL_UNSIGNED_INT, buf); break;
- case GeometryRetained.GEO_TYPE_INDEXED_POINT_SET: gl.glDrawElements(GL.GL_POINTS, validIndexCount, GL.GL_UNSIGNED_INT, buf); break;
- case GeometryRetained.GEO_TYPE_INDEXED_LINE_SET : gl.glDrawElements(GL.GL_LINES, validIndexCount, GL.GL_UNSIGNED_INT, buf); break;
- }
- }
-
- unlockArray(gl);
-
- // clean up if we turned on normalize
- if (isNonUniformScale) {
- gl.glDisable(GL2.GL_NORMALIZE);
- }
-
- if (vattrDefined) {
- resetVertexAttrs(gl, ctx, vertexAttrCount);
- }
-
- if (textureDefined) {
- resetTexture(gl, ctx);
- }
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // GraphicsContext3D methods
- //
-
- // 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) {
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glPixelStorei(GL2.GL_PACK_ROW_LENGTH, width);
- gl.glPixelStorei(GL.GL_PACK_ALIGNMENT, 1);
- 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 = GL2.GL_BGR;
- break;
- case ImageComponentRetained.TYPE_BYTE_RGB:
- oglFormat = GL.GL_RGB;
- break;
- case ImageComponentRetained.TYPE_BYTE_ABGR:
- if (gl.isExtensionAvailable("GL_EXT_abgr")) { // If its zero, should never come here!
- oglFormat = GL2.GL_ABGR_EXT;
- } else {
- assert false;
- return;
- }
- break;
- case ImageComponentRetained.TYPE_BYTE_RGBA:
- // all RGB types are stored as RGBA
- oglFormat = GL.GL_RGBA;
- break;
- case ImageComponentRetained.TYPE_BYTE_LA:
- // all LA types are stored as LA8
- oglFormat = GL.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));
-
-
- } 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));
-
- /* 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) {
-
- 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));
- } 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));
- }
- }
-
- }
-
- // ---------------------------------------------------------------------
-
- //
- // GLSLShaderProgramRetained methods
- //
-
- // ShaderAttributeValue methods
-
- @Override
- ShaderError setGLSLUniform1i(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform1i()");
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform1iARB(unbox(uniformLocation), value);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform1f(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- float value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform1f()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform1fARB(unbox(uniformLocation), value);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform2i(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform2i()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform2iARB(unbox(uniformLocation), value[0], value[1]);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform2f(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- float[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform2f()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform2fARB(unbox(uniformLocation), value[0], value[1]);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform3i(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform3i()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform3iARB(unbox(uniformLocation), value[0], value[1], value[2]);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform3f(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- float[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform3f()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform3fARB(unbox(uniformLocation), value[0], value[1], value[2]);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform4i(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform4i()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform4iARB(unbox(uniformLocation), value[0], value[1], value[2], value[3]);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform4f(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- float[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform4f()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform4fARB(unbox(uniformLocation), value[0], value[1], value[2], value[3]);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniformMatrix3f(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- float[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniformMatrix3f()");
-
- // Load attribute
- // transpose is true : each matrix is supplied in row major order
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniformMatrix3fvARB(unbox(uniformLocation), 1, true, value, 0);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniformMatrix4f(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- float[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniformMatrix4f()");
-
- // Load attribute
- // transpose is true : each matrix is supplied in row major order
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniformMatrix4fvARB(unbox(uniformLocation), 1, true, value, 0);
- return null;
- }
-
- // ShaderAttributeArray methods
-
- @Override
- ShaderError setGLSLUniform1iArray(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int numElements,
- int[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform1iArray()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform1ivARB(unbox(uniformLocation), numElements, value, 0);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform1fArray(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int numElements,
- float[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform1fArray()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform1fvARB(unbox(uniformLocation), numElements, value, 0);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform2iArray(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int numElements,
- int[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform2iArray()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform2ivARB(unbox(uniformLocation), numElements, value, 0);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform2fArray(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int numElements,
- float[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform2fArray()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform2fvARB(unbox(uniformLocation), numElements, value, 0);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform3iArray(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int numElements,
- int[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform3iArray()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform3ivARB(unbox(uniformLocation), numElements, value, 0);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform3fArray(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int numElements,
- float[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform3fArray()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform3fvARB(unbox(uniformLocation), numElements, value, 0);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform4iArray(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int numElements,
- int[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform4iArray()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform4ivARB(unbox(uniformLocation), numElements, value, 0);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniform4fArray(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int numElements,
- float[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniform4fArray()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniform4fvARB(unbox(uniformLocation), numElements, value, 0);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniformMatrix3fArray(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int numElements,
- float[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniformMatrix3fArray()");
-
- // Load attribute
- // transpose is true : each matrix is supplied in row major order
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniformMatrix3fvARB(unbox(uniformLocation), numElements, true, value, 0);
- return null;
- }
-
- @Override
- ShaderError setGLSLUniformMatrix4fArray(Context ctx,
- ShaderProgramId shaderProgramId,
- ShaderAttrLoc uniformLocation,
- int numElements,
- float[] value) {
- if (VERBOSE) System.err.println("JoglPipeline.setGLSLUniformMatrix4fArray()");
-
- // Load attribute
- // transpose is true : each matrix is supplied in row major order
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUniformMatrix4fvARB(unbox(uniformLocation), numElements, true, value, 0);
- return null;
- }
-
- // interfaces for shader compilation, etc.
- @Override
- ShaderError createGLSLShader(Context ctx, int shaderType, ShaderId[] shaderId) {
- if (VERBOSE) System.err.println("JoglPipeline.createGLSLShader()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- int shaderHandle = 0;
- if (shaderType == Shader.SHADER_TYPE_VERTEX) {
- shaderHandle = (int) gl.glCreateShaderObjectARB(GL2.GL_VERTEX_SHADER);
- } else if (shaderType == Shader.SHADER_TYPE_FRAGMENT) {
- shaderHandle = (int) gl.glCreateShaderObjectARB(GL2.GL_FRAGMENT_SHADER);
- }
-
- if (shaderHandle == 0) {
- return new ShaderError(ShaderError.COMPILE_ERROR,
- "Unable to create native shader object");
- }
-
- shaderId[0] = new JoglShaderObject(shaderHandle);
- return null;
- }
- @Override
- ShaderError destroyGLSLShader(Context ctx, ShaderId shaderId) {
- if (VERBOSE) System.err.println("JoglPipeline.destroyGLSLShader()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glDeleteObjectARB(unbox(shaderId));
- return null;
- }
- @Override
- ShaderError compileGLSLShader(Context ctx, ShaderId shaderId, String program) {
- if (VERBOSE) System.err.println("JoglPipeline.compileGLSLShader()");
-
- int id = unbox(shaderId);
- if (id == 0) {
- throw new AssertionError("shaderId == 0");
- }
-
- if (program == null) {
- throw new AssertionError("shader program string is null");
- }
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glShaderSourceARB(id, 1, new String[] { program }, null, 0);
- gl.glCompileShaderARB(id);
- int[] status = new int[1];
- gl.glGetObjectParameterivARB(id, GL2.GL_OBJECT_COMPILE_STATUS_ARB, status, 0);
- if (status[0] == 0) {
- String detailMsg = getInfoLog(gl, id);
- ShaderError res = new ShaderError(ShaderError.COMPILE_ERROR,
- "GLSL shader compile error");
- res.setDetailMessage(detailMsg);
- return res;
- }
- return null;
- }
-
- @Override
- ShaderError createGLSLShaderProgram(Context ctx, ShaderProgramId[] shaderProgramId) {
- if (VERBOSE) System.err.println("JoglPipeline.createGLSLShaderProgram()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- int shaderProgramHandle = (int) gl.glCreateProgramObjectARB();
- if (shaderProgramHandle == 0) {
- return new ShaderError(ShaderError.LINK_ERROR,
- "Unable to create native shader program object");
- }
- shaderProgramId[0] = new JoglShaderObject(shaderProgramHandle);
- return null;
- }
- @Override
- ShaderError destroyGLSLShaderProgram(Context ctx, ShaderProgramId shaderProgramId) {
- if (VERBOSE) System.err.println("JoglPipeline.destroyGLSLShaderProgram()");
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glDeleteObjectARB(unbox(shaderProgramId));
- return null;
- }
- @Override
- ShaderError linkGLSLShaderProgram(Context ctx, ShaderProgramId shaderProgramId,
- ShaderId[] shaderIds) {
- if (VERBOSE) System.err.println("JoglPipeline.linkGLSLShaderProgram()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- int id = unbox(shaderProgramId);
- for (int i = 0; i < shaderIds.length; i++) {
- gl.glAttachObjectARB(id, unbox(shaderIds[i]));
- }
- gl.glLinkProgramARB(id);
- int[] status = new int[1];
- gl.glGetObjectParameterivARB(id, GL2.GL_OBJECT_LINK_STATUS_ARB, status, 0);
- if (status[0] == 0) {
- String detailMsg = getInfoLog(gl, id);
- ShaderError res = new ShaderError(ShaderError.LINK_ERROR,
- "GLSL shader program link error");
- res.setDetailMessage(detailMsg);
- return res;
- }
- return null;
- }
- @Override
- ShaderError bindGLSLVertexAttrName(Context ctx, ShaderProgramId shaderProgramId,
- String attrName, int attrIndex) {
- if (VERBOSE) System.err.println("JoglPipeline.bindGLSLVertexAttrName()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glBindAttribLocation(unbox(shaderProgramId),
- attrIndex + VirtualUniverse.mc.glslVertexAttrOffset,
- attrName);
- return null;
- }
- @Override
- void lookupGLSLShaderAttrNames(Context ctx, ShaderProgramId shaderProgramId,
- int numAttrNames, String[] attrNames, ShaderAttrLoc[] locArr,
- int[] typeArr, int[] sizeArr, boolean[] isArrayArr) {
- if (VERBOSE) System.err.println("JoglPipeline.lookupGLSLShaderAttrNames()");
-
- // set the loc, type, and size arrays to out-of-bound values
- for (int i = 0; i < attrNames.length; i++) {
- locArr[i] = null;
- typeArr[i] = -1;
- sizeArr[i] = -1;
- }
-
- // Loop through the list of active uniform variables, one at a
- // time, searching for a match in the attrNames array.
- //
- // NOTE: Since attrNames isn't sorted, and we don't have a
- // hashtable of names to index locations, we will do a
- // brute-force, linear search of the array. This leads to an
- // O(n^2) algorithm (actually O(n*m) where n is attrNames.length
- // and m is the number of uniform variables), but since we expect
- // N to be small, we will not optimize this at this time.
- int id = unbox(shaderProgramId);
- int[] tmp = new int[1];
- int[] tmp2 = new int[1];
- int[] tmp3 = new int[1];
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glGetObjectParameterivARB(id,
- GL2.GL_OBJECT_ACTIVE_UNIFORMS_ARB,
- tmp, 0);
- int numActiveUniforms = tmp[0];
- gl.glGetObjectParameterivARB(id,
- GL2.GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB,
- tmp, 0);
- int maxStrLen = tmp[0];
- byte[] nameBuf = new byte[maxStrLen];
-
- for (int i = 0; i < numActiveUniforms; i++) {
- gl.glGetActiveUniformARB(id, i, maxStrLen, tmp3, 0,
- tmp, 0,
- tmp2, 0,
- nameBuf, 0);
- int size = tmp[0];
- int type = tmp2[0];
- String name = null;
- try {
- // TODO KCR : Shouldn't this use the default locale?
- name = new String(nameBuf, 0, tmp3[0], "US-ASCII");
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException(e);
- }
-
- // Issue 247 - we need to workaround an ATI bug where they erroneously
- // report individual elements of arrays rather than the array itself
- if (name.length() >= 3 && name.endsWith("]")) {
- if (name.endsWith("[0]")) {
- name = name.substring(0, name.length() - 3);
- } else {
- // Ignore this name
- continue;
- }
- }
-
- // Now try to find the name
- for (int j = 0; j < numAttrNames; j++) {
- if (name.equals(attrNames[j])) {
- sizeArr[j] = size;
- isArrayArr[j] = (size > 1);
- typeArr[j] = glslToJ3dType(type);
- break;
- }
- }
- }
-
- // Now lookup the location of each name in the attrNames array
- for (int i = 0; i < numAttrNames; i++) {
- // Get uniform attribute location
- int loc = gl.glGetUniformLocationARB(id, attrNames[i]);
- locArr[i] = new JoglShaderObject(loc);
- }
- }
-
- @Override
- ShaderError useGLSLShaderProgram(Context ctx, ShaderProgramId shaderProgramId) {
- if (VERBOSE) System.err.println("JoglPipeline.useGLSLShaderProgram()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glUseProgramObjectARB(unbox(shaderProgramId));
- ((JoglContext) ctx).setShaderProgram((JoglShaderObject) shaderProgramId);
- return null;
- }
-
- //----------------------------------------------------------------------
- // Helper methods for above shader routines
- //
- private int unbox(ShaderAttrLoc loc) {
- if (loc == null)
- return 0;
- return ((JoglShaderObject) loc).getValue();
- }
-
- private int unbox(ShaderProgramId id) {
- if (id == null)
- return 0;
- return ((JoglShaderObject) id).getValue();
- }
-
- private int unbox(ShaderId id) {
- if (id == null)
- return 0;
- return ((JoglShaderObject) id).getValue();
- }
-
- private String getInfoLog(GL2 gl, int id) {
- int[] infoLogLength = new int[1];
- gl.glGetObjectParameterivARB(id, GL2.GL_OBJECT_INFO_LOG_LENGTH_ARB, infoLogLength, 0);
- if (infoLogLength[0] > 0) {
- byte[] storage = new byte[infoLogLength[0]];
- int[] len = new int[1];
- gl.glGetInfoLogARB(id, infoLogLength[0], len, 0, storage, 0);
- try {
- // TODO KCR : Shouldn't this use the default locale?
- return new String(storage, 0, len[0], "US-ASCII");
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException(e);
- }
- }
- return null;
- }
-
- private int glslToJ3dType(int type) {
- switch (type) {
- case GL2.GL_BOOL_ARB:
- case GL2.GL_INT:
- case GL2.GL_SAMPLER_2D_ARB:
- case GL2.GL_SAMPLER_3D_ARB:
- case GL2.GL_SAMPLER_CUBE_ARB:
- return ShaderAttributeObjectRetained.TYPE_INTEGER;
-
- case GL.GL_FLOAT:
- return ShaderAttributeObjectRetained.TYPE_FLOAT;
-
- case GL2.GL_INT_VEC2_ARB:
- case GL2.GL_BOOL_VEC2_ARB:
- return ShaderAttributeObjectRetained.TYPE_TUPLE2I;
-
- case GL2.GL_FLOAT_VEC2_ARB:
- return ShaderAttributeObjectRetained.TYPE_TUPLE2F;
-
- case GL2.GL_INT_VEC3_ARB:
- case GL2.GL_BOOL_VEC3_ARB:
- return ShaderAttributeObjectRetained.TYPE_TUPLE3I;
-
- case GL2.GL_FLOAT_VEC3_ARB:
- return ShaderAttributeObjectRetained.TYPE_TUPLE3F;
-
- case GL2.GL_INT_VEC4_ARB:
- case GL2.GL_BOOL_VEC4_ARB:
- return ShaderAttributeObjectRetained.TYPE_TUPLE4I;
-
- case GL2.GL_FLOAT_VEC4_ARB:
- return ShaderAttributeObjectRetained.TYPE_TUPLE4F;
-
- // case GL.GL_FLOAT_MAT2_ARB:
-
- case GL2.GL_FLOAT_MAT3_ARB:
- return ShaderAttributeObjectRetained.TYPE_MATRIX3F;
-
- case GL2.GL_FLOAT_MAT4_ARB:
- return ShaderAttributeObjectRetained.TYPE_MATRIX4F;
-
- // Java 3D does not support the following sampler types:
- //
- // case GL.GL_SAMPLER_1D_ARB:
- // case GL.GL_SAMPLER_1D_SHADOW_ARB:
- // case GL.GL_SAMPLER_2D_SHADOW_ARB:
- // case GL.GL_SAMPLER_2D_RECT_ARB:
- // case GL.GL_SAMPLER_2D_RECT_SHADOW_ARB:
- }
-
- return -1;
- }
-
- // ---------------------------------------------------------------------
-
- //
- // ColoringAttributesRetained methods
- //
-
- @Override
- void updateColoringAttributes(Context ctx,
- float dRed, float dGreen, float dBlue,
- float red, float green, float blue,
- float alpha,
- boolean lightEnable,
- int shadeModel) {
- if (VERBOSE) System.err.println("JoglPipeline.updateColoringAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- float cr, cg, cb;
-
- if (lightEnable) {
- cr = dRed; cg = dGreen; cb = dBlue;
- } else {
- cr = red; cg = green; cb = blue;
- }
- gl.glColor4f(cr, cg, cb, alpha);
- if (shadeModel == ColoringAttributes.SHADE_FLAT) {
- gl.glShadeModel(GL2.GL_FLAT);
- } else {
- gl.glShadeModel(GL2.GL_SMOOTH);
- }
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // DirectionalLightRetained methods
- //
-
- private static final float[] black = new float[4];
- @Override
- void updateDirectionalLight(Context ctx,
- int lightSlot, float red, float green,
- float blue, float dirx, float diry, float dirz) {
- if (VERBOSE) System.err.println("JoglPipeline.updateDirectionalLight()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- int lightNum = GL2.GL_LIGHT0 + lightSlot;
- float[] values = new float[4];
-
- values[0] = red;
- values[1] = green;
- values[2] = blue;
- values[3] = 1.0f;
- gl.glLightfv(lightNum, GL2.GL_DIFFUSE, values, 0);
- gl.glLightfv(lightNum, GL2.GL_SPECULAR, values, 0);
- values[0] = -dirx;
- values[1] = -diry;
- values[2] = -dirz;
- values[3] = 0.0f;
- gl.glLightfv(lightNum, GL2.GL_POSITION, values, 0);
- gl.glLightfv(lightNum, GL2.GL_AMBIENT, black, 0);
- gl.glLightf(lightNum, GL2.GL_CONSTANT_ATTENUATION, 1.0f);
- gl.glLightf(lightNum, GL2.GL_LINEAR_ATTENUATION, 0.0f);
- gl.glLightf(lightNum, GL2.GL_QUADRATIC_ATTENUATION, 0.0f);
- gl.glLightf(lightNum, GL2.GL_SPOT_EXPONENT, 0.0f);
- gl.glLightf(lightNum, GL2.GL_SPOT_CUTOFF, 180.0f);
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // PointLightRetained methods
- //
-
- @Override
- void updatePointLight(Context ctx,
- int lightSlot, float red, float green,
- float blue, float attenx, float atteny, float attenz,
- float posx, float posy, float posz) {
- if (VERBOSE) System.err.println("JoglPipeline.updatePointLight()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- int lightNum = GL2.GL_LIGHT0 + lightSlot;
- float[] values = new float[4];
-
- values[0] = red;
- values[1] = green;
- values[2] = blue;
- values[3] = 1.0f;
- gl.glLightfv(lightNum, GL2.GL_DIFFUSE, values, 0);
- gl.glLightfv(lightNum, GL2.GL_SPECULAR, values, 0);
- gl.glLightfv(lightNum, GL2.GL_AMBIENT, black, 0);
- values[0] = posx;
- values[1] = posy;
- values[2] = posz;
- gl.glLightfv(lightNum, GL2.GL_POSITION, values, 0);
- gl.glLightf(lightNum, GL2.GL_CONSTANT_ATTENUATION, attenx);
- gl.glLightf(lightNum, GL2.GL_LINEAR_ATTENUATION, atteny);
- gl.glLightf(lightNum, GL2.GL_QUADRATIC_ATTENUATION, attenz);
- gl.glLightf(lightNum, GL2.GL_SPOT_EXPONENT, 0.0f);
- gl.glLightf(lightNum, GL2.GL_SPOT_CUTOFF, 180.0f);
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // SpotLightRetained methods
- //
-
- @Override
- void updateSpotLight(Context ctx,
- int lightSlot, float red, float green,
- float blue, float attenx, float atteny, float attenz,
- float posx, float posy, float posz, float spreadAngle,
- float concentration, float dirx, float diry,
- float dirz) {
- if (VERBOSE) System.err.println("JoglPipeline.updateSpotLight()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- int lightNum = GL2.GL_LIGHT0 + lightSlot;
- float[] values = new float[4];
-
- values[0] = red;
- values[1] = green;
- values[2] = blue;
- values[3] = 1.0f;
- gl.glLightfv(lightNum, GL2.GL_DIFFUSE, values, 0);
- gl.glLightfv(lightNum, GL2.GL_SPECULAR, values, 0);
- gl.glLightfv(lightNum, GL2.GL_AMBIENT, black, 0);
- values[0] = posx;
- values[1] = posy;
- values[2] = posz;
- gl.glLightfv(lightNum, GL2.GL_POSITION, values, 0);
- gl.glLightf(lightNum, GL2.GL_CONSTANT_ATTENUATION, attenx);
- gl.glLightf(lightNum, GL2.GL_LINEAR_ATTENUATION, atteny);
- gl.glLightf(lightNum, GL2.GL_QUADRATIC_ATTENUATION, attenz);
- values[0] = dirx;
- values[1] = diry;
- values[2] = dirz;
- gl.glLightfv(lightNum, GL2.GL_SPOT_DIRECTION, values, 0);
- gl.glLightf(lightNum, GL2.GL_SPOT_EXPONENT, concentration);
- gl.glLightf(lightNum, GL2.GL_SPOT_CUTOFF, (float) (spreadAngle * 180.0f / Math.PI));
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // ExponentialFogRetained methods
- //
-
- @Override
- void updateExponentialFog(Context ctx,
- float red, float green, float blue,
- float density) {
- if (VERBOSE) System.err.println("JoglPipeline.updateExponentialFog()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- float[] color = new float[3];
- color[0] = red;
- color[1] = green;
- color[2] = blue;
- gl.glFogi(GL2.GL_FOG_MODE, GL2.GL_EXP);
- gl.glFogfv(GL2.GL_FOG_COLOR, color, 0);
- gl.glFogf(GL2.GL_FOG_DENSITY, density);
- gl.glEnable(GL2.GL_FOG);
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // LinearFogRetained methods
- //
-
- @Override
- void updateLinearFog(Context ctx,
- float red, float green, float blue,
- double fdist, double bdist) {
- if (VERBOSE) System.err.println("JoglPipeline.updateLinearFog()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- float[] color = new float[3];
- color[0] = red;
- color[1] = green;
- color[2] = blue;
- gl.glFogi(GL2.GL_FOG_MODE, GL.GL_LINEAR);
- gl.glFogfv(GL2.GL_FOG_COLOR, color, 0);
- gl.glFogf(GL2.GL_FOG_START, (float) fdist);
- gl.glFogf(GL2.GL_FOG_END, (float) bdist);
- gl.glEnable(GL2.GL_FOG);
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // LineAttributesRetained methods
- //
-
- @Override
- void updateLineAttributes(Context ctx,
- float lineWidth, int linePattern,
- int linePatternMask,
- int linePatternScaleFactor,
- boolean lineAntialiasing) {
- if (VERBOSE) System.err.println("JoglPipeline.updateLineAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glLineWidth(lineWidth);
-
- if (linePattern == LineAttributes.PATTERN_SOLID) {
- gl.glDisable(GL2.GL_LINE_STIPPLE);
- } else {
- if (linePattern == LineAttributes.PATTERN_DASH) { // dashed lines
- gl.glLineStipple(1, (short) 0x00ff);
- } else if (linePattern == LineAttributes.PATTERN_DOT) { // dotted lines
- gl.glLineStipple(1, (short) 0x0101);
- } else if (linePattern == LineAttributes.PATTERN_DASH_DOT) { // dash-dotted lines
- gl.glLineStipple(1, (short) 0x087f);
- } else if (linePattern == LineAttributes.PATTERN_USER_DEFINED) { // user-defined mask
- gl.glLineStipple(linePatternScaleFactor, (short) linePatternMask);
- }
- gl.glEnable(GL2.GL_LINE_STIPPLE);
- }
-
- /* XXXX: Polygon Mode check, blend enable */
- if (lineAntialiasing) {
- gl.glEnable(GL.GL_LINE_SMOOTH);
- } else {
- gl.glDisable(GL.GL_LINE_SMOOTH);
- }
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // MaterialRetained methods
- //
-
- @Override
- void updateMaterial(Context ctx,
- float red, float green, float blue, float alpha,
- float aRed, float aGreen, float aBlue,
- float eRed, float eGreen, float eBlue,
- float dRed, float dGreen, float dBlue,
- float sRed, float sGreen, float sBlue,
- float shininess, int colorTarget, boolean lightEnable) {
- if (VERBOSE) System.err.println("JoglPipeline.updateMaterial()");
-
- float[] color = new float[4];
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- gl.glMaterialf(GL.GL_FRONT_AND_BACK, GL2.GL_SHININESS, shininess);
- switch (colorTarget) {
- case Material.DIFFUSE:
- gl.glColorMaterial(GL.GL_FRONT_AND_BACK, GL2.GL_DIFFUSE);
- break;
- case Material.AMBIENT:
- gl.glColorMaterial(GL.GL_FRONT_AND_BACK, GL2.GL_AMBIENT);
- break;
- case Material.EMISSIVE:
- gl.glColorMaterial(GL.GL_FRONT_AND_BACK, GL2.GL_EMISSION);
- break;
- case Material.SPECULAR:
- gl.glColorMaterial(GL.GL_FRONT_AND_BACK, GL2.GL_SPECULAR);
- break;
- case Material.AMBIENT_AND_DIFFUSE:
- gl.glColorMaterial(GL.GL_FRONT_AND_BACK, GL2.GL_AMBIENT_AND_DIFFUSE);
- break;
- }
-
- color[0] = eRed; color[1] = eGreen; color[2] = eBlue;
- gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL2.GL_EMISSION, color, 0);
-
- color[0] = aRed; color[1] = aGreen; color[2] = aBlue;
- gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL2.GL_AMBIENT, color, 0);
-
- color[0] = sRed; color[1] = sGreen; color[2] = sBlue;
- gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL2.GL_SPECULAR, color, 0);
-
- if (lightEnable) {
- color[0] = dRed; color[1] = dGreen; color[2] = dBlue;
- } else {
- color[0] = red; color[1] = green; color[2] = blue;
- }
- color[3] = alpha;
- gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL2.GL_DIFFUSE, color, 0);
- gl.glColor4f(color[0], color[1], color[2], color[3]);
-
- if (lightEnable) {
- gl.glEnable(GL2.GL_LIGHTING);
- } else {
- gl.glDisable(GL2.GL_LIGHTING);
- }
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // ModelClipRetained methods
- //
-
- @Override
- void updateModelClip(Context ctx, int planeNum, boolean enableFlag,
- double A, double B, double C, double D) {
- if (VERBOSE) System.err.println("JoglPipeline.updateModelClip()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- double[] equation = new double[4];
- int pl = GL2.GL_CLIP_PLANE0 + planeNum;
-
- // OpenGL clip planes are opposite to J3d clip planes
- if (enableFlag) {
- equation[0] = -A;
- equation[1] = -B;
- equation[2] = -C;
- equation[3] = -D;
- gl.glClipPlane(pl, DoubleBuffer.wrap(equation));
- gl.glEnable(pl);
- } else {
- gl.glDisable(pl);
- }
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // PointAttributesRetained methods
- //
-
- @Override
- void updatePointAttributes(Context ctx, float pointSize, boolean pointAntialiasing) {
- if (VERBOSE) System.err.println("JoglPipeline.updatePointAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glPointSize(pointSize);
-
- // XXXX: Polygon Mode check, blend enable
- if (pointAntialiasing) {
- gl.glEnable(GL2.GL_POINT_SMOOTH);
- } else {
- gl.glDisable(GL2.GL_POINT_SMOOTH);
- }
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // PolygonAttributesRetained methods
- //
-
- @Override
- void updatePolygonAttributes(Context ctx,
- int polygonMode, int cullFace,
- boolean backFaceNormalFlip,
- float polygonOffset,
- float polygonOffsetFactor) {
- if (VERBOSE) System.err.println("JoglPipeline.updatePolygonAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- if (cullFace == PolygonAttributes.CULL_NONE) {
- gl.glDisable(GL.GL_CULL_FACE);
- } else {
- if (cullFace == PolygonAttributes.CULL_BACK) {
- gl.glCullFace(GL.GL_BACK);
- } else {
- gl.glCullFace(GL.GL_FRONT);
- }
- gl.glEnable(GL.GL_CULL_FACE);
- }
-
- if (backFaceNormalFlip && (cullFace != PolygonAttributes.CULL_BACK)) {
- gl.glLightModeli(GL2.GL_LIGHT_MODEL_TWO_SIDE, GL.GL_TRUE);
- } else {
- gl.glLightModeli(GL2.GL_LIGHT_MODEL_TWO_SIDE, GL.GL_FALSE);
- }
-
- if (polygonMode == PolygonAttributes.POLYGON_POINT) {
- gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2.GL_POINT);
- } else if (polygonMode == PolygonAttributes.POLYGON_LINE) {
- gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2.GL_LINE);
- } else {
- gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2.GL_FILL);
- }
-
- gl.glPolygonOffset(polygonOffsetFactor, polygonOffset);
-
- if ((polygonOffsetFactor != 0.0) || (polygonOffset != 0.0)) {
- switch (polygonMode) {
- case PolygonAttributes.POLYGON_POINT:
- gl.glEnable(GL2.GL_POLYGON_OFFSET_POINT);
- gl.glDisable(GL2.GL_POLYGON_OFFSET_LINE);
- gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
- break;
- case PolygonAttributes.POLYGON_LINE:
- gl.glEnable(GL2.GL_POLYGON_OFFSET_LINE);
- gl.glDisable(GL2.GL_POLYGON_OFFSET_POINT);
- gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
- break;
- case PolygonAttributes.POLYGON_FILL:
- gl.glEnable(GL.GL_POLYGON_OFFSET_FILL);
- gl.glDisable(GL2.GL_POLYGON_OFFSET_POINT);
- gl.glDisable(GL2.GL_POLYGON_OFFSET_LINE);
- break;
- }
- } else {
- gl.glDisable(GL2.GL_POLYGON_OFFSET_POINT);
- gl.glDisable(GL2.GL_POLYGON_OFFSET_LINE);
- gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
- }
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // RenderingAttributesRetained methods
- //
-
- @Override
- void updateRenderingAttributes(Context ctx,
- boolean depthBufferWriteEnableOverride,
- boolean depthBufferEnableOverride,
- boolean depthBufferEnable,
- boolean depthBufferWriteEnable,
- int depthTestFunction,
- float alphaTestValue, int alphaTestFunction,
- boolean ignoreVertexColors,
- boolean rasterOpEnable, int rasterOp,
- boolean userStencilAvailable, boolean stencilEnable,
- int stencilFailOp, int stencilZFailOp, int stencilZPassOp,
- int stencilFunction, int stencilReferenceValue,
- int stencilCompareMask, int stencilWriteMask ) {
- if (VERBOSE) System.err.println("JoglPipeline.updateRenderingAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- if (!depthBufferEnableOverride) {
- if (depthBufferEnable) {
- gl.glEnable(GL.GL_DEPTH_TEST);
- gl.glDepthFunc(getFunctionValue(depthTestFunction));
- } else {
- gl.glDisable(GL.GL_DEPTH_TEST);
- }
- }
-
- if (!depthBufferWriteEnableOverride) {
- if (depthBufferWriteEnable) {
- gl.glDepthMask(true);
- } else {
- gl.glDepthMask(false);
- }
- }
-
- if (alphaTestFunction == RenderingAttributes.ALWAYS) {
- gl.glDisable(GL2.GL_ALPHA_TEST);
- } else {
- gl.glEnable(GL2.GL_ALPHA_TEST);
- gl.glAlphaFunc(getFunctionValue(alphaTestFunction), alphaTestValue);
- }
-
- if (ignoreVertexColors) {
- gl.glDisable(GL2.GL_COLOR_MATERIAL);
- } else {
- gl.glEnable(GL2.GL_COLOR_MATERIAL);
- }
-
- if (rasterOpEnable) {
- gl.glEnable(GL.GL_COLOR_LOGIC_OP);
- switch (rasterOp) {
- case RenderingAttributes.ROP_CLEAR:
- gl.glLogicOp(GL.GL_CLEAR);
- break;
- case RenderingAttributes.ROP_AND:
- gl.glLogicOp(GL.GL_AND);
- break;
- case RenderingAttributes.ROP_AND_REVERSE:
- gl.glLogicOp(GL.GL_AND_REVERSE);
- break;
- case RenderingAttributes.ROP_COPY:
- gl.glLogicOp(GL.GL_COPY);
- break;
- case RenderingAttributes.ROP_AND_INVERTED:
- gl.glLogicOp(GL.GL_AND_INVERTED);
- break;
- case RenderingAttributes.ROP_NOOP:
- gl.glLogicOp(GL.GL_NOOP);
- break;
- case RenderingAttributes.ROP_XOR:
- gl.glLogicOp(GL.GL_XOR);
- break;
- case RenderingAttributes.ROP_OR:
- gl.glLogicOp(GL.GL_OR);
- break;
- case RenderingAttributes.ROP_NOR:
- gl.glLogicOp(GL.GL_NOR);
- break;
- case RenderingAttributes.ROP_EQUIV:
- gl.glLogicOp(GL.GL_EQUIV);
- break;
- case RenderingAttributes.ROP_INVERT:
- gl.glLogicOp(GL.GL_INVERT);
- break;
- case RenderingAttributes.ROP_OR_REVERSE:
- gl.glLogicOp(GL.GL_OR_REVERSE);
- break;
- case RenderingAttributes.ROP_COPY_INVERTED:
- gl.glLogicOp(GL.GL_COPY_INVERTED);
- break;
- case RenderingAttributes.ROP_OR_INVERTED:
- gl.glLogicOp(GL.GL_OR_INVERTED);
- break;
- case RenderingAttributes.ROP_NAND:
- gl.glLogicOp(GL.GL_NAND);
- break;
- case RenderingAttributes.ROP_SET:
- gl.glLogicOp(GL.GL_SET);
- break;
- }
- } else {
- gl.glDisable(GL.GL_COLOR_LOGIC_OP);
- }
-
- if (userStencilAvailable) {
- if (stencilEnable) {
- gl.glEnable(GL.GL_STENCIL_TEST);
-
- gl.glStencilOp(getStencilOpValue(stencilFailOp),
- getStencilOpValue(stencilZFailOp),
- getStencilOpValue(stencilZPassOp));
-
- gl.glStencilFunc(getFunctionValue(stencilFunction),
- stencilReferenceValue, stencilCompareMask);
-
- gl.glStencilMask(stencilWriteMask);
-
- } else {
- gl.glDisable(GL.GL_STENCIL_TEST);
- }
- }
- }
-
- private int getFunctionValue(int func) {
- switch (func) {
- case RenderingAttributes.ALWAYS:
- func = GL.GL_ALWAYS;
- break;
- case RenderingAttributes.NEVER:
- func = GL.GL_NEVER;
- break;
- case RenderingAttributes.EQUAL:
- func = GL.GL_EQUAL;
- break;
- case RenderingAttributes.NOT_EQUAL:
- func = GL.GL_NOTEQUAL;
- break;
- case RenderingAttributes.LESS:
- func = GL.GL_LESS;
- break;
- case RenderingAttributes.LESS_OR_EQUAL:
- func = GL.GL_LEQUAL;
- break;
- case RenderingAttributes.GREATER:
- func = GL.GL_GREATER;
- break;
- case RenderingAttributes.GREATER_OR_EQUAL:
- func = GL.GL_GEQUAL;
- break;
- }
-
- return func;
- }
-
- private int getStencilOpValue(int op) {
- switch (op) {
- case RenderingAttributes.STENCIL_KEEP:
- op = GL.GL_KEEP;
- break;
- case RenderingAttributes.STENCIL_ZERO:
- op = GL.GL_ZERO;
- break;
- case RenderingAttributes.STENCIL_REPLACE:
- op = GL.GL_REPLACE;
- break;
- case RenderingAttributes.STENCIL_INCR:
- op = GL.GL_INCR;
- break;
- case RenderingAttributes.STENCIL_DECR:
- op = GL.GL_DECR;
- break;
- case RenderingAttributes.STENCIL_INVERT:
- op = GL.GL_INVERT;
- break;
- }
-
- return op;
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // TexCoordGenerationRetained methods
- //
-
- /**
- * This method updates the native context:
- * trans contains eyeTovworld transform in d3d
- * trans contains vworldToEye transform in ogl
- */
- @Override
- void updateTexCoordGeneration(Context ctx,
- boolean enable, int genMode, int format,
- float planeSx, float planeSy, float planeSz, float planeSw,
- float planeTx, float planeTy, float planeTz, float planeTw,
- float planeRx, float planeRy, float planeRz, float planeRw,
- float planeQx, float planeQy, float planeQz, float planeQw,
- double[] vworldToEc) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexCoordGeneration()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- float[] planeS = new float[4];
- float[] planeT = new float[4];
- float[] planeR = new float[4];
- float[] planeQ = new float[4];
-
- if (enable) {
- gl.glEnable(GL2.GL_TEXTURE_GEN_S);
- gl.glEnable(GL2.GL_TEXTURE_GEN_T);
- if (format == TexCoordGeneration.TEXTURE_COORDINATE_3) {
- gl.glEnable(GL2.GL_TEXTURE_GEN_R);
- gl.glDisable(GL2.GL_TEXTURE_GEN_Q);
- } else if (format == TexCoordGeneration.TEXTURE_COORDINATE_4) {
- gl.glEnable(GL2.GL_TEXTURE_GEN_R);
- gl.glEnable(GL2.GL_TEXTURE_GEN_Q);
- } else {
- gl.glDisable(GL2.GL_TEXTURE_GEN_R);
- gl.glDisable(GL2.GL_TEXTURE_GEN_Q);
- }
-
- if (genMode != TexCoordGeneration.SPHERE_MAP) {
- planeS[0] = planeSx; planeS[1] = planeSy;
- planeS[2] = planeSz; planeS[3] = planeSw;
- planeT[0] = planeTx; planeT[1] = planeTy;
- planeT[2] = planeTz; planeT[3] = planeTw;
- if (format == TexCoordGeneration.TEXTURE_COORDINATE_3) {
- planeR[0] = planeRx; planeR[1] = planeRy;
- planeR[2] = planeRz; planeR[3] = planeRw;
- } else if (format == TexCoordGeneration.TEXTURE_COORDINATE_4) {
- planeR[0] = planeRx; planeR[1] = planeRy;
- planeR[2] = planeRz; planeR[3] = planeRw;
- planeQ[0] = planeQx; planeQ[1] = planeQy;
- planeQ[2] = planeQz; planeQ[3] = planeQw;
- }
- }
-
- switch (genMode) {
- case TexCoordGeneration.OBJECT_LINEAR:
- gl.glTexGeni(GL2.GL_S, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_OBJECT_LINEAR);
- gl.glTexGeni(GL2.GL_T, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_OBJECT_LINEAR);
- gl.glTexGenfv(GL2.GL_S, GL2.GL_OBJECT_PLANE, planeS, 0);
- gl.glTexGenfv(GL2.GL_T, GL2.GL_OBJECT_PLANE, planeT, 0);
-
- if (format == TexCoordGeneration.TEXTURE_COORDINATE_3) {
- gl.glTexGeni(GL2.GL_R, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_OBJECT_LINEAR);
- gl.glTexGenfv(GL2.GL_R, GL2.GL_OBJECT_PLANE, planeR, 0);
- } else if (format == TexCoordGeneration.TEXTURE_COORDINATE_4) {
- gl.glTexGeni(GL2.GL_R, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_OBJECT_LINEAR);
- gl.glTexGenfv(GL2.GL_R, GL2.GL_OBJECT_PLANE, planeR, 0);
- gl.glTexGeni(GL2.GL_Q, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_OBJECT_LINEAR);
- gl.glTexGenfv(GL2.GL_Q, GL2.GL_OBJECT_PLANE, planeQ, 0);
- }
- break;
- case TexCoordGeneration.EYE_LINEAR:
-
- gl.glMatrixMode(GL2.GL_MODELVIEW);
- gl.glPushMatrix();
-
- if (gl.isExtensionAvailable("GL_VERSION_1_3")) {
- gl.glLoadTransposeMatrixd(vworldToEc, 0);
- } else {
- double[] v = new double[16];
- copyTranspose(vworldToEc, v);
- gl.glLoadMatrixd(v, 0);
- }
-
- gl.glTexGeni(GL2.GL_S, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_EYE_LINEAR);
- gl.glTexGeni(GL2.GL_T, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_EYE_LINEAR);
- gl.glTexGenfv(GL2.GL_S, GL2.GL_EYE_PLANE, planeS, 0);
- gl.glTexGenfv(GL2.GL_T, GL2.GL_EYE_PLANE, planeT, 0);
-
- if (format == TexCoordGeneration.TEXTURE_COORDINATE_3) {
- gl.glTexGeni(GL2.GL_R, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_EYE_LINEAR);
- gl.glTexGenfv(GL2.GL_R, GL2.GL_EYE_PLANE, planeR, 0);
- } else if (format == TexCoordGeneration.TEXTURE_COORDINATE_4) {
- gl.glTexGeni(GL2.GL_R, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_EYE_LINEAR);
- gl.glTexGenfv(GL2.GL_R, GL2.GL_EYE_PLANE, planeR, 0);
- gl.glTexGeni(GL2.GL_Q, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_EYE_LINEAR);
- gl.glTexGenfv(GL2.GL_Q, GL2.GL_EYE_PLANE, planeQ, 0);
- }
- gl.glPopMatrix();
- break;
- case TexCoordGeneration.SPHERE_MAP:
- gl.glTexGeni(GL2.GL_S, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_SPHERE_MAP);
- gl.glTexGeni(GL2.GL_T, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_SPHERE_MAP);
- if (format == TexCoordGeneration.TEXTURE_COORDINATE_3) {
- gl.glTexGeni(GL2.GL_R, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_SPHERE_MAP);
- } else if (format == TexCoordGeneration.TEXTURE_COORDINATE_4) {
- gl.glTexGeni(GL2.GL_R, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_SPHERE_MAP);
- gl.glTexGeni(GL2.GL_Q, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_SPHERE_MAP);
- }
-
- break;
- case TexCoordGeneration.NORMAL_MAP:
- gl.glTexGeni(GL2.GL_S, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_NORMAL_MAP);
- gl.glTexGeni(GL2.GL_T, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_NORMAL_MAP);
- if (format == TexCoordGeneration.TEXTURE_COORDINATE_3) {
- gl.glTexGeni(GL2.GL_R, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_NORMAL_MAP);
- } else if (format == TexCoordGeneration.TEXTURE_COORDINATE_4) {
- gl.glTexGeni(GL2.GL_R, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_NORMAL_MAP);
- gl.glTexGeni(GL2.GL_Q, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_NORMAL_MAP);
- }
- break;
- case TexCoordGeneration.REFLECTION_MAP:
- gl.glTexGeni(GL2.GL_S, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_REFLECTION_MAP);
- gl.glTexGeni(GL2.GL_T, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_REFLECTION_MAP);
- if (format == TexCoordGeneration.TEXTURE_COORDINATE_3) {
- gl.glTexGeni(GL2.GL_R, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_REFLECTION_MAP);
- } else if (format == TexCoordGeneration.TEXTURE_COORDINATE_4) {
- gl.glTexGeni(GL2.GL_R, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_REFLECTION_MAP);
- gl.glTexGeni(GL2.GL_Q, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_REFLECTION_MAP);
- }
- break;
- }
- } else {
- gl.glDisable(GL2.GL_TEXTURE_GEN_S);
- gl.glDisable(GL2.GL_TEXTURE_GEN_T);
- gl.glDisable(GL2.GL_TEXTURE_GEN_R);
- gl.glDisable(GL2.GL_TEXTURE_GEN_Q);
- }
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // TransparencyAttributesRetained methods
- //
-
- private static final int screen_door[][] = {
- /* 0 / 16 */
- {
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- },
- /* 1 / 16 */
- {
- 0x00000000, 0x22222222, 0x00000000, 0x00000000,
- 0x00000000, 0x22222222, 0x00000000, 0x00000000,
- 0x00000000, 0x22222222, 0x00000000, 0x00000000,
- 0x00000000, 0x22222222, 0x00000000, 0x00000000,
- 0x00000000, 0x22222222, 0x00000000, 0x00000000,
- 0x00000000, 0x22222222, 0x00000000, 0x00000000,
- 0x00000000, 0x22222222, 0x00000000, 0x00000000,
- 0x00000000, 0x22222222, 0x00000000, 0x00000000,
- },
- /* 2 / 16 */
- {
- 0x00000000, 0x22222222, 0x00000000, 0x88888888,
- 0x00000000, 0x22222222, 0x00000000, 0x88888888,
- 0x00000000, 0x22222222, 0x00000000, 0x88888888,
- 0x00000000, 0x22222222, 0x00000000, 0x88888888,
- 0x00000000, 0x22222222, 0x00000000, 0x88888888,
- 0x00000000, 0x22222222, 0x00000000, 0x88888888,
- 0x00000000, 0x22222222, 0x00000000, 0x88888888,
- 0x00000000, 0x22222222, 0x00000000, 0x88888888,
- },
- /* 3 / 16 */
- {
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0x88888888,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0x88888888,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0x88888888,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0x88888888,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0x88888888,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0x88888888,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0x88888888,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0x88888888,
- },
- /* 4 / 16 */
- {
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x00000000, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- },
- /* 5 / 16 */
- {
- 0x11111111, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x00000000, 0xaaaaaaaa,
- },
- /* 6 / 16 */
- {
- 0x11111111, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x11111111, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- },
- /* 7 / 16 */
- {
- 0x55555555, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x44444444, 0xaaaaaaaa,
- },
- /* 8 / 16 */
- {
- 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- },
- /* 9 / 16 */
- {
- 0x77777777, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
- },
- /* 10 / 16 */
- {
- 0x77777777, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0x77777777, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- },
- /* 11 / 16 */
- {
- 0xffffffff, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xdddddddd, 0xaaaaaaaa,
- },
- /* 12 / 16 */
- {
- 0xffffffff, 0xaaaaaaaa, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xaaaaaaaa, 0xffffffff, 0xaaaaaaaa,
- },
- /* 13 / 16 */
- {
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xaaaaaaaa,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xaaaaaaaa,
- },
- /* 14 / 16 */
- {
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xbbbbbbbb, 0xffffffff, 0xeeeeeeee,
- },
- /* 15 / 16 */
- {
- 0xffffffff, 0xffffffff, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xeeeeeeee,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xeeeeeeee,
- },
- /* 16 / 16 */
- {
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- },
- };
- private static final ByteBuffer[] screen_door_table = new ByteBuffer[screen_door.length];
- static {
- int eachLen = screen_door[0].length * Buffers.SIZEOF_INT;
- ByteBuffer buf = Buffers.newDirectByteBuffer(screen_door.length * eachLen);
- IntBuffer intBuf = buf.asIntBuffer();
- for (int i = 0; i < screen_door.length; i++) {
- intBuf.put(screen_door[i]);
- }
- buf.rewind();
- for (int i = 0; i < screen_door.length; i++) {
- buf.position(i * eachLen);
- buf.limit((i+1) * eachLen);
- screen_door_table[i] = buf.slice();
- }
- }
-
- private static final int[] blendFunctionTable = new int[TransparencyAttributes.MAX_BLEND_FUNC_TABLE_SIZE];
- static {
- blendFunctionTable[TransparencyAttributes.BLEND_ZERO] = GL.GL_ZERO;
- blendFunctionTable[TransparencyAttributes.BLEND_ONE] = GL.GL_ONE;
- blendFunctionTable[TransparencyAttributes.BLEND_SRC_ALPHA] = GL.GL_SRC_ALPHA;
- blendFunctionTable[TransparencyAttributes.BLEND_ONE_MINUS_SRC_ALPHA] = GL.GL_ONE_MINUS_SRC_ALPHA;
- blendFunctionTable[TransparencyAttributes.BLEND_DST_COLOR] = GL.GL_DST_COLOR;
- blendFunctionTable[TransparencyAttributes.BLEND_ONE_MINUS_DST_COLOR] = GL.GL_ONE_MINUS_DST_COLOR;
- blendFunctionTable[TransparencyAttributes.BLEND_SRC_COLOR] = GL.GL_SRC_COLOR;
- blendFunctionTable[TransparencyAttributes.BLEND_ONE_MINUS_SRC_COLOR] = GL.GL_ONE_MINUS_SRC_COLOR;
- blendFunctionTable[TransparencyAttributes.BLEND_CONSTANT_COLOR] = GL2.GL_CONSTANT_COLOR;
- }
-
- @Override
- void updateTransparencyAttributes(Context ctx,
- float alpha, int geometryType,
- int polygonMode,
- boolean lineAA, boolean pointAA,
- int transparencyMode,
- int srcBlendFunction,
- int dstBlendFunction) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTransparencyAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- if (transparencyMode != TransparencyAttributes.SCREEN_DOOR) {
- gl.glDisable(GL2.GL_POLYGON_STIPPLE);
- } else {
- gl.glEnable(GL2.GL_POLYGON_STIPPLE);
- gl.glPolygonStipple(screen_door_table[(int)(alpha * 16)]);
- }
-
- if ((transparencyMode < TransparencyAttributes.SCREEN_DOOR) ||
- ((((geometryType & RenderMolecule.LINE) != 0) ||
- (polygonMode == PolygonAttributes.POLYGON_LINE))
- && lineAA) ||
- ((((geometryType & RenderMolecule.POINT) != 0) ||
- (polygonMode == PolygonAttributes.POLYGON_POINT))
- && pointAA)) {
- gl.glEnable(GL.GL_BLEND);
- // valid range of blendFunction 0..3 is already verified in shared code.
- gl.glBlendFunc(blendFunctionTable[srcBlendFunction], blendFunctionTable[dstBlendFunction]);
- } else {
- gl.glDisable(GL.GL_BLEND);
- }
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // TextureAttributesRetained methods
- //
-
- @Override
- void updateTextureAttributes(Context ctx,
- double[] transform, boolean isIdentity, int textureMode,
- int perspCorrectionMode,
- float textureBlendColorRed,
- float textureBlendColorGreen,
- float textureBlendColorBlue,
- float textureBlendColorAlpha,
- int textureFormat) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTextureAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT,
- (perspCorrectionMode == TextureAttributes.NICEST) ? GL.GL_NICEST : GL.GL_FASTEST);
-
- // set OGL texture matrix
- gl.glPushAttrib(GL2.GL_TRANSFORM_BIT);
- gl.glMatrixMode(GL.GL_TEXTURE);
-
- if (isIdentity) {
- gl.glLoadIdentity();
- } else if (gl.isExtensionAvailable("GL_VERSION_1_3")) {
- gl.glLoadTransposeMatrixd(transform, 0);
- } else {
- double[] mx = new double[16];
- copyTranspose(transform, mx);
- gl.glLoadMatrixd(mx, 0);
- }
-
- gl.glPopAttrib();
-
- // set texture color
- float[] color = new float[4];
- color[0] = textureBlendColorRed;
- color[1] = textureBlendColorGreen;
- color[2] = textureBlendColorBlue;
- color[3] = textureBlendColorAlpha;
- gl.glTexEnvfv(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_COLOR, color, 0);
-
- // set texture environment mode
-
- switch (textureMode) {
- case TextureAttributes.MODULATE:
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_MODULATE);
- break;
- case TextureAttributes.DECAL:
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_DECAL);
- break;
- case TextureAttributes.BLEND:
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL.GL_BLEND);
- break;
- case TextureAttributes.REPLACE:
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
- break;
- case TextureAttributes.COMBINE:
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_COMBINE);
- break;
- }
-// FIXME: GL_SGI_texture_color_table
-// if (gl.isExtensionAvailable("GL_SGI_texture_color_table")) {
-// gl.glDisable(GL.GL_TEXTURE_COLOR_TABLE_SGI);
-// }
- }
-
- @Override
- void updateRegisterCombiners(Context absCtx,
- double[] transform, boolean isIdentity, int textureMode,
- int perspCorrectionMode,
- float textureBlendColorRed,
- float textureBlendColorGreen,
- float textureBlendColorBlue,
- float textureBlendColorAlpha,
- int textureFormat,
- int combineRgbMode, int combineAlphaMode,
- int[] combineRgbSrc, int[] combineAlphaSrc,
- int[] combineRgbFcn, int[] combineAlphaFcn,
- int combineRgbScale, int combineAlphaScale) {
-// FIXME: GL_NV_register_combiners
-// if (VERBOSE) System.err.println("JoglPipeline.updateRegisterCombiners()");
-//
-// JoglContext ctx = (JoglContext) absCtx;
-// GL2 gl = context(ctx).getGL().getGL2();
-//
-// if (perspCorrectionMode == TextureAttributes.NICEST) {
-// gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
-// } else {
-// gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_FASTEST);
-// }
-//
-// // set OGL texture matrix
-// gl.glPushAttrib(GL2.GL_TRANSFORM_BIT);
-// gl.glMatrixMode(GL.GL_TEXTURE);
-//
-// if (isIdentity) {
-// gl.glLoadIdentity();
-// } else if (gl.isExtensionAvailable("GL_VERSION_1_3")) {
-// gl.glLoadTransposeMatrixd(transform, 0);
-// } else {
-// double[] mx = new double[16];
-// copyTranspose(transform, mx);
-// gl.glLoadMatrixd(mx, 0);
-// }
-//
-// gl.glPopAttrib();
-//
-// // set texture color
-// float[] color = new float[4];
-// color[0] = textureBlendColorRed;
-// color[1] = textureBlendColorGreen;
-// color[2] = textureBlendColorBlue;
-// color[3] = textureBlendColorAlpha;
-// gl.glTexEnvfv(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_COLOR, color, 0);
-//
-// // set texture environment mode
-// gl.glEnable(GL.GL_REGISTER_COMBINERS_NV);
-// int textureUnit = ctx.getCurrentTextureUnit();
-// int combinerUnit = ctx.getCurrentCombinerUnit();
-// int fragment;
-// if (combinerUnit == GL.GL_COMBINER0_NV) {
-// fragment = GL.GL_PRIMARY_COLOR_NV;
-// } else {
-// fragment = GL.GL_SPARE0_NV;
-// }
-//
-// switch (textureMode) {
-// case TextureAttributes.MODULATE:
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_A_NV, fragment,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_B_NV, textureUnit,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_VARIABLE_A_NV, fragment,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_ALPHA);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_VARIABLE_B_NV, textureUnit,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_ALPHA);
-//
-// gl.glCombinerOutputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_SPARE0_NV, GL.GL_DISCARD_NV, GL.GL_DISCARD_NV,
-// GL.GL_NONE, GL.GL_NONE, false, false, false);
-// gl.glCombinerOutputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_SPARE0_NV, GL.GL_DISCARD_NV, GL.GL_DISCARD_NV,
-// GL.GL_NONE, GL.GL_NONE, false, false, false);
-// break;
-//
-// case TextureAttributes.DECAL:
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_A_NV, fragment,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_B_NV, textureUnit,
-// GL.GL_UNSIGNED_INVERT_NV, GL.GL_ALPHA);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_C_NV, textureUnit,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_D_NV, textureUnit,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_ALPHA);
-//
-// gl.glCombinerInputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_VARIABLE_A_NV, fragment,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_ALPHA);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_VARIABLE_B_NV, GL.GL_ZERO,
-// GL.GL_UNSIGNED_INVERT_NV, GL.GL_ALPHA);
-//
-// gl.glCombinerOutputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_DISCARD_NV, GL.GL_DISCARD_NV, GL.GL_SPARE0_NV,
-// GL.GL_NONE, GL.GL_NONE, false, false, false);
-// gl.glCombinerOutputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_SPARE0_NV, GL.GL_DISCARD_NV, GL.GL_DISCARD_NV,
-// GL.GL_NONE, GL.GL_NONE, false, false, false);
-// break;
-//
-// case TextureAttributes.BLEND:
-// gl.glCombinerParameterfvNV(GL.GL_CONSTANT_COLOR0_NV, color, 0);
-//
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_A_NV, fragment,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_B_NV, textureUnit,
-// GL.GL_UNSIGNED_INVERT_NV, GL.GL_RGB);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_C_NV, GL.GL_CONSTANT_COLOR0_NV,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_D_NV, textureUnit,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-//
-// gl.glCombinerInputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_VARIABLE_A_NV, fragment,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_ALPHA);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_VARIABLE_B_NV, textureUnit,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_ALPHA);
-//
-// gl.glCombinerOutputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_DISCARD_NV, GL.GL_DISCARD_NV, GL.GL_SPARE0_NV,
-// GL.GL_NONE, GL.GL_NONE, false, false, false);
-// gl.glCombinerOutputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_SPARE0_NV, GL.GL_DISCARD_NV, GL.GL_DISCARD_NV,
-// GL.GL_NONE, GL.GL_NONE, false, false, false);
-// break;
-//
-// case TextureAttributes.REPLACE:
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_A_NV, textureUnit,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_B_NV, GL.GL_ZERO,
-// GL.GL_UNSIGNED_INVERT_NV, GL.GL_RGB);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_VARIABLE_A_NV, textureUnit,
-// GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_ALPHA);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_VARIABLE_B_NV, GL.GL_ZERO,
-// GL.GL_UNSIGNED_INVERT_NV, GL.GL_ALPHA);
-//
-// gl.glCombinerOutputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_SPARE0_NV, GL.GL_DISCARD_NV, GL.GL_DISCARD_NV,
-// GL.GL_NONE, GL.GL_NONE, false, false, false);
-// gl.glCombinerOutputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_SPARE0_NV, GL.GL_DISCARD_NV, GL.GL_DISCARD_NV,
-// GL.GL_NONE, GL.GL_NONE, false, false, false);
-// break;
-//
-// case TextureAttributes.COMBINE:
-// if (combineRgbMode == TextureAttributes.COMBINE_DOT3) {
-// int color1 = getCombinerArg(gl, combineRgbSrc[0], textureUnit, combinerUnit);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_A_NV, color1,
-// GL.GL_EXPAND_NORMAL_NV, GL.GL_RGB);
-// int color2 = getCombinerArg(gl, combineRgbSrc[1], textureUnit, combinerUnit);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_VARIABLE_B_NV, color2,
-// GL.GL_EXPAND_NORMAL_NV, GL.GL_RGB);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_VARIABLE_A_NV, GL.GL_ZERO,
-// GL.GL_UNSIGNED_INVERT_NV, GL.GL_ALPHA);
-// gl.glCombinerInputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_VARIABLE_B_NV, GL.GL_ZERO,
-// GL.GL_UNSIGNED_INVERT_NV, GL.GL_ALPHA);
-//
-// gl.glCombinerOutputNV(combinerUnit, GL.GL_RGB,
-// GL.GL_SPARE0_NV, GL.GL_DISCARD_NV, GL.GL_DISCARD_NV,
-// GL.GL_NONE/*SCALE_BY_FOUR_NV*/, GL.GL_NONE, true,
-// false, false);
-// gl.glCombinerOutputNV(combinerUnit, GL.GL_ALPHA,
-// GL.GL_SPARE0_NV, GL.GL_DISCARD_NV, GL.GL_DISCARD_NV,
-// GL.GL_NONE, GL.GL_NONE, false,
-// false, false);
-// }
-// break;
-// }
-//
-// gl.glFinalCombinerInputNV(GL.GL_VARIABLE_A_NV,
-// GL.GL_SPARE0_NV, GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glFinalCombinerInputNV(GL.GL_VARIABLE_B_NV,
-// GL.GL_ZERO, GL.GL_UNSIGNED_INVERT_NV, GL.GL_RGB);
-// gl.glFinalCombinerInputNV(GL.GL_VARIABLE_C_NV,
-// GL.GL_ZERO, GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glFinalCombinerInputNV(GL.GL_VARIABLE_D_NV,
-// GL.GL_ZERO, GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glFinalCombinerInputNV(GL.GL_VARIABLE_E_NV,
-// GL.GL_ZERO, GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glFinalCombinerInputNV(GL.GL_VARIABLE_F_NV,
-// GL.GL_ZERO, GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_RGB);
-// gl.glFinalCombinerInputNV(GL.GL_VARIABLE_G_NV,
-// GL.GL_SPARE0_NV, GL.GL_UNSIGNED_IDENTITY_NV, GL.GL_ALPHA);
-//
-// if (gl.isExtensionAvailable("GL_SGI_texture_color_table"))
-// gl.glDisable(GL.GL_TEXTURE_COLOR_TABLE_SGI);
- // GL_SGI_texture_color_table
- }
-
- @Override
- void updateTextureColorTable(Context ctx, int numComponents,
- int colorTableSize,
- int[] textureColorTable) {
-// FIXME: GL_SGI_texture_color_table
-// if (VERBOSE) System.err.println("JoglPipeline.updateTextureColorTable()");
-//
-// GL gl = context(ctx).getGL();
-// if (gl.isExtensionAvailable("GL_SGI_texture_color_table")) {
-// if (numComponents == 3) {
-// gl.glColorTable(GL.GL_TEXTURE_COLOR_TABLE_SGI, GL.GL_RGB,
-// colorTableSize, GL.GL_RGB, GL2.GL_INT, IntBuffer.wrap(textureColorTable));
-// } else {
-// gl.glColorTable(GL.GL_TEXTURE_COLOR_TABLE_SGI, GL.GL_RGBA,
-// colorTableSize, GL.GL_RGBA, GL2.GL_INT, IntBuffer.wrap(textureColorTable));
-// }
-// gl.glEnable(GL.GL_TEXTURE_COLOR_TABLE_SGI);
-// }
- }
-
- @Override
- void updateCombiner(Context ctx,
- int combineRgbMode, int combineAlphaMode,
- int[] combineRgbSrc, int[] combineAlphaSrc,
- int[] combineRgbFcn, int[] combineAlphaFcn,
- int combineRgbScale, int combineAlphaScale) {
- if (VERBOSE) System.err.println("JoglPipeline.updateCombiner()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- int[] GLrgbMode = new int[1];
- int[] GLalphaMode = new int[1];
- getGLCombineMode(gl, combineRgbMode, combineAlphaMode,
- GLrgbMode, GLalphaMode);
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_COMBINE_RGB, GLrgbMode[0]);
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_COMBINE_ALPHA, GLalphaMode[0]);
-
- int nargs;
- if (combineRgbMode == TextureAttributes.COMBINE_REPLACE) {
- nargs = 1;
- } else if (combineRgbMode == TextureAttributes.COMBINE_INTERPOLATE) {
- nargs = 3;
- } else {
- nargs = 2;
- }
-
- for (int i = 0; i < nargs; i++) {
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, _gl_combineRgbSrcIndex[i],
- _gl_combineSrc[combineRgbSrc[i]]);
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, _gl_combineRgbOpIndex[i],
- _gl_combineFcn[combineRgbFcn[i]]);
- }
-
- if (combineAlphaMode == TextureAttributes.COMBINE_REPLACE) {
- nargs = 1;
- } else if (combineAlphaMode == TextureAttributes.COMBINE_INTERPOLATE) {
- nargs = 3;
- } else {
- nargs = 2;
- }
-
- for (int i = 0; i < nargs; i++) {
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, _gl_combineAlphaSrcIndex[i],
- _gl_combineSrc[combineAlphaSrc[i]]);
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, _gl_combineAlphaOpIndex[i],
- _gl_combineFcn[combineAlphaFcn[i]]);
- }
-
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_RGB_SCALE, combineRgbScale);
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_ALPHA_SCALE, combineAlphaScale);
- }
-
- // Helper routines for above
-
- private void getGLCombineMode(GL gl, int combineRgbMode, int combineAlphaMode,
- int[] GLrgbMode, int[] GLalphaMode) {
- switch (combineRgbMode) {
- case TextureAttributes.COMBINE_REPLACE:
- GLrgbMode[0] = GL.GL_REPLACE;
- break;
- case TextureAttributes.COMBINE_MODULATE:
- GLrgbMode[0] = GL2.GL_MODULATE;
- break;
- case TextureAttributes.COMBINE_ADD:
- GLrgbMode[0] = GL2.GL_ADD;
- break;
- case TextureAttributes.COMBINE_ADD_SIGNED:
- GLrgbMode[0] = GL2.GL_ADD_SIGNED;
- break;
- case TextureAttributes.COMBINE_SUBTRACT:
- GLrgbMode[0] = GL2.GL_SUBTRACT;
- break;
- case TextureAttributes.COMBINE_INTERPOLATE:
- GLrgbMode[0] = GL2.GL_INTERPOLATE;
- break;
- case TextureAttributes.COMBINE_DOT3:
- GLrgbMode[0] = GL2.GL_DOT3_RGB;
- break;
- default:
- break;
- }
-
- switch (combineAlphaMode) {
- case TextureAttributes.COMBINE_REPLACE:
- GLalphaMode[0] = GL.GL_REPLACE;
- break;
- case TextureAttributes.COMBINE_MODULATE:
- GLalphaMode[0] = GL2.GL_MODULATE;
- break;
- case TextureAttributes.COMBINE_ADD:
- GLalphaMode[0] = GL2.GL_ADD;
- break;
- case TextureAttributes.COMBINE_ADD_SIGNED:
- GLalphaMode[0] = GL2.GL_ADD_SIGNED;
- break;
- case TextureAttributes.COMBINE_SUBTRACT:
- GLalphaMode[0] = GL2.GL_SUBTRACT;
- break;
- case TextureAttributes.COMBINE_INTERPOLATE:
- GLalphaMode[0] = GL2.GL_INTERPOLATE;
- break;
- case TextureAttributes.COMBINE_DOT3:
- // dot3 will only make sense for alpha if rgb is also
- // doing dot3. So if rgb is not doing dot3, fallback to replace
- if (combineRgbMode == TextureAttributes.COMBINE_DOT3) {
- GLrgbMode[0] = GL2.GL_DOT3_RGBA;
- } else {
- GLalphaMode[0] = GL.GL_REPLACE;
- }
- break;
- default:
- break;
- }
- }
-
- // mapping from java enum to gl enum
- private static final int[] _gl_combineRgbSrcIndex = {
- GL2.GL_SOURCE0_RGB,
- GL2.GL_SOURCE1_RGB,
- GL2.GL_SOURCE2_RGB,
- };
-
- private static final int[] _gl_combineAlphaSrcIndex = {
- GL2.GL_SOURCE0_ALPHA,
- GL2.GL_SOURCE1_ALPHA,
- GL2.GL_SOURCE2_ALPHA,
- };
-
- private static final int[] _gl_combineRgbOpIndex = {
- GL2.GL_OPERAND0_RGB,
- GL2.GL_OPERAND1_RGB,
- GL2.GL_OPERAND2_RGB,
- };
-
- private static final int[] _gl_combineAlphaOpIndex = {
- GL2.GL_OPERAND0_ALPHA,
- GL2.GL_OPERAND1_ALPHA,
- GL2.GL_OPERAND2_ALPHA,
- };
-
- private static final int[] _gl_combineSrc = {
- GL2.GL_PRIMARY_COLOR, // TextureAttributes.COMBINE_OBJECT_COLOR
- GL.GL_TEXTURE, // TextureAttributes.COMBINE_TEXTURE
- GL2.GL_CONSTANT, // TextureAttributes.COMBINE_CONSTANT_COLOR
- GL2.GL_PREVIOUS, // TextureAttributes.COMBINE_PREVIOUS_TEXTURE_UNIT_STATE
- };
-
- private static final int[] _gl_combineFcn = {
- GL.GL_SRC_COLOR, // TextureAttributes.COMBINE_SRC_COLOR
- GL.GL_ONE_MINUS_SRC_COLOR, // TextureAttributes.COMBINE_ONE_MINUS_SRC_COLOR
- GL.GL_SRC_ALPHA, // TextureAttributes.COMBINE_SRC_ALPHA
- GL.GL_ONE_MINUS_SRC_ALPHA, // TextureAttributes.COMBINE_ONE_MINUS_SRC_ALPHA
- };
-
-// FIXME: GL_NV_register_combiners
-// private int getCombinerArg(GL gl, int arg, int textureUnit, int combUnit) {
-// int comb = 0;
-//
-// switch (arg) {
-// case TextureAttributes.COMBINE_OBJECT_COLOR:
-// if (combUnit == GL.GL_COMBINER0_NV) {
-// comb = GL.GL_PRIMARY_COLOR_NV;
-// } else {
-// comb = GL.GL_SPARE0_NV;
-// }
-// break;
-// case TextureAttributes.COMBINE_TEXTURE_COLOR:
-// comb = textureUnit;
-// break;
-// case TextureAttributes.COMBINE_CONSTANT_COLOR:
-// comb = GL.GL_CONSTANT_COLOR0_NV;
-// break;
-// case TextureAttributes.COMBINE_PREVIOUS_TEXTURE_UNIT_STATE:
-// comb = textureUnit -1;
-// break;
-// }
-//
-// return comb;
-// }
-
-
- // ---------------------------------------------------------------------
-
- //
- // TextureUnitStateRetained methods
- //
-
- @Override
- void updateTextureUnitState(Context ctx, int index, boolean enable) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTextureUnitState()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- if (index >= 0 && gl.isExtensionAvailable("GL_VERSION_1_3")) {
- gl.glActiveTexture(index + GL.GL_TEXTURE0);
- gl.glClientActiveTexture(GL.GL_TEXTURE0 + index);
-// FIXME: GL_NV_register_combiners
-// if (gl.isExtensionAvailable("GL_NV_register_combiners")) {
-// jctx.setCurrentTextureUnit(index + GL.GL_TEXTURE0);
-// jctx.setCurrentCombinerUnit(index + GL.GL_COMBINER0_NV);
-// gl.glCombinerParameteriNV(GL.GL_NUM_GENERAL_COMBINERS_NV, index + 1);
-// }
- }
-
- if (!enable) {
- // if not enabled, then don't enable any tex mapping
- gl.glDisable(GL2.GL_TEXTURE_1D);
- gl.glDisable(GL.GL_TEXTURE_2D);
- gl.glDisable(GL2.GL_TEXTURE_3D);
- gl.glDisable(GL.GL_TEXTURE_CUBE_MAP);
- }
-
- // if it is enabled, the enable flag will be taken care of
- // in the bindTexture call
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // TextureRetained methods
- // Texture2DRetained methods
- //
-
- @Override
- void bindTexture2D(Context ctx, int objectId, boolean enable) {
- if (VERBOSE) System.err.println("JoglPipeline.bindTexture2D(objectId=" + objectId + ",enable=" + enable + ")");
-
- GL gl = context(ctx).getGL();
- gl.glDisable(GL.GL_TEXTURE_CUBE_MAP);
- gl.glDisable(GL2.GL_TEXTURE_3D);
-
- if (!enable) {
- gl.glDisable(GL.GL_TEXTURE_2D);
- } else {
- gl.glBindTexture(GL.GL_TEXTURE_2D, objectId);
- gl.glEnable(GL.GL_TEXTURE_2D);
- }
- }
-
- @Override
- void updateTexture2DImage(Context ctx,
- int numLevels, int level,
- int textureFormat, int imageFormat,
- int width, int height,
- int boundaryWidth,
- int dataType, Object data, boolean useAutoMipMap) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture2DImage(width=" + width + ",height=" + height + ",level=" + level + ")");
-
- updateTexture2DImage(ctx, GL.GL_TEXTURE_2D,
- numLevels, level, textureFormat, imageFormat,
- width, height, boundaryWidth, dataType, data, useAutoMipMap);
- }
-
- @Override
- void updateTexture2DSubImage(Context ctx,
- int level, int xoffset, int yoffset,
- int textureFormat, int imageFormat,
- int imgXOffset, int imgYOffset,
- int tilew, int width, int height,
- int dataType, Object data, boolean useAutoMipMap) {
-
- /* Note: useAutoMipMap is not use for SubImage in the jogl pipe */
-
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture2DSubImage()");
-
- updateTexture2DSubImage(ctx, GL.GL_TEXTURE_2D,
- level, xoffset, yoffset,
- textureFormat, imageFormat,
- imgXOffset, imgYOffset, tilew, width, height,
- dataType, data);
- }
-
- @Override
- void updateTexture2DLodRange(Context ctx,
- int baseLevel, int maximumLevel,
- float minimumLOD, float maximumLOD) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture2DLodRange()");
-
- updateTextureLodRange(ctx, GL.GL_TEXTURE_2D,
- baseLevel, maximumLevel,
- minimumLOD, maximumLOD);
- }
-
- @Override
- void updateTexture2DLodOffset(Context ctx,
- float lodOffsetS, float lodOffsetT,
- float lodOffsetR) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture2DLodOffset()");
-
- updateTextureLodOffset(ctx, GL.GL_TEXTURE_2D,
- lodOffsetS, lodOffsetT, lodOffsetR);
- }
-
- @Override
- void updateTexture2DBoundary(Context ctx,
- int boundaryModeS, int boundaryModeT,
- float boundaryRed, float boundaryGreen,
- float boundaryBlue, float boundaryAlpha) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture2DBoundary()");
-
- updateTextureBoundary(ctx, GL.GL_TEXTURE_2D,
- boundaryModeS, boundaryModeT, -1,
- boundaryRed, boundaryGreen,
- boundaryBlue, boundaryAlpha);
- }
-
- @Override
- void updateTexture2DFilterModes(Context ctx,
- int minFilter, int magFilter) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture2DFilterModes()");
-
- updateTextureFilterModes(ctx, GL.GL_TEXTURE_2D, minFilter, magFilter);
- }
-
- @Override
- void updateTexture2DSharpenFunc(Context ctx,
- int numSharpenTextureFuncPts,
- float[] sharpenTextureFuncPts) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture2DSharpenFunc()");
-
- updateTextureSharpenFunc(ctx, GL.GL_TEXTURE_2D,
- numSharpenTextureFuncPts, sharpenTextureFuncPts);
- }
-
- @Override
- void updateTexture2DFilter4Func(Context ctx,
- int numFilter4FuncPts,
- float[] filter4FuncPts) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture2DFilter4Func()");
-
- updateTextureFilter4Func(ctx, GL.GL_TEXTURE_2D,
- numFilter4FuncPts, filter4FuncPts);
- }
-
- @Override
- void updateTexture2DAnisotropicFilter(Context ctx, float degree) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture2DAnisotropicFilter()");
-
- updateTextureAnisotropicFilter(ctx, GL.GL_TEXTURE_2D, degree);
- }
-
- private void updateTextureLodRange(Context ctx,
- int target,
- int baseLevel, int maximumLevel,
- float minimumLOD, float maximumLOD) {
- GL gl = context(ctx).getGL();
- // checking of the availability of the extension is already done
- // in the shared code
- gl.glTexParameteri(target, GL2.GL_TEXTURE_BASE_LEVEL, baseLevel);
- gl.glTexParameteri(target, GL2.GL_TEXTURE_MAX_LEVEL, maximumLevel);
- gl.glTexParameterf(target, GL2.GL_TEXTURE_MIN_LOD, minimumLOD);
- gl.glTexParameterf(target, GL2.GL_TEXTURE_MAX_LOD, maximumLOD);
- }
-
- private void updateTextureLodOffset(Context ctx,
- int target,
- float lodOffsetS, float lodOffsetT,
- float lodOffsetR) {
-// FIXME: GL_SGIX_texture_lod_bias
-// GL gl = context(ctx).getGL();
- // checking of the availability of the extension is already done
- // in the shared code
-// gl.glTexParameterf(target, GL.GL_TEXTURE_LOD_BIAS_S_SGIX, lodOffsetS);
-// gl.glTexParameterf(target, GL.GL_TEXTURE_LOD_BIAS_T_SGIX, lodOffsetT);
-// gl.glTexParameterf(target, GL.GL_TEXTURE_LOD_BIAS_R_SGIX, lodOffsetR);
- }
-
- private void updateTextureAnisotropicFilter(Context ctx, int target, float degree) {
- GL gl = context(ctx).getGL();
- // checking of the availability of anisotropic filter functionality
- // is already done in the shared code
- gl.glTexParameterf(target,
- GL.GL_TEXTURE_MAX_ANISOTROPY_EXT,
- degree);
- }
-
- // ---------------------------------------------------------------------
-
- //
- // Texture3DRetained methods
- //
-
- @Override
- void bindTexture3D(Context ctx, int objectId, boolean enable) {
- if (VERBOSE) System.err.println("JoglPipeline.bindTexture3D()");
-
- GL gl = context(ctx).getGL();
- // textureCubeMap will take precedure over 3D Texture
- gl.glDisable(GL.GL_TEXTURE_CUBE_MAP);
-
- if (!enable) {
- gl.glDisable(GL2.GL_TEXTURE_3D);
- } else {
- gl.glBindTexture(GL2.GL_TEXTURE_3D, objectId);
- gl.glEnable(GL2.GL_TEXTURE_3D);
- }
- }
-
- @Override
- void updateTexture3DImage(Context ctx,
- int numLevels, int level,
- int textureFormat, int imageFormat,
- int width, int height, int depth,
- int boundaryWidth,
- int dataType, Object data, boolean useAutoMipMap) {
-
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture3DImage()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- int format = 0;
- int internalFormat = 0;
- int type = GL2.GL_UNSIGNED_INT_8_8_8_8;
- boolean forceAlphaToOne = false;
-
- switch (textureFormat) {
- case Texture.INTENSITY:
- internalFormat = GL2.GL_INTENSITY;
- break;
- case Texture.LUMINANCE:
- internalFormat = GL.GL_LUMINANCE;
- break;
- case Texture.ALPHA:
- internalFormat = GL.GL_ALPHA;
- break;
- case Texture.LUMINANCE_ALPHA:
- internalFormat = GL.GL_LUMINANCE_ALPHA;
- break;
- case Texture.RGB:
- internalFormat = GL.GL_RGB;
- break;
- case Texture.RGBA:
- internalFormat = GL.GL_RGBA;
- break;
- default:
- assert false;
- return;
- }
-
- if (useAutoMipMap) {
- gl.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_GENERATE_MIPMAP, GL.GL_TRUE);
- }
- else {
- gl.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_GENERATE_MIPMAP, GL.GL_FALSE);
- }
-
- if((dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY) ||
- (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_BUFFER)) {
-
- switch (imageFormat) {
- case ImageComponentRetained.TYPE_BYTE_BGR:
- format = GL2.GL_BGR;
- break;
- case ImageComponentRetained.TYPE_BYTE_RGB:
- format = GL.GL_RGB;
- break;
- case ImageComponentRetained.TYPE_BYTE_ABGR:
- if (gl.isExtensionAvailable("GL_EXT_abgr")) { // If its zero, should never come here!
- format = GL2.GL_ABGR_EXT;
- } else {
- assert false;
- return;
- }
- break;
- case ImageComponentRetained.TYPE_BYTE_RGBA:
- // all RGB types are stored as RGBA
- format = GL.GL_RGBA;
- break;
- case ImageComponentRetained.TYPE_BYTE_LA:
- // all LA types are stored as LA8
- format = GL.GL_LUMINANCE_ALPHA;
- break;
- case ImageComponentRetained.TYPE_BYTE_GRAY:
- if (internalFormat == GL.GL_ALPHA) {
- format = GL.GL_ALPHA;
- } else {
- format = GL.GL_LUMINANCE;
- }
- break;
- case ImageComponentRetained.TYPE_USHORT_GRAY:
- case ImageComponentRetained.TYPE_INT_BGR:
- case ImageComponentRetained.TYPE_INT_RGB:
- case ImageComponentRetained.TYPE_INT_ARGB:
- default:
- assert false;
- return;
- }
-
- if(dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY) {
-
- gl.glTexImage3D(GL2.GL_TEXTURE_3D,
- level, internalFormat,
- width, height, depth, boundaryWidth,
- format, GL.GL_UNSIGNED_BYTE, ByteBuffer.wrap((byte[]) data));
- }
- else {
- gl.glTexImage3D(GL2.GL_TEXTURE_3D,
- level, internalFormat,
- width, height, depth, boundaryWidth,
- format, GL.GL_UNSIGNED_BYTE, (ByteBuffer) data);
- }
-
- } else if((dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY) ||
- (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_BUFFER)) {
-
- switch (imageFormat) {
- /* GL_BGR */
- case ImageComponentRetained.TYPE_INT_BGR: /* Assume XBGR format */
- format = GL.GL_RGBA;
- type = 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:
- format = GL2.GL_BGRA;
- type = 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);
- }
-
- if(dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY) {
- gl.glTexImage3D(GL2.GL_TEXTURE_3D,
- level, internalFormat,
- width, height, depth, boundaryWidth,
- format, type, IntBuffer.wrap((int[]) data));
- } else {
- gl.glTexImage3D(GL2.GL_TEXTURE_3D,
- level, internalFormat,
- width, height, depth, boundaryWidth,
- format, type, (Buffer) data);
- }
-
- /* 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;
- }
- }
-
- @Override
- void updateTexture3DSubImage(Context ctx,
- int level,
- int xoffset, int yoffset, int zoffset,
- int textureFormat, int imageFormat,
- int imgXOffset, int imgYOffset, int imgZOffset,
- int tilew, int tileh,
- int width, int height, int depth,
- int dataType, Object data, boolean useAutoMipMap) {
-
- /* Note: useAutoMipMap is not use for SubImage in the jogl pipe */
-
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture3DSubImage()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- int format = 0;
- int internalFormat = 0;
- int type = GL2.GL_UNSIGNED_INT_8_8_8_8;
- int numBytes = 0;
- boolean forceAlphaToOne = false;
- boolean pixelStore = false;
-
- if (imgXOffset > 0 || (width < tilew)) {
- pixelStore = true;
- gl.glPixelStorei(GL2.GL_UNPACK_ROW_LENGTH, tilew);
- }
-
- switch (textureFormat) {
- case Texture.INTENSITY:
- internalFormat = GL2.GL_INTENSITY;
- break;
- case Texture.LUMINANCE:
- internalFormat = GL.GL_LUMINANCE;
- break;
- case Texture.ALPHA:
- internalFormat = GL.GL_ALPHA;
- break;
- case Texture.LUMINANCE_ALPHA:
- internalFormat = GL.GL_LUMINANCE_ALPHA;
- break;
- case Texture.RGB:
- internalFormat = GL.GL_RGB;
- break;
- case Texture.RGBA:
- internalFormat = GL.GL_RGBA;
- break;
- default:
- assert false;
- }
-
- if((dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY) ||
- (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_BUFFER)) {
-
- switch (imageFormat) {
- case ImageComponentRetained.TYPE_BYTE_BGR:
- format = GL2.GL_BGR;
- numBytes = 3;
- break;
- case ImageComponentRetained.TYPE_BYTE_RGB:
- format = GL.GL_RGB;
- numBytes = 3;
- break;
- case ImageComponentRetained.TYPE_BYTE_ABGR:
- if (gl.isExtensionAvailable("GL_EXT_abgr")) { // If its zero, should never come here!
- format = GL2.GL_ABGR_EXT;
- numBytes = 4;
- } else {
- assert false;
- return;
- }
- break;
- case ImageComponentRetained.TYPE_BYTE_RGBA:
- // all RGB types are stored as RGBA
- format = GL.GL_RGBA;
- numBytes = 4;
- break;
- case ImageComponentRetained.TYPE_BYTE_LA:
- // all LA types are stored as LA8
- format = GL.GL_LUMINANCE_ALPHA;
- numBytes = 2;
- break;
- case ImageComponentRetained.TYPE_BYTE_GRAY:
- if (internalFormat == GL.GL_ALPHA) {
- format = GL.GL_ALPHA;
- numBytes = 1;
- } else {
- format = GL.GL_LUMINANCE;
- numBytes = 1;
- }
- break;
- case ImageComponentRetained.TYPE_USHORT_GRAY:
- case ImageComponentRetained.TYPE_INT_BGR:
- case ImageComponentRetained.TYPE_INT_RGB:
- case ImageComponentRetained.TYPE_INT_ARGB:
- default:
- assert false;
- return;
- }
-
- ByteBuffer buf = null;
- if(dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY) {
- buf = ByteBuffer.wrap((byte[]) data);
- }
- else {
- buf = (ByteBuffer) data;
- }
-
- int offset = (tilew * tileh * imgZOffset +
- tilew * imgYOffset + imgXOffset) * numBytes;
- buf.position(offset);
- gl.glTexSubImage3D(GL2.GL_TEXTURE_3D,
- level, xoffset, yoffset, zoffset,
- width, height, depth,
- format, GL.GL_UNSIGNED_BYTE,
- buf);
-
- } else if((dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY) ||
- (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_BUFFER)) {
-
- switch (imageFormat) {
- /* GL_BGR */
- case ImageComponentRetained.TYPE_INT_BGR: /* Assume XBGR format */
- format = GL.GL_RGBA;
- type = 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:
- format = GL2.GL_BGRA;
- type = 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);
- }
-
- IntBuffer buf = null;
- if(dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY) {
- buf = IntBuffer.wrap((int[]) data);
- }
- else {
- buf = (IntBuffer) data;
- }
-
- int offset = tilew * tileh * imgZOffset +
- tilew * imgYOffset + imgXOffset;
- buf.position(offset);
- gl.glTexSubImage3D(GL2.GL_TEXTURE_3D,
- level, xoffset, yoffset, zoffset,
- width, height, depth,
- format, type,
- buf);
-
- /* 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;
- return;
- }
-
- if (pixelStore) {
- gl.glPixelStorei(GL2.GL_UNPACK_ROW_LENGTH, 0);
- }
-
- }
-
-
- @Override
- void updateTexture3DLodRange(Context ctx,
- int baseLevel, int maximumLevel,
- float minimumLod, float maximumLod) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture3DLodRange()");
-
- updateTextureLodRange(ctx, GL2.GL_TEXTURE_3D,
- baseLevel, maximumLevel,
- minimumLod, maximumLod);
- }
-
- @Override
- void updateTexture3DLodOffset(Context ctx,
- float lodOffsetS, float lodOffsetT,
- float lodOffsetR) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture3DLodOffset()");
-
- updateTextureLodOffset(ctx, GL2.GL_TEXTURE_3D,
- lodOffsetS, lodOffsetT, lodOffsetR);
- }
-
- @Override
- void updateTexture3DBoundary(Context ctx,
- int boundaryModeS, int boundaryModeT,
- int boundaryModeR, float boundaryRed,
- float boundaryGreen, float boundaryBlue,
- float boundaryAlpha) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture3DBoundary()");
-
- updateTextureBoundary(ctx, GL2.GL_TEXTURE_3D,
- boundaryModeS, boundaryModeT, boundaryModeR,
- boundaryRed, boundaryGreen,
- boundaryBlue, boundaryAlpha);
- }
-
- @Override
- void updateTexture3DFilterModes(Context ctx,
- int minFilter, int magFilter) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture3DFilterModes()");
-
- updateTextureFilterModes(ctx, GL2.GL_TEXTURE_3D,
- minFilter, magFilter);
- }
-
- @Override
- void updateTexture3DSharpenFunc(Context ctx,
- int numSharpenTextureFuncPts,
- float[] sharpenTextureFuncPts) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture3DSharpenFunc()");
-
- updateTextureSharpenFunc(ctx, GL2.GL_TEXTURE_3D,
- numSharpenTextureFuncPts, sharpenTextureFuncPts);
- }
-
- @Override
- void updateTexture3DFilter4Func(Context ctx,
- int numFilter4FuncPts,
- float[] filter4FuncPts) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture3DFilter4Func()");
-
- updateTextureFilter4Func(ctx, GL2.GL_TEXTURE_3D,
- numFilter4FuncPts, filter4FuncPts);
- }
-
- @Override
- void updateTexture3DAnisotropicFilter(Context ctx, float degree) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTexture3DAnisotropicFilter()");
-
- updateTextureAnisotropicFilter(ctx, GL2.GL_TEXTURE_3D, degree);
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // TextureCubeMapRetained methods
- //
-
- @Override
- void bindTextureCubeMap(Context ctx, int objectId, boolean enable) {
- if (VERBOSE) System.err.println("JoglPipeline.bindTextureCubeMap()");
-
- GL gl = context(ctx).getGL();
- // TextureCubeMap will take precedure over 3D Texture so
- // there is no need to disable 3D Texture here.
- if (!enable) {
- gl.glDisable(GL.GL_TEXTURE_CUBE_MAP);
- } else {
- gl.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, objectId);
- gl.glEnable(GL.GL_TEXTURE_CUBE_MAP);
- }
- }
-
- @Override
- void updateTextureCubeMapImage(Context ctx,
- int face, int numLevels, int level,
- int textureFormat, int imageFormat,
- int width, int height,
- int boundaryWidth,
- int dataType, Object data, boolean useAutoMipMap) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTextureCubeMapImage()");
-
- updateTexture2DImage(ctx, _gl_textureCubeMapFace[face],
- numLevels, level, textureFormat, imageFormat,
- width, height, boundaryWidth, dataType, data, useAutoMipMap);
- }
-
- @Override
- void updateTextureCubeMapSubImage(Context ctx,
- int face, int level, int xoffset, int yoffset,
- int textureFormat,int imageFormat,
- int imgXOffset, int imgYOffset,
- int tilew, int width, int height,
- int dataType, Object data, boolean useAutoMipMap) {
-
- /* Note: useAutoMipMap is not use for SubImage in the jogl pipe */
-
- if (VERBOSE) System.err.println("JoglPipeline.updateTextureCubeMapSubImage()");
-
- updateTexture2DSubImage(ctx, _gl_textureCubeMapFace[face],
- level, xoffset, yoffset, textureFormat,
- imageFormat, imgXOffset, imgYOffset, tilew,
- width, height, dataType, data);
- }
-
- @Override
- void updateTextureCubeMapLodRange(Context ctx,
- int baseLevel, int maximumLevel,
- float minimumLod, float maximumLod) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTextureCubeMapLodRange()");
-
- updateTextureLodRange(ctx,
- GL.GL_TEXTURE_CUBE_MAP,
- baseLevel, maximumLevel,
- minimumLod, maximumLod);
- }
-
- @Override
- void updateTextureCubeMapLodOffset(Context ctx,
- float lodOffsetS, float lodOffsetT,
- float lodOffsetR) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTextureCubeMapLodOffset()");
-
- updateTextureLodOffset(ctx,
- GL.GL_TEXTURE_CUBE_MAP,
- lodOffsetS, lodOffsetT, lodOffsetR);
- }
-
- @Override
- void updateTextureCubeMapBoundary(Context ctx,
- int boundaryModeS, int boundaryModeT,
- float boundaryRed, float boundaryGreen,
- float boundaryBlue, float boundaryAlpha) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTextureCubeMapBoundary()");
-
- updateTextureBoundary(ctx,
- GL.GL_TEXTURE_CUBE_MAP,
- boundaryModeS, boundaryModeT, -1,
- boundaryRed, boundaryGreen,
- boundaryBlue, boundaryAlpha);
- }
-
- @Override
- void updateTextureCubeMapFilterModes(Context ctx,
- int minFilter, int magFilter) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTextureCubeMapFilterModes()");
-
- updateTextureFilterModes(ctx,
- GL.GL_TEXTURE_CUBE_MAP,
- minFilter, magFilter);
- }
-
- @Override
- void updateTextureCubeMapSharpenFunc(Context ctx,
- int numSharpenTextureFuncPts,
- float[] sharpenTextureFuncPts) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTextureCubeMapSharpenFunc()");
-
- updateTextureSharpenFunc(ctx,
- GL.GL_TEXTURE_CUBE_MAP,
- numSharpenTextureFuncPts, sharpenTextureFuncPts);
- }
-
- @Override
- void updateTextureCubeMapFilter4Func(Context ctx,
- int numFilter4FuncPts,
- float[] filter4FuncPts) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTextureCubeMapFilter4Func()");
-
- updateTextureFilter4Func(ctx,
- GL.GL_TEXTURE_CUBE_MAP,
- numFilter4FuncPts, filter4FuncPts);
- }
-
- @Override
- void updateTextureCubeMapAnisotropicFilter(Context ctx, float degree) {
- if (VERBOSE) System.err.println("JoglPipeline.updateTextureCubeMapAnisotropicFilter()");
-
- updateTextureAnisotropicFilter(ctx,
- GL.GL_TEXTURE_CUBE_MAP,
- degree);
- }
-
- //----------------------------------------------------------------------
- //
- // Helper routines for above texture methods
- //
-
- private void updateTexture2DImage(Context ctx,
- int target,
- int numLevels,
- int level,
- int textureFormat,
- int imageFormat,
- int width,
- int height,
- int boundaryWidth,
- int dataType,
- Object data,
- boolean useAutoMipMap) {
- GL2 gl = context(ctx).getGL().getGL2();
-
- int format = 0, internalFormat = 0;
- int type = GL2.GL_UNSIGNED_INT_8_8_8_8;
- boolean forceAlphaToOne = false;
-
- switch (textureFormat) {
- case Texture.INTENSITY:
- internalFormat = GL2.GL_INTENSITY;
- break;
- case Texture.LUMINANCE:
- internalFormat = GL.GL_LUMINANCE;
- break;
- case Texture.ALPHA:
- internalFormat = GL.GL_ALPHA;
- break;
- case Texture.LUMINANCE_ALPHA:
- internalFormat = GL.GL_LUMINANCE_ALPHA;
- break;
- case Texture.RGB:
- internalFormat = GL.GL_RGB;
- break;
- case Texture.RGBA:
- internalFormat = GL.GL_RGBA;
- break;
- default:
- assert false;
- }
-
- if (useAutoMipMap) {
- gl.glTexParameteri(target, GL2.GL_GENERATE_MIPMAP, GL.GL_TRUE);
- }
- else {
- gl.glTexParameteri(target, GL2.GL_GENERATE_MIPMAP, GL.GL_FALSE);
- }
-
- if((dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY) ||
- (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_BUFFER)) {
-
- switch (imageFormat) {
- case ImageComponentRetained.TYPE_BYTE_BGR:
- format = GL2.GL_BGR;
- break;
- case ImageComponentRetained.TYPE_BYTE_RGB:
- format = GL.GL_RGB;
- break;
- case ImageComponentRetained.TYPE_BYTE_ABGR:
- if (gl.isExtensionAvailable("GL_EXT_abgr")) { // If its zero, should never come here!
- format = GL2.GL_ABGR_EXT;
- } else {
- assert false;
- return;
- }
- break;
- case ImageComponentRetained.TYPE_BYTE_RGBA:
- // all RGB types are stored as RGBA
- format = GL.GL_RGBA;
- break;
- case ImageComponentRetained.TYPE_BYTE_LA:
- // all LA types are stored as LA8
- format = GL.GL_LUMINANCE_ALPHA;
- break;
- case ImageComponentRetained.TYPE_BYTE_GRAY:
- if (internalFormat == GL.GL_ALPHA) {
- format = GL.GL_ALPHA;
- } else {
- format = GL.GL_LUMINANCE;
- }
- break;
- case ImageComponentRetained.TYPE_USHORT_GRAY:
- case ImageComponentRetained.TYPE_INT_BGR:
- case ImageComponentRetained.TYPE_INT_RGB:
- case ImageComponentRetained.TYPE_INT_ARGB:
- default:
- assert false;
- return;
- }
-
- if(dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY) {
-
- gl.glTexImage2D(target, level, internalFormat,
- width, height, boundaryWidth,
- format, GL.GL_UNSIGNED_BYTE, ByteBuffer.wrap((byte[])data));
- } else {
- gl.glTexImage2D(target, level, internalFormat,
- width, height, boundaryWidth,
- format, GL.GL_UNSIGNED_BYTE, (Buffer) data);
- }
-
- } else if((dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY) ||
- (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_BUFFER)) {
-
- switch (imageFormat) {
- /* GL_BGR */
- case ImageComponentRetained.TYPE_INT_BGR: /* Assume XBGR format */
- format = GL.GL_RGBA;
- type = 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:
- format = GL2.GL_BGRA;
- type = 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);
- }
-
- if(dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY) {
- gl.glTexImage2D(target, level, internalFormat,
- width, height, boundaryWidth,
- format, type, IntBuffer.wrap((int[])data));
- } else {
- gl.glTexImage2D(target, level, internalFormat,
- width, height, boundaryWidth,
- format, type, (Buffer) data);
- }
-
- /* 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;
- }
- }
-
- private void updateTexture2DSubImage(Context ctx,
- int target,
- int level, int xoffset, int yoffset,
- int textureFormat, int imageFormat,
- int imgXOffset, int imgYOffset,
- int tilew, int width, int height,
- int dataType, Object data) {
- GL2 gl = context(ctx).getGL().getGL2();
-
- int format = 0, internalFormat=0;
- int numBytes = 0;
- int type = GL2.GL_UNSIGNED_INT_8_8_8_8;
- boolean forceAlphaToOne = false;
- boolean pixelStore = false;
-
- if (imgXOffset > 0 || (width < tilew)) {
- pixelStore = true;
- gl.glPixelStorei(GL2.GL_UNPACK_ROW_LENGTH, tilew);
- }
-
- switch (textureFormat) {
- case Texture.INTENSITY:
- internalFormat = GL2.GL_INTENSITY;
- break;
- case Texture.LUMINANCE:
- internalFormat = GL.GL_LUMINANCE;
- break;
- case Texture.ALPHA:
- internalFormat = GL.GL_ALPHA;
- break;
- case Texture.LUMINANCE_ALPHA:
- internalFormat = GL.GL_LUMINANCE_ALPHA;
- break;
- case Texture.RGB:
- internalFormat = GL.GL_RGB;
- break;
- case Texture.RGBA:
- internalFormat = GL.GL_RGBA;
- break;
- default:
- assert false;
- }
-
- if((dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY) ||
- (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_BUFFER)) {
-
- switch (imageFormat) {
- case ImageComponentRetained.TYPE_BYTE_BGR:
- format = GL2.GL_BGR;
- numBytes = 3;
- break;
- case ImageComponentRetained.TYPE_BYTE_RGB:
- format = GL.GL_RGB;
- numBytes = 3;
- break;
- case ImageComponentRetained.TYPE_BYTE_ABGR:
- if (gl.isExtensionAvailable("GL_EXT_abgr")) { // If its zero, should never come here!
- format = GL2.GL_ABGR_EXT;
- numBytes = 4;
- } else {
- assert false;
- return;
- }
- break;
- case ImageComponentRetained.TYPE_BYTE_RGBA:
- // all RGB types are stored as RGBA
- format = GL.GL_RGBA;
- numBytes = 4;
- break;
- case ImageComponentRetained.TYPE_BYTE_LA:
- // all LA types are stored as LA8
- format = GL.GL_LUMINANCE_ALPHA;
- numBytes = 2;
- break;
- case ImageComponentRetained.TYPE_BYTE_GRAY:
- if (internalFormat == GL.GL_ALPHA) {
- format = GL.GL_ALPHA;
- numBytes = 1;
- } else {
- format = GL.GL_LUMINANCE;
- numBytes = 1;
- }
- break;
- case ImageComponentRetained.TYPE_USHORT_GRAY:
- case ImageComponentRetained.TYPE_INT_BGR:
- case ImageComponentRetained.TYPE_INT_RGB:
- case ImageComponentRetained.TYPE_INT_ARGB:
- default:
- assert false;
- return;
- }
-
- ByteBuffer buf = null;
- if(dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY) {
- buf = ByteBuffer.wrap((byte[]) data);
- }
- else {
- buf = (ByteBuffer) data;
- }
-
- // offset by the imageOffset
- buf.position((tilew * imgYOffset + imgXOffset) * numBytes);
- gl.glTexSubImage2D(target, level, xoffset, yoffset, width, height,
- format, GL.GL_UNSIGNED_BYTE, buf);
-
- } else if((dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY) ||
- (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_BUFFER)) {
-
- switch (imageFormat) {
- /* GL_BGR */
- case ImageComponentRetained.TYPE_INT_BGR: /* Assume XBGR format */
- format = GL.GL_RGBA;
- type = 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:
- format = GL2.GL_BGRA;
- type = 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);
- }
-
- IntBuffer buf = null;
- if(dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY) {
- buf = IntBuffer.wrap((int[]) data);
- }
- else {
- buf = (IntBuffer) data;
- }
-
- // offset by the imageOffset
- buf.position(tilew * imgYOffset + imgXOffset);
- gl.glTexSubImage2D(target, level, xoffset, yoffset, width, height,
- format, type, buf);
-
- /* 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;
- return;
- }
-
- if (pixelStore) {
- gl.glPixelStorei(GL2.GL_UNPACK_ROW_LENGTH, 0);
- }
-
- }
-
- void updateTextureFilterModes(Context ctx,
- int target,
- int minFilter,
- int magFilter) {
- GL gl = context(ctx).getGL();
-
- if (EXTRA_DEBUGGING) {
- System.err.println("minFilter: " + getFilterName(minFilter) +
- " magFilter: " + getFilterName(magFilter));
- }
-
- // FIXME: unclear whether we really need to set up the enum values
- // in the JoglContext as is done in the native code depending on
- // extension availability; maybe this is the defined fallback
- // behavior of the various Java3D modes
-
- // set texture min filter
- switch (minFilter) {
- case Texture.FASTEST:
- case Texture.BASE_LEVEL_POINT:
- gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
- break;
- case Texture.BASE_LEVEL_LINEAR:
- gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
- break;
- case Texture.MULTI_LEVEL_POINT:
- gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER,
- GL.GL_NEAREST_MIPMAP_NEAREST);
- break;
- case Texture.NICEST:
- case Texture.MULTI_LEVEL_LINEAR:
- gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER,
- GL.GL_LINEAR_MIPMAP_LINEAR);
- break;
- case Texture.FILTER4:
-// We should never get here as we've disabled the FILTER4 feature
-// gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER,
-// GL.GL_FILTER4_SGIS);
- break;
- }
-
- // set texture mag filter
- switch (magFilter) {
- case Texture.FASTEST:
- case Texture.BASE_LEVEL_POINT:
- gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
- break;
- case Texture.NICEST:
- case Texture.BASE_LEVEL_LINEAR:
- gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
- break;
- case Texture.LINEAR_SHARPEN:
-// We should never get here as we've disabled the TEXTURE_SHARPEN feature
-// gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER,
-// GL.GL_LINEAR_SHARPEN_SGIS);
- break;
- case Texture.LINEAR_SHARPEN_RGB:
-// We should never get here as we've disabled the TEXTURE_SHARPEN feature
-// gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER,
-// GL.GL_LINEAR_SHARPEN_COLOR_SGIS);
- break;
- case Texture.LINEAR_SHARPEN_ALPHA:
-// We should never get here as we've disabled the TEXTURE_SHARPEN feature
-// gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER,
-// GL.GL_LINEAR_SHARPEN_ALPHA_SGIS);
- break;
- case Texture2D.LINEAR_DETAIL:
-// We should never get here as we've disabled the TEXTURE_DETAIL feature
-// gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER,
-// GL.GL_LINEAR_DETAIL_SGIS);
- break;
- case Texture2D.LINEAR_DETAIL_RGB:
-// We should never get here as we've disabled the TEXTURE_DETAIL feature
-// gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER,
-// GL.GL_LINEAR_DETAIL_COLOR_SGIS);
- break;
- case Texture2D.LINEAR_DETAIL_ALPHA:
-// We should never get here as we've disabled the TEXTURE_DETAIL feature
-// gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER,
-// GL.GL_LINEAR_DETAIL_ALPHA_SGIS);
- break;
- case Texture.FILTER4:
-// We should never get here as we've disabled the FILTER4 feature
-// gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER,
-// GL.GL_FILTER4_SGIS);
- break;
- }
- }
-
- void updateTextureBoundary(Context ctx,
- int target,
- int boundaryModeS,
- int boundaryModeT,
- int boundaryModeR,
- float boundaryRed,
- float boundaryGreen,
- float boundaryBlue,
- float boundaryAlpha) {
- GL gl = context(ctx).getGL();
-
- // set texture wrap parameter
- switch (boundaryModeS) {
- case Texture.WRAP:
- gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
- break;
- case Texture.CLAMP:
- gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP);
- break;
- case Texture.CLAMP_TO_EDGE:
- gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S,
- GL.GL_CLAMP_TO_EDGE);
- break;
- case Texture.CLAMP_TO_BOUNDARY:
- gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S,
- GL2.GL_CLAMP_TO_BORDER);
- break;
- }
-
- switch (boundaryModeT) {
- case Texture.WRAP:
- gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);
- break;
- case Texture.CLAMP:
- gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T, GL2.GL_CLAMP);
- break;
- case Texture.CLAMP_TO_EDGE:
- gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T,
- GL.GL_CLAMP_TO_EDGE);
- break;
- case Texture.CLAMP_TO_BOUNDARY:
- gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T,
- GL2.GL_CLAMP_TO_BORDER);
- break;
- }
-
- // applies to Texture3D only
- if (boundaryModeR != -1) {
- switch (boundaryModeR) {
- case Texture.WRAP:
- gl.glTexParameteri(target,
- GL2.GL_TEXTURE_WRAP_R, GL.GL_REPEAT);
- break;
-
- case Texture.CLAMP:
- gl.glTexParameteri(target,
- GL2.GL_TEXTURE_WRAP_R, GL2.GL_CLAMP);
- break;
- case Texture.CLAMP_TO_EDGE:
- gl.glTexParameteri(target,
- GL2.GL_TEXTURE_WRAP_R,
- GL.GL_CLAMP_TO_EDGE);
- break;
- case Texture.CLAMP_TO_BOUNDARY:
- gl.glTexParameteri(target,
- GL2.GL_TEXTURE_WRAP_R,
- GL2.GL_CLAMP_TO_BORDER);
- break;
- }
- }
-
- if (boundaryModeS == Texture.CLAMP ||
- boundaryModeT == Texture.CLAMP ||
- boundaryModeR == Texture.CLAMP) {
- // set texture border color
- float[] color = new float[4];
- color[0] = boundaryRed;
- color[1] = boundaryGreen;
- color[2] = boundaryBlue;
- color[3] = boundaryAlpha;
- gl.glTexParameterfv(target, GL2.GL_TEXTURE_BORDER_COLOR, color, 0);
- }
- }
-
- private static final String getFilterName(int filter) {
- switch (filter) {
- case Texture.FASTEST:
- return "Texture.FASTEST";
- case Texture.NICEST:
- return "Texture.NICEST";
- case Texture.BASE_LEVEL_POINT:
- return "Texture.BASE_LEVEL_POINT";
- case Texture.BASE_LEVEL_LINEAR:
- return "Texture.BASE_LEVEL_LINEAR";
- case Texture.MULTI_LEVEL_POINT:
- return "Texture.MULTI_LEVEL_POINT";
- case Texture.MULTI_LEVEL_LINEAR:
- return "Texture.MULTI_LEVEL_LINEAR";
- case Texture.FILTER4:
- return "Texture.FILTER4";
- case Texture.LINEAR_SHARPEN:
- return "Texture.LINEAR_SHARPEN";
- case Texture.LINEAR_SHARPEN_RGB:
- return "Texture.LINEAR_SHARPEN_RGB";
- case Texture.LINEAR_SHARPEN_ALPHA:
- return "Texture.LINEAR_SHARPEN_ALPHA";
- case Texture2D.LINEAR_DETAIL:
- return "Texture.LINEAR_DETAIL";
- case Texture2D.LINEAR_DETAIL_RGB:
- return "Texture.LINEAR_DETAIL_RGB";
- case Texture2D.LINEAR_DETAIL_ALPHA:
- return "Texture.LINEAR_DETAIL_ALPHA";
- default:
- return "(unknown)";
- }
- }
-
- private void updateTextureSharpenFunc(Context ctx,
- int target,
- int numPts,
- float[] pts) {
- // checking of the availability of sharpen texture functionality
- // is already done in shared code
-// FIXME: GL_SGIS_sharpen_texture
-// GL gl = context(ctx).getGL();
-// gl.glSharpenTexFuncSGIS(target, numPts, pts, 0);
- }
-
- private void updateTextureFilter4Func(Context ctx,
- int target,
- int numPts,
- float[] pts) {
- // checking of the availability of filter4 functionality
- // is already done in shared code
-// FIXME: GL_SGIS_texture_filter4
-// GL gl = context(ctx).getGL();
-// gl.glTexFilterFuncSGIS(target, GL.GL_FILTER4_SGIS,
-// numPts, pts, 0);
- }
-
- // mapping from java enum to gl enum
- private static final int[] _gl_textureCubeMapFace = {
- GL.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
- GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
- GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
- GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
- GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
- GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
- };
-
- // ---------------------------------------------------------------------
-
- //
- // MasterControl methods
- //
-
- // Maximum lights supported by the native API
- @Override
- int getMaximumLights() {
- if (VERBOSE) System.err.println("JoglPipeline.getMaximumLights()");
-
- // FIXME: this isn't quite what the NativePipeline returns but
- // is probably close enough
- return 8;
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // Canvas3D methods - native wrappers
- //
-
- // Mac/JRE 7; called from Renderer when resizing is dedected
- // Implementation follows the approach in jogamp.opengl.GLDrawableHelper.resizeOffscreenDrawable(..)
- @Override
- void resizeOffscreenLayer(Canvas3D cv, int cvWidth, int cvHeight) {
- if (!isOffscreenLayerSurfaceEnabled(cv))
- return;
-
- JoglDrawable joglDrawable = (JoglDrawable)cv.drawable;
- if (!hasFBObjectSizeChanged(joglDrawable, cvWidth, cvHeight))
- return;
-
- int newWidth = Math.max(1, cvWidth);
- int newHeight = Math.max(1, cvHeight);
-
- GLDrawable glDrawble = joglDrawable.getGLDrawable();
- GLContext glContext = context(cv.ctx);
-
- // Assuming glContext != null
-
- final NativeSurface surface = glDrawble.getNativeSurface();
- final ProxySurface proxySurface = (surface instanceof ProxySurface) ? (ProxySurface)surface : null;
-
- final int lockRes = surface.lockSurface();
-
- try {
- // propagate new size - seems not relevant here
- if (proxySurface != null) {
- final UpstreamSurfaceHook ush = proxySurface.getUpstreamSurfaceHook();
- if (ush instanceof UpstreamSurfaceHook.MutableSize) {
- ((UpstreamSurfaceHook.MutableSize)ush).setSurfaceSize(newWidth, newHeight);
- }
- }
- /*else if(DEBUG) { // we have to assume surface contains the new size already, hence size check @ bottom
- System.err.println("GLDrawableHelper.resizeOffscreenDrawable: Drawable's offscreen surface n.a. ProxySurface, but "+ns.getClass().getName()+": "+ns);
- }*/
-
- GL2 gl = glContext.getGL().getGL2();
-
- // FBO : should be the default case on Mac OS X
- if (glDrawble instanceof GLFBODrawable) {
-
- // Resize GLFBODrawable
- // TODO msaa gets lost
-// ((GLFBODrawable)glDrawble).resetSize(gl);
-
- // Alternative: resize GL_BACK FBObject directly,
- // if multisampled the FBO sink (GL_FRONT) will be resized before the swap is executed
- int numSamples = ((GLFBODrawable)glDrawble).getChosenGLCapabilities().getNumSamples();
- FBObject fboObjectBack = ((GLFBODrawable)glDrawble).getFBObject( GL.GL_BACK );
- fboObjectBack.reset(gl, newWidth, newHeight, numSamples/*, false*/); // false = don't reset SamplingSinkFBO immediately
- fboObjectBack.bind(gl);
-
- // If double buffered without antialiasing the GL_FRONT FBObject
- // will be resized by glDrawble after the next swap-call
- }
- // pbuffer - not tested because Mac OS X 10.7+ supports FBO
- else {
- // Create new GLDrawable (pbuffer) and update the coresponding GLContext
-
- final GLContext currentContext = GLContext.getCurrent();
- final GLDrawableFactory factory = glDrawble.getFactory();
-
- // Ensure to sync GL command stream
- if (currentContext != glContext) {
- glContext.makeCurrent();
- }
- gl.glFinish();
- glContext.release();
-
- if (proxySurface != null) {
- proxySurface.enableUpstreamSurfaceHookLifecycle(false);
- }
-
- try {
- glDrawble.setRealized(false);
- // New GLDrawable
- glDrawble = factory.createGLDrawable(surface);
- glDrawble.setRealized(true);
-
- joglDrawable.setGLDrawable(glDrawble);
- }
- finally {
- if (proxySurface != null) {
- proxySurface.enableUpstreamSurfaceHookLifecycle(true);
- }
- }
-
- glContext.setGLDrawable(glDrawble, true); // re-association
-
- // make current last current context
- if (currentContext != null) {
- currentContext.makeCurrent();
- }
- }
- }
- finally {
- surface.unlockSurface();
- }
- }
-
- // Fix for Bug 983
- private void checkAppContext() {
- if (mainThreadContext == null)
- return;
-
- try {
- // Check by reflection that sun.awt.AppContext.getAppContext() doesn't return null
- // (required by ImageIO.write() and other JMF internal calls) to apply workaround proposed at
- // http://stackoverflow.com/questions/17223304/appcontext-is-null-from-rmi-thread-with-java-7-update-25
- final Class<?> appContextClass = Class.forName("sun.awt.AppContext");
- if (appContextClass.getMethod("getAppContext").invoke(null) == null) {
- final Field field = appContextClass.getDeclaredField("threadGroup2appContext");
- field.setAccessible(true);
- final Map threadGroup2appContext = (Map)field.get(null);
- final ThreadGroup currentThreadGroup = Thread.currentThread().getThreadGroup();
- threadGroup2appContext.put(currentThreadGroup, mainThreadContext);
- }
- } catch (Throwable ex) {
- // Let's consider app context is not necessary for the program
- }
- // Don't need mainThreadContext anymore
- mainThreadContext = null;
- }
-
- // This is the native method for creating the underlying graphics context.
- @Override
- Context createNewContext(Canvas3D cv, Drawable drawable,
- Context shareCtx, boolean isSharedCtx,
- boolean offScreen) {
- if (VERBOSE) System.err.println("JoglPipeline.createNewContext()");
-
- checkAppContext();
- GLDrawable glDrawable = null;
- GLContext glContext = null;
-
- if (offScreen) {
- glDrawable = drawable(cv.drawable); // cv.drawable != null, set in 'createOffScreenBuffer'
- glContext = glDrawable.createContext(context(shareCtx));
- }
- else {
- // determined in 'getBestConfiguration'
- GraphicsConfigInfo gcInf0 = Canvas3D.graphicsConfigTable.get(cv.graphicsConfiguration);
- AWTGraphicsConfiguration awtConfig = (AWTGraphicsConfiguration)gcInf0.getPrivateData();
-
- // JAWTWindow
- JAWTWindow nativeWindow = (JAWTWindow)NativeWindowFactory.getNativeWindow(cv, awtConfig);
- nativeWindow.lockSurface();
- try {
- glDrawable = GLDrawableFactory.getFactory(profile).createGLDrawable(nativeWindow);
- glContext = glDrawable.createContext(context(shareCtx));
- }
- finally {
- nativeWindow.unlockSurface();
- }
-
- cv.drawable = new JoglDrawable(glDrawable, nativeWindow);
- }
-
- // assuming that this only gets called after addNotify has been called
- glDrawable.setRealized(true);
-
- // Apparently we are supposed to make the context current at this point
- // and set up a bunch of properties
-
- // Work around for some low end graphics driver bug, such as Intel Chipset.
- // Issue 324 : Lockup J3D program and throw exception using JOGL renderer
- boolean failed = false;
- int failCount = 0;
- int MAX_FAIL_COUNT = 5;
- do {
- failed = false;
- int res = glContext.makeCurrent();
- if (res == GLContext.CONTEXT_NOT_CURRENT) {
- // System.err.println("makeCurrent fail : " + failCount);
- failed = true;
- ++failCount;
- try {
- Thread.sleep(100);
- }
- catch (InterruptedException e) {
- }
- }
- } while (failed && (failCount < MAX_FAIL_COUNT));
-
- if (failCount == MAX_FAIL_COUNT) {
- throw new IllegalRenderingStateException("Unable to make new context current after " + failCount + "tries");
- }
-
- GL2 gl = glContext.getGL().getGL2();
-
- JoglContext ctx = new JoglContext(glContext);
-
- try {
- if (!getPropertiesFromCurrentContext(ctx, gl)) {
- throw new IllegalRenderingStateException("Unable to fetch properties from current OpenGL context");
- }
-
- if(!isSharedCtx){
- // Set up fields in Canvas3D
- setupCanvasProperties(cv, ctx, gl);
- }
-
- // Enable rescale normal
- gl.glEnable(GL2.GL_RESCALE_NORMAL);
-
- gl.glColorMaterial(GL.GL_FRONT_AND_BACK, GL2.GL_DIFFUSE);
- gl.glDepthFunc(GL.GL_LEQUAL);
- gl.glEnable(GL2.GL_COLOR_MATERIAL);
-
- /*
- OpenGL specs:
- glReadBuffer specifies a color buffer as the source for subsequent glReadPixels.
- This source mode is initially GL_FRONT in single-buffered and GL_BACK in double-buffered configurations.
-
- We leave this mode unchanged in on-screen rendering and adjust it in off-screen rendering. See below.
- */
-// gl.glReadBuffer(GL_FRONT); // off window, default for single-buffered non-stereo window
-
- // Issue 417: JOGL: Mip-mapped NPOT textures rendered incorrectly
- // J3D images are aligned to 1 byte
- gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);
-
- // Workaround for issue 400: Enable separate specular by default
- gl.glLightModeli(GL2.GL_LIGHT_MODEL_COLOR_CONTROL, GL2.GL_SEPARATE_SPECULAR_COLOR);
-
-
- // Mac OS X / JRE 7 : onscreen rendering = offscreen rendering
- // bind FBO
- if (!offScreen && glDrawable instanceof GLFBODrawable) {
- GLFBODrawable fboDrawable = (GLFBODrawable)glDrawable;
- // bind GLFBODrawable's drawing FBObject
- // GL_BACK returns the correct FBOObject for single/double buffering, incl. multisampling
- fboDrawable.getFBObject( GL.GL_BACK ).bind(gl);
- }
-
-
- // FBO or pbuffer
- if (offScreen) {
-
- // Final caps
- GLCapabilitiesImmutable chosenCaps = glDrawable.getChosenGLCapabilities();
-
- // FBO
- if (glDrawable instanceof GLFBODrawable) {
- GLFBODrawable fboDrawable = (GLFBODrawable)glDrawable;
- // bind GLFBODrawable's drawing FBObject
- // GL_BACK returns the correct FBOObject for single/double buffering, incl. multisampling
- fboDrawable.getFBObject( GL.GL_BACK ).bind(gl);
- }
- // pbuffer
- else {
- // Double buffering: read from back buffer, as we don't swap
- // Even this setting is identical to the initially mode it is set explicitly
- if (chosenCaps.getDoubleBuffered()) {
- gl.glReadBuffer(GL.GL_BACK);
- }
- else {
- gl.glReadBuffer(GL.GL_FRONT);
- }
- }
- }
- }
- finally {
- glContext.release();
- }
-
- return ctx;
- }
-
- @Override
- void createQueryContext(Canvas3D cv, Drawable drawable,
- boolean offScreen, int width, int height) {
- if (VERBOSE) System.err.println("JoglPipeline.createQueryContext()");
-
- // Assumes createQueryContext is never called for a drawable != null
-
- if (offScreen) {
-
- Drawable offDrawable = createOffScreenBuffer(cv, null, width, height);
-
- GLDrawable glDrawable = drawable(offDrawable);
-
- glDrawable.setRealized(true);
-
- GLContext glContext = glDrawable.createContext(null);
- glContext.makeCurrent();
-
- JoglContext ctx = new JoglContext(glContext);
-
- GL2 gl = glContext.getGL().getGL2();
-
- // get current context properties
- getPropertiesFromCurrentContext(ctx, gl);
- // Set up fields in Canvas3D
- setupCanvasProperties(cv, ctx, gl);
-
- // Done !
-
- glContext.release();
- glContext.destroy();
- glDrawable.setRealized(false);
- }
- else {
-
- // TODO can't find an implementation which avoids the use of QueryCanvas
- // JOGL requires a visible Frame for an onscreen context
-
- Frame f = new Frame();
- f.setUndecorated(true);
- f.setLayout(new BorderLayout());
-
- ContextQuerier querier = new ContextQuerier(cv);
-
- AWTGraphicsConfiguration awtConfig =
- (AWTGraphicsConfiguration)Canvas3D.graphicsConfigTable.get(cv.graphicsConfiguration).getPrivateData();
-
- QueryCanvas canvas = new QueryCanvas(awtConfig, querier);
-
- f.add(canvas, BorderLayout.CENTER);
- f.setSize(MIN_FRAME_SIZE, MIN_FRAME_SIZE);
- f.setVisible(true);
- canvas.doQuery();
- // Attempt to wait for the frame to become visible, but don't block the EDT
- if (!EventQueue.isDispatchThread()) {
- synchronized(querier) {
- if (!querier.done()) {
- try {
- querier.wait(WAIT_TIME);
- }
- catch (InterruptedException e) {
- }
- }
- }
- }
-
- disposeOnEDT(f);
- }
- }
-
- // This is the native for creating an offscreen buffer
- @Override
- Drawable createOffScreenBuffer(Canvas3D cv, Context ctx, int width, int height) {
- if (VERBOSE) System.err.println("JoglPipeline.createOffScreenBuffer()");
-
- // ctx unused, doesn't exist yet
-
- // Offscreen Canvas3D's JoglGraphicsConfiguration
- JoglGraphicsConfiguration jgc = (JoglGraphicsConfiguration)cv.graphicsConfiguration;
-
- // Retrieve the offscreen Canvas3D's GraphicsConfigInfo
- GraphicsConfigInfo gcInf0 = Canvas3D.graphicsConfigTable.get(jgc);
-
- // Offscreen Canvas3D's graphics configuration, determined in 'getBestConfiguration'
- AWTGraphicsConfiguration awtConfig = (AWTGraphicsConfiguration)gcInf0.getPrivateData();
-
- // TODO Offscreen Canvas3D's graphics devise, determined in 'getBestConfiguration'
- //AbstractGraphicsDevice device = awtConfig.getScreen().getDevice(); // throws exception
- // Alternative: default graphics device
- AbstractGraphicsDevice device = GLDrawableFactory.getDesktopFactory().getDefaultDevice();
-
- // Offscreen Canvas3D's capabilites, determined in 'getBestConfiguration'
- GLCapabilities canvasCaps = (GLCapabilities)awtConfig.getChosenCapabilities();
-
- // For further investigations : the user's GraphicsConfigTemplate3D (not used yet)
- GraphicsConfigTemplate3D gct3D = gcInf0.getGraphicsConfigTemplate3D();
-
-
- // Assuming that the offscreen drawable will/can support the chosen GLCapabilities
- // of the offscreen Canvas3D
-
- final GLCapabilities offCaps = new GLCapabilities(profile);
- offCaps.copyFrom(canvasCaps);
-
- // double bufffering only if scene antialiasing is required/preferred and supported
- if (offCaps.getSampleBuffers() == false) {
- offCaps.setDoubleBuffered(false);
- offCaps.setNumSamples(0);
- }
-
- // Never stereo
- offCaps.setStereo(false);
-
- // Set preferred offscreen drawable : framebuffer object (FBO) or pbuffer
- offCaps.setFBO(true); // switches to pbuffer if FBO is not supported
- // caps.setPBuffer(true);
-
- // !! a 'null' capability chooser; JOGL doesn't call a chooser for offscreen drawable
-
- // If FBO : 'offDrawable' is of type com.jogamp.opengl.GLFBODrawable
- GLDrawable offDrawable = GLDrawableFactory.getFactory(profile).createOffscreenDrawable(device, offCaps, null, width, height);
-
-// !! these chosen caps are not final as long as the corresponding context is made current
-//System.out.println("createOffScreenBuffer chosenCaps = " + offDrawable.getChosenGLCapabilities());
-
- return new JoglDrawable(offDrawable, null);
- }
-
- // 'destroyContext' is called first if context exists
- @Override
- void destroyOffScreenBuffer(Canvas3D cv, Context ctx, Drawable drawable) {
- if (VERBOSE) System.err.println("JoglPipeline.destroyOffScreenBuffer()");
-
- // it is done in 'destroyContext'
- }
-
- // This is the native for reading the image from the offscreen buffer
- @Override
- void readOffScreenBuffer(Canvas3D cv, Context ctx, int format, int dataType, Object data, int width, int height) {
- if (VERBOSE) System.err.println("JoglPipeline.readOffScreenBuffer()");
-
- GLDrawable glDrawable = ((JoglDrawable)cv.drawable).getGLDrawable();
- GLCapabilitiesImmutable chosenCaps = glDrawable.getChosenGLCapabilities();
- GLFBODrawable fboDrawable = null;
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- // If FBO
- if (chosenCaps.isFBO()) {
-
- fboDrawable = (GLFBODrawable)glDrawable;
-
- if (chosenCaps.getDoubleBuffered()) {
- // swap = resolve multisampling or flip back/front FBO
- fboDrawable.swapBuffers();
- // unbind texture render target, we read from FBO
- gl.glBindTexture(GL.GL_TEXTURE_2D, 0);
- }
-
- // bind FBO for reading pixel data
- // GL_FRONT = SamplingSinkFBO if double buffered and multisampled
- // GL_FRONT if double buffered ( = GL_BAck before swap was called)
- // GL_FRONT = GL_BACK if single buffered (single FBO)
-
- fboDrawable.getFBObject( GL.GL_FRONT ).bind(gl);
- }
- // else pbuffer
-
- gl.glPixelStorei(GL2.GL_PACK_ROW_LENGTH, width);
- gl.glPixelStorei(GL.GL_PACK_ALIGNMENT, 1);
-
- int type = 0;
-
- if((dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY) ||
- (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_BUFFER)) {
-
- switch (format) {
- // GL_BGR
- case ImageComponentRetained.TYPE_BYTE_BGR:
- type = GL2.GL_BGR;
- break;
- case ImageComponentRetained.TYPE_BYTE_RGB:
- type = GL.GL_RGB;
- break;
- // GL_ABGR_EXT
- case ImageComponentRetained.TYPE_BYTE_ABGR:
- if (gl.isExtensionAvailable("GL_EXT_abgr")) { // If false, should never come here!
- type = GL2.GL_ABGR_EXT;
- } else {
- assert false;
- return;
- }
- break;
- case ImageComponentRetained.TYPE_BYTE_RGBA:
- type = GL.GL_RGBA;
- break;
-
- /* This method only supports 3 and 4 components formats and BYTE types. */
- case ImageComponentRetained.TYPE_BYTE_LA:
- 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:
- throw new AssertionError("illegal format " + format);
- }
-
- gl.glReadPixels(0, 0, width, height, type, GL.GL_UNSIGNED_BYTE, ByteBuffer.wrap((byte[]) data));
-
- }
- else if ((dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_ARRAY) ||
- (dataType == ImageComponentRetained.IMAGE_DATA_TYPE_INT_BUFFER)) {
-
- int intType = GL2.GL_UNSIGNED_INT_8_8_8_8;
- boolean forceAlphaToOne = false;
-
- switch (format) {
- /* GL_BGR */
- case ImageComponentRetained.TYPE_INT_BGR: /* Assume XBGR format */
- type = 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:
- type = GL2.GL_BGRA;
- intType = GL2.GL_UNSIGNED_INT_8_8_8_8_REV;
- break;
- /* This method only supports 3 and 4 components formats and BYTE 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:
- throw new AssertionError("illegal format " + format);
- }
-
- /* 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(0, 0, width, height, type, intType, IntBuffer.wrap((int[]) data));
-
- /* Restore Alpha scale and bias */
- if(forceAlphaToOne) {
- gl.glPixelTransferf(GL2.GL_ALPHA_SCALE, 1.0f);
- gl.glPixelTransferf(GL2.GL_ALPHA_BIAS, 0.0f);
- }
- }
- else {
- throw new AssertionError("illegal image data type " + dataType);
- }
-
- // If FBO
- if (chosenCaps.isFBO()) {
- // bind FBO for drawing
- fboDrawable.getFBObject( GL.GL_BACK ).bind(gl);
- }
- }
-
- // The native method for swapBuffers - onscreen only
-@Override
-void swapBuffers(Canvas3D cv, Context ctx, Drawable drawable) {
- if (VERBOSE) System.err.println("JoglPipeline.swapBuffers()");
- GLDrawable draw = drawable(drawable);
- draw.swapBuffers();
-}
-
- // native method for setting Material when no material is present
- @Override
- void updateMaterialColor(Context ctx, float r, float g, float b, float a) {
- if (VERBOSE) System.err.println("JoglPipeline.updateMaterialColor()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glColor4f(r, g, b, a);
- gl.glDisable(GL2.GL_LIGHTING);
- }
-
- @Override
- void destroyContext(Drawable drawable, Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.destroyContext()");
-
- JoglDrawable joglDrawable = (JoglDrawable)drawable;
- GLContext context = context(ctx);
-
- if (GLContext.getCurrent() == context) {
- context.release();
- }
- context.destroy();
-
- // assuming this is the right point at which to make this call
- joglDrawable.getGLDrawable().setRealized(false);
-
- joglDrawable.destroyNativeWindow();
- }
-
- // This is the native method for doing accumulation.
- @Override
- void accum(Context ctx, float value) {
- if (VERBOSE) System.err.println("JoglPipeline.accum()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glReadBuffer(GL.GL_BACK);
- gl.glAccum(GL2.GL_ACCUM, value);
- gl.glReadBuffer(GL.GL_FRONT);
- }
-
- // This is the native method for doing accumulation return.
- @Override
- void accumReturn(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.accumReturn()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glAccum(GL2.GL_RETURN, 1.0f);
- }
-
- // This is the native method for clearing the accumulation buffer.
- @Override
- void clearAccum(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.clearAccum()");
-
- GL gl = context(ctx).getGL();
- gl.glClear(GL2.GL_ACCUM_BUFFER_BIT);
- }
-
- // This is the native method for getting the number of lights the underlying
- // native library can support.
- @Override
- int getNumCtxLights(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.getNumCtxLights()");
-
- GL gl = context(ctx).getGL();
- int[] res = new int[1];
- gl.glGetIntegerv(GL2.GL_MAX_LIGHTS, res, 0);
- return res[0];
- }
-
- // Native method for decal 1st child setup
- @Override
- boolean decal1stChildSetup(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.decal1stChildSetup()");
-
- GL gl = context(ctx).getGL();
- gl.glEnable(GL.GL_STENCIL_TEST);
- gl.glClearStencil(0x0);
- gl.glClear(GL.GL_STENCIL_BUFFER_BIT);
- gl.glStencilFunc(GL.GL_ALWAYS, 0x1, 0x1);
- gl.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_REPLACE);
- if (gl.glIsEnabled(GL.GL_DEPTH_TEST))
- return true;
- else
- return false;
- }
-
- // Native method for decal nth child setup
- @Override
- void decalNthChildSetup(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.decalNthChildSetup()");
-
- GL gl = context(ctx).getGL();
- gl.glDisable(GL.GL_DEPTH_TEST);
- gl.glStencilFunc(GL.GL_EQUAL, 0x1, 0x1);
- gl.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_KEEP);
- }
-
- // Native method for decal reset
- @Override
- void decalReset(Context ctx, boolean depthBufferEnable) {
- if (VERBOSE) System.err.println("JoglPipeline.decalReset()");
-
- GL gl = context(ctx).getGL();
- gl.glDisable(GL.GL_STENCIL_TEST);
- if (depthBufferEnable)
- gl.glEnable(GL.GL_DEPTH_TEST);
- }
-
- // Native method for eye lighting
- @Override
- void ctxUpdateEyeLightingEnable(Context ctx, boolean localEyeLightingEnable) {
- if (VERBOSE) System.err.println("JoglPipeline.ctxUpdateEyeLightingEnable()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- if (localEyeLightingEnable) {
- gl.glLightModeli(GL2.GL_LIGHT_MODEL_LOCAL_VIEWER, GL.GL_TRUE);
- } else {
- gl.glLightModeli(GL2.GL_LIGHT_MODEL_LOCAL_VIEWER, GL.GL_FALSE);
- }
- }
-
- // The following three methods are used in multi-pass case
-
- // native method for setting blend color
- @Override
- void setBlendColor(Context ctx, float red, float green,
- float blue, float alpha) {
- if (VERBOSE) System.err.println("JoglPipeline.setBlendColor()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- if (gl.isExtensionAvailable("GL_ARB_imaging")) {
- gl.glBlendColor(red, green, blue, alpha);
- }
- }
-
- // native method for setting blend func
- @Override
- void setBlendFunc(Context ctx, int srcBlendFunction, int dstBlendFunction) {
- if (VERBOSE) System.err.println("JoglPipeline.setBlendFunc()");
-
- GL gl = context(ctx).getGL();
- gl.glEnable(GL.GL_BLEND);
- gl.glBlendFunc(blendFunctionTable[srcBlendFunction],
- blendFunctionTable[dstBlendFunction]);
- }
-
- // native method for setting fog enable flag
- @Override
- void setFogEnableFlag(Context ctx, boolean enable) {
- if (VERBOSE) System.err.println("JoglPipeline.setFogEnableFlag()");
-
- GL gl = context(ctx).getGL();
-
- if (enable)
- gl.glEnable(GL2.GL_FOG);
- else
- gl.glDisable(GL2.GL_FOG);
- }
-
- // Setup the full scene antialising in D3D and ogl when GL_ARB_multisamle supported
- @Override
- void setFullSceneAntialiasing(Context absCtx, boolean enable) {
- if (VERBOSE) System.err.println("JoglPipeline.setFullSceneAntialiasing()");
-
- JoglContext ctx = (JoglContext) absCtx;
- GL gl = context(ctx).getGL();
- if (ctx.getHasMultisample() && !VirtualUniverse.mc.implicitAntialiasing) {
- if (enable) {
- gl.glEnable(GL.GL_MULTISAMPLE);
- } else {
- gl.glDisable(GL.GL_MULTISAMPLE);
- }
- }
- }
-
- // Native method to update separate specular color control
- @Override
- void updateSeparateSpecularColorEnable(Context ctx, boolean enable) {
- if (VERBOSE) System.err.println("JoglPipeline.updateSeparateSpecularColorEnable()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- if (enable) {
- gl.glLightModeli(GL2.GL_LIGHT_MODEL_COLOR_CONTROL, GL2.GL_SEPARATE_SPECULAR_COLOR);
- } else {
- gl.glLightModeli(GL2.GL_LIGHT_MODEL_COLOR_CONTROL, GL2.GL_SINGLE_COLOR);
- }
- }
-
- // True under Solaris,
- // False under windows when display mode <= 8 bit
- @Override
- boolean validGraphicsMode() {
- if (VERBOSE) System.err.println("JoglPipeline.validGraphicsMode()");
-
- // FIXME: believe this should do exactly what the native code
- // used to, but not 100% sure (also in theory should only run
- // this code on the Windows platform? What about Mac OS X?)
- DisplayMode currentMode =
- GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode();
- // Note: on X11 platforms, a bit depth < 0 simply indicates that
- // multiple visuals are supported on the current display mode
-
- if (VERBOSE) System.err.println(" Returning " + (currentMode.getBitDepth() < 0 ||
- currentMode.getBitDepth() > 8));
-
- return (currentMode.getBitDepth() < 0 ||
- currentMode.getBitDepth() > 8);
- }
-
- // native method for setting light enables
- @Override
- void setLightEnables(Context ctx, long enableMask, int maxLights) {
- if (VERBOSE) System.err.println("JoglPipeline.setLightEnables()");
-
- GL gl = context(ctx).getGL();
-
- for (int i = 0; i < maxLights; i++) {
- if ((enableMask & (1 << i)) != 0) {
- gl.glEnable(GL2.GL_LIGHT0 + i);
- } else {
- gl.glDisable(GL2.GL_LIGHT0 + i);
- }
- }
- }
-
- // native method for setting scene ambient
- @Override
- void setSceneAmbient(Context ctx, float red, float green, float blue) {
- if (VERBOSE) System.err.println("JoglPipeline.setSceneAmbient()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- float[] color = new float[4];
- color[0] = red;
- color[1] = green;
- color[2] = blue;
- color[3] = 1.0f;
- gl.glLightModelfv(GL2.GL_LIGHT_MODEL_AMBIENT, color, 0);
- }
-
- // native method for disabling fog
- @Override
- void disableFog(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.disableFog()");
-
- GL gl = context(ctx).getGL();
- gl.glDisable(GL2.GL_FOG);
- }
-
- // native method for disabling modelClip
- @Override
- void disableModelClip(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.disableModelClip()");
-
- GL gl = context(ctx).getGL();
-
- gl.glDisable(GL2.GL_CLIP_PLANE0);
- gl.glDisable(GL2.GL_CLIP_PLANE1);
- gl.glDisable(GL2.GL_CLIP_PLANE2);
- gl.glDisable(GL2.GL_CLIP_PLANE3);
- gl.glDisable(GL2.GL_CLIP_PLANE4);
- gl.glDisable(GL2.GL_CLIP_PLANE5);
- }
-
- // native method for setting default RenderingAttributes
- @Override
- void resetRenderingAttributes(Context ctx,
- boolean depthBufferWriteEnableOverride,
- boolean depthBufferEnableOverride) {
- if (VERBOSE) System.err.println("JoglPipeline.resetRenderingAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- if (!depthBufferWriteEnableOverride) {
- gl.glDepthMask(true);
- }
- if (!depthBufferEnableOverride) {
- gl.glEnable(GL.GL_DEPTH_TEST);
- }
- gl.glAlphaFunc(GL.GL_ALWAYS, 0.0f);
- gl.glDepthFunc(GL.GL_LEQUAL);
- gl.glEnable(GL2.GL_COLOR_MATERIAL);
- gl.glDisable(GL.GL_COLOR_LOGIC_OP);
- }
-
- // native method for setting default texture
- @Override
- void resetTextureNative(Context ctx, int texUnitIndex) {
- if (VERBOSE) System.err.println("JoglPipeline.resetTextureNative()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- if (texUnitIndex >= 0 &&
- gl.isExtensionAvailable("GL_VERSION_1_3")) {
- gl.glActiveTexture(texUnitIndex + GL.GL_TEXTURE0);
- gl.glClientActiveTexture(texUnitIndex + GL.GL_TEXTURE0);
- }
-
- gl.glDisable(GL2.GL_TEXTURE_1D);
- gl.glDisable(GL.GL_TEXTURE_2D);
- gl.glDisable(GL2.GL_TEXTURE_3D);
- gl.glDisable(GL.GL_TEXTURE_CUBE_MAP);
- }
-
- // native method for activating a particular texture unit
- @Override
- void activeTextureUnit(Context ctx, int texUnitIndex) {
- if (VERBOSE) System.err.println("JoglPipeline.activeTextureUnit()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- if (gl.isExtensionAvailable("GL_VERSION_1_3")) {
- gl.glActiveTexture(texUnitIndex + GL.GL_TEXTURE0);
- gl.glClientActiveTexture(texUnitIndex + GL.GL_TEXTURE0);
- }
- }
-
- // native method for setting default TexCoordGeneration
- @Override
- void resetTexCoordGeneration(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.resetTexCoordGeneration()");
-
- GL gl = context(ctx).getGL();
- gl.glDisable(GL2.GL_TEXTURE_GEN_S);
- gl.glDisable(GL2.GL_TEXTURE_GEN_T);
- gl.glDisable(GL2.GL_TEXTURE_GEN_R);
- gl.glDisable(GL2.GL_TEXTURE_GEN_Q);
- }
-
- // native method for setting default TextureAttributes
- @Override
- void resetTextureAttributes(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.resetTextureAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- float[] color = new float[4];
-
- gl.glPushAttrib(GL2.GL_TRANSFORM_BIT);
- gl.glMatrixMode(GL.GL_TEXTURE);
- gl.glLoadIdentity();
- gl.glPopAttrib();
- gl.glTexEnvfv(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_COLOR, color, 0);
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
- gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
-
-// FIXME: GL_NV_register_combiners
-// if (gl.isExtensionAvailable("GL_NV_register_combiners")) {
-// gl.glDisable(GL.GL_REGISTER_COMBINERS_NV);
-// }
-
-// FIXME: GL_SGI_texture_color_table
-// if (gl.isExtensionAvailable("GL_SGI_texture_color_table")) {
-// gl.glDisable(GL.GL_TEXTURE_COLOR_TABLE_SGI);
-// }
- }
-
- // native method for setting default PolygonAttributes
- @Override
- void resetPolygonAttributes(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.resetPolygonAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- gl.glCullFace(GL.GL_BACK);
- gl.glEnable(GL.GL_CULL_FACE);
-
- gl.glLightModeli(GL2.GL_LIGHT_MODEL_TWO_SIDE, GL.GL_FALSE);
-
- gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2.GL_FILL);
-
- gl.glPolygonOffset(0.0f, 0.0f);
- gl.glDisable(GL2.GL_POLYGON_OFFSET_POINT);
- gl.glDisable(GL2.GL_POLYGON_OFFSET_LINE);
- gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
- }
-
- // native method for setting default LineAttributes
- @Override
- void resetLineAttributes(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.resetLineAttributes()");
-
- GL gl = context(ctx).getGL();
- gl.glLineWidth(1.0f);
- gl.glDisable(GL2.GL_LINE_STIPPLE);
-
- // XXXX: Polygon Mode check, blend enable
- gl.glDisable(GL.GL_LINE_SMOOTH);
- }
-
- // native method for setting default PointAttributes
- @Override
- void resetPointAttributes(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.resetPointAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glPointSize(1.0f);
-
- // XXXX: Polygon Mode check, blend enable
- gl.glDisable(GL2.GL_POINT_SMOOTH);
- }
-
- // native method for setting default TransparencyAttributes
- @Override
- void resetTransparency(Context ctx, int geometryType,
- int polygonMode, boolean lineAA,
- boolean pointAA) {
- if (VERBOSE) System.err.println("JoglPipeline.resetTransparency()");
-
- GL gl = context(ctx).getGL();
-
- if (((((geometryType & RenderMolecule.LINE) != 0) ||
- (polygonMode == PolygonAttributes.POLYGON_LINE))
- && lineAA) ||
- ((((geometryType & RenderMolecule.POINT) != 0) ||
- (polygonMode == PolygonAttributes.POLYGON_POINT))
- && pointAA)) {
- gl.glEnable(GL.GL_BLEND);
- gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
- } else {
- gl.glDisable(GL.GL_BLEND);
- }
- gl.glDisable(GL2.GL_POLYGON_STIPPLE);
- }
-
- // native method for setting default ColoringAttributes
- @Override
- void resetColoringAttributes(Context ctx,
- float r, float g,
- float b, float a,
- boolean enableLight) {
- if (VERBOSE) System.err.println("JoglPipeline.resetColoringAttributes()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- if (!enableLight) {
- gl.glColor4f(r, g, b, a);
- }
- gl.glShadeModel(GL2.GL_SMOOTH);
- }
-
- /**
- * This native method makes sure that the rendering for this canvas
- * gets done now.
- */
- @Override
- void syncRender(Context ctx, boolean wait) {
- if (VERBOSE) System.err.println("JoglPipeline.syncRender()");
-
- GL gl = context(ctx).getGL();
-
- if (wait)
- gl.glFinish();
- else
- gl.glFlush();
- }
-
- // The native method that sets this ctx to be the current one
- @Override
- boolean useCtx(Context ctx, Drawable drawable) {
- if (VERBOSE) System.err.println("JoglPipeline.useCtx()");
- GLContext context = context(ctx);
- int res = context.makeCurrent();
- return (res != GLContext.CONTEXT_NOT_CURRENT);
- }
-
- // Optionally release the context. Returns true if the context was released.
- @Override
- boolean releaseCtx(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.releaseCtx()");
- GLContext context = context(ctx);
- context.release();
- return true;
- }
-
- @Override
- void clear(Context ctx, float r, float g, float b, boolean clearStencil) {
- if (VERBOSE) System.err.println("JoglPipeline.clear()");
-
- JoglContext jctx = (JoglContext) ctx;
- GLContext context = context(ctx);
- GL2 gl = context.getGL().getGL2();
-
- // OBSOLETE CLEAR CODE
- /*
- gl.glClearColor(r, g, b, jctx.getAlphaClearValue());
- gl.glClear(GL.GL_COLOR_BUFFER_BIT);
-
- // Java 3D always clears the Z-buffer
- gl.glPushAttrib(GL.GL_DEPTH_BUFFER_BIT);
- gl.glDepthMask(true);
- gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
- gl.glPopAttrib();
-
- // Issue 239 - clear stencil if specified
- if (clearStencil) {
- gl.glPushAttrib(GL.GL_STENCIL_BUFFER_BIT);
- gl.glClearStencil(0);
- gl.glStencilMask(~0);
- gl.glClear(GL.GL_STENCIL_BUFFER_BIT);
- gl.glPopAttrib();
- }
- */
-
- // Mask of which buffers to clear, this always includes color & depth
- int clearMask = GL.GL_DEPTH_BUFFER_BIT | GL.GL_COLOR_BUFFER_BIT;
-
- // Issue 239 - clear stencil if specified
- if (clearStencil) {
- gl.glPushAttrib(GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT);
-
- gl.glClearStencil(0);
- gl.glStencilMask(~0);
- clearMask |= GL.GL_STENCIL_BUFFER_BIT;
- } else {
- gl.glPushAttrib(GL.GL_DEPTH_BUFFER_BIT);
- }
-
- gl.glDepthMask(true);
- gl.glClearColor(r, g, b, jctx.getAlphaClearValue());
- gl.glClear(clearMask);
- gl.glPopAttrib();
-
- }
-
- @Override
- void textureFillBackground(Context ctx, float texMinU, float texMaxU, float texMinV, float texMaxV,
- float mapMinX, float mapMaxX, float mapMinY, float mapMaxY, boolean useBilinearFilter) {
- if (VERBOSE) System.err.println("JoglPipeline.textureFillBackground()");
-
- GLContext context = context(ctx);
- GL2 gl = context.getGL().getGL2();
-
- // Temporarily disable fragment and most 3D operations
- gl.glPushAttrib(GL2.GL_ENABLE_BIT | GL2.GL_TEXTURE_BIT | GL2.GL_POLYGON_BIT);
-
- disableAttribFor2D(gl);
- gl.glDepthMask(false);
- gl.glEnable(GL.GL_TEXTURE_2D);
-
- /* Setup filter mode if needed */
- if(useBilinearFilter) {
- // System.err.println("JoglPipeline - Background : use bilinear filter\n");
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
- }
-
- // reset the polygon mode
- gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2.GL_FILL);
-
- gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);
-
- // load identity modelview and projection matrix
- gl.glMatrixMode(GL2.GL_PROJECTION);
- gl.glLoadIdentity();
- gl.glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
- gl.glMatrixMode(GL2.GL_MODELVIEW);
- gl.glLoadIdentity();
- gl.glMatrixMode(GL.GL_TEXTURE);
- gl.glPushMatrix();
- gl.glLoadIdentity();
-
- gl.glBegin(GL2.GL_QUADS);
- gl.glTexCoord2f(texMinU, texMinV); gl.glVertex2f(mapMinX,mapMinY);
- gl.glTexCoord2f(texMaxU, texMinV); gl.glVertex2f(mapMaxX,mapMinY);
- gl.glTexCoord2f(texMaxU, texMaxV); gl.glVertex2f(mapMaxX,mapMaxY);
- gl.glTexCoord2f(texMinU, texMaxV); gl.glVertex2f(mapMinX,mapMaxY);
- gl.glEnd();
-
- // Restore texture Matrix transform
- gl.glPopMatrix();
-
- gl.glMatrixMode(GL2.GL_MODELVIEW);
- // Restore attributes
- gl.glPopAttrib();
-
- }
-
- @Override
- void textureFillRaster(Context ctx, float texMinU, float texMaxU, float texMinV, float texMaxV,
- float mapMinX, float mapMaxX, float mapMinY, float mapMaxY, float mapZ, float alpha,
- boolean useBilinearFilter) {
-
- if (VERBOSE) System.err.println("JoglPipeline.textureFillRaster()");
-
- GLContext context = context(ctx);
- GL2 gl = context.getGL().getGL2();
-
- // Temporarily disable fragment and most 3D operations
- gl.glPushAttrib(GL2.GL_ENABLE_BIT | GL2.GL_TEXTURE_BIT | GL2.GL_POLYGON_BIT |
- GL2.GL_CURRENT_BIT );
-
- disableAttribForRaster(gl);
-
- /* Setup filter mode if needed */
- if(useBilinearFilter) {
- // System.err.println("JoglPipeline - Raster : use bilinear filter\n");
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
- }
-
- gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_MODULATE);
- gl.glColor4f(1.0f, 1.0f, 1.0f, alpha);
-
- // reset the polygon mode
- gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2.GL_FILL);
-
- gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);
-
- // load identity modelview and projection matrix
- gl.glMatrixMode(GL2.GL_MODELVIEW);
- gl.glPushMatrix();
- gl.glLoadIdentity();
- gl.glMatrixMode(GL2.GL_PROJECTION);
- gl.glPushMatrix();
- gl.glLoadIdentity();
- gl.glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
-
- gl.glBegin(GL2.GL_QUADS);
- gl.glTexCoord2f(texMinU, texMinV); gl.glVertex3f(mapMinX,mapMinY, mapZ);
- gl.glTexCoord2f(texMaxU, texMinV); gl.glVertex3f(mapMaxX,mapMinY, mapZ);
- gl.glTexCoord2f(texMaxU, texMaxV); gl.glVertex3f(mapMaxX,mapMaxY, mapZ);
- gl.glTexCoord2f(texMinU, texMaxV); gl.glVertex3f(mapMinX,mapMaxY, mapZ);
- gl.glEnd();
-
- // Restore matrices
- gl.glPopMatrix();
- gl.glMatrixMode(GL2.GL_MODELVIEW);
- gl.glPopMatrix();
- // Restore attributes
- gl.glPopAttrib();
-
- }
-
- @Override
- void executeRasterDepth(Context ctx, float posX, float posY, float posZ,
- int srcOffsetX, int srcOffsetY, int rasterWidth, int rasterHeight,
- int depthWidth, int depthHeight, int depthFormat, Object depthData) {
- if (VERBOSE) System.err.println("JoglPipeline.executeRasterDepth()");
- GLContext context = context(ctx);
- GL2 gl = context.getGL().getGL2();
-
-
- gl.glRasterPos3f(posX, posY, posZ);
-
- int[] drawBuf = new int[1];
- gl.glGetIntegerv(GL2.GL_DRAW_BUFFER, drawBuf, 0);
- /* 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
- */
- gl.glPixelZoom(1.0f, -1.0f);
- gl.glPixelStorei(GL2.GL_UNPACK_ROW_LENGTH, depthWidth);
- if (srcOffsetX >= 0) {
- gl.glPixelStorei(GL2.GL_UNPACK_SKIP_PIXELS, srcOffsetX);
- if (srcOffsetX + rasterWidth > depthWidth) {
- rasterWidth = depthWidth - srcOffsetX;
- }
- } else {
- rasterWidth += srcOffsetX;
- if (rasterWidth > depthWidth) {
- rasterWidth = depthWidth;
- }
- }
- if (srcOffsetY >= 0) {
- gl.glPixelStorei(GL2.GL_UNPACK_SKIP_ROWS, srcOffsetY);
- if (srcOffsetY + rasterHeight > depthHeight) {
- rasterHeight = depthHeight - srcOffsetY;
- }
- } else {
- rasterHeight += srcOffsetY;
- if (rasterHeight > depthHeight) {
- rasterHeight = depthHeight;
- }
- }
-
-
- if (depthFormat == DepthComponentRetained.DEPTH_COMPONENT_TYPE_INT) {
- gl.glDrawPixels(rasterWidth, rasterHeight, GL2.GL_DEPTH_COMPONENT,
- GL.GL_UNSIGNED_INT, IntBuffer.wrap((int[]) depthData));
- } else { /* DepthComponentRetained.DEPTH_COMPONENT_TYPE_FLOAT */
- gl.glDrawPixels(rasterWidth, rasterHeight, GL2.GL_DEPTH_COMPONENT,
- GL.GL_FLOAT, FloatBuffer.wrap((float[]) depthData));
- }
-
- /* 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);
-
- }
-
- // The native method for setting the ModelView matrix.
- @Override
- void setModelViewMatrix(Context ctx, double[] viewMatrix, double[] modelMatrix) {
- if (VERBOSE) System.err.println("JoglPipeline.setModelViewMatrix()");
- GLContext context = context(ctx);
- GL2 gl = context.getGL().getGL2();
-
- gl.glMatrixMode(GL2.GL_MODELVIEW);
-
- if (gl.isExtensionAvailable("GL_VERSION_1_3")) {
- gl.glLoadTransposeMatrixd(viewMatrix, 0);
- gl.glMultTransposeMatrixd(modelMatrix, 0);
- } else {
- double[] v = new double[16];
- double[] m = new double[16];
- copyTranspose(viewMatrix, v);
- copyTranspose(modelMatrix, m);
- gl.glLoadMatrixd(v, 0);
- gl.glMultMatrixd(m, 0);
- }
- }
-
- // The native method for setting the Projection matrix.
- @Override
- void setProjectionMatrix(Context ctx, double[] projMatrix) {
- if (VERBOSE) System.err.println("JoglPipeline.setProjectionMatrix()");
- GLContext context = context(ctx);
- GL2 gl = context.getGL().getGL2();
-
- gl.glMatrixMode(GL2.GL_PROJECTION);
-
- if (gl.isExtensionAvailable("GL_VERSION_1_3")) {
- // Invert the Z value in clipping coordinates because OpenGL uses
- // left-handed clipping coordinates, while Java3D defines right-handed
- // coordinates everywhere.
- projMatrix[8] *= -1.0;
- projMatrix[9] *= -1.0;
- projMatrix[10] *= -1.0;
- projMatrix[11] *= -1.0;
- gl.glLoadTransposeMatrixd(projMatrix, 0);
- projMatrix[8] *= -1.0;
- projMatrix[9] *= -1.0;
- projMatrix[10] *= -1.0;
- projMatrix[11] *= -1.0;
- } else {
- double[] p = new double[16];
- copyTranspose(projMatrix, p);
- // Invert the Z value in clipping coordinates because OpenGL uses
- // left-handed clipping coordinates, while Java3D defines right-handed
- // coordinates everywhere.
- p[2] *= -1.0;
- p[6] *= -1.0;
- p[10] *= -1.0;
- p[14] *= -1.0;
- gl.glLoadMatrixd(p, 0);
- }
- }
-
-static boolean isOffscreenLayerSurfaceEnabled(Canvas3D cv) {
- if (cv.drawable == null || cv.offScreen)
- return false;
-
- JoglDrawable joglDrawble = (JoglDrawable)cv.drawable;
- JAWTWindow jawtwindow = (JAWTWindow)joglDrawble.getNativeWindow();
- if (jawtwindow == null)
- return false;
-
- return jawtwindow.isOffscreenLayerSurfaceEnabled();
-}
-
-static boolean hasFBObjectSizeChanged(JoglDrawable jdraw, int width, int height) {
- if (!(jdraw.getGLDrawable() instanceof GLFBODrawable))
- return false;
-
- FBObject fboBack = ((GLFBODrawable)jdraw.getGLDrawable()).getFBObject(GL.GL_BACK);
- if (fboBack == null)
- return false;
-
- return (width != fboBack.getWidth() || height != fboBack.getHeight());
-}
-
-
- // The native method for setting the Viewport.
- @Override
- void setViewport(Context ctx, int x, int y, int width, int height) {
- if (VERBOSE) System.err.println("JoglPipeline.setViewport()");
- GL gl = context(ctx).getGL();
- gl.glViewport(x, y, width, height);
- }
-
- // used for display Lists
- @Override
- void newDisplayList(Context ctx, int displayListId) {
- if (VERBOSE) System.err.println("JoglPipeline.newDisplayList()");
- if (displayListId <= 0) {
- System.err.println("JAVA 3D ERROR : glNewList(" + displayListId + ") -- IGNORED");
- }
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glNewList(displayListId, GL2.GL_COMPILE);
- }
-
- @Override
- void endDisplayList(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.endDisplayList()");
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glEndList();
- }
-
- int numInvalidLists = 0;
- @Override
- void callDisplayList(Context ctx, int id, boolean isNonUniformScale) {
- if (VERBOSE) System.err.println("JoglPipeline.callDisplayList()");
- if (id <= 0) {
- if (numInvalidLists < 3) {
- ++numInvalidLists;
- System.err.println("JAVA 3D ERROR : glCallList(" + id + ") -- IGNORED");
- } else if (numInvalidLists == 3) {
- ++numInvalidLists;
- System.err.println("JAVA 3D : further glCallList error messages discarded");
- }
- return;
- }
-
- GL2 gl = context(ctx).getGL().getGL2();
- // Set normalization if non-uniform scale
- if (isNonUniformScale) {
- gl.glEnable(GL2.GL_NORMALIZE);
- }
-
- gl.glCallList(id);
-
- // Turn normalization back off
- if (isNonUniformScale) {
- gl.glDisable(GL2.GL_NORMALIZE);
- }
- }
-
- @Override
- void freeDisplayList(Context ctx, int id) {
- if (VERBOSE) System.err.println("JoglPipeline.freeDisplayList()");
- if (id <= 0) {
- System.err.println("JAVA 3D ERROR : glDeleteLists(" + id + ",1) -- IGNORED");
- }
-
- GL2 gl = context(ctx).getGL().getGL2();
- gl.glDeleteLists(id, 1);
- }
-
- @Override
- void freeTexture(Context ctx, int id) {
- if (VERBOSE) System.err.println("JoglPipeline.freeTexture()");
-
- GL gl = context(ctx).getGL();
-
- if (id > 0) {
- int[] tmp = new int[1];
- tmp[0] = id;
- gl.glDeleteTextures(1, tmp, 0);
- } else {
- System.err.println("tried to delete tex with texid <= 0");
- }
- }
-
- @Override
- int generateTexID(Context ctx) {
- if (VERBOSE) System.err.println("JoglPipeline.generateTexID()");
-
- GL gl = context(ctx).getGL();
- int[] tmp = new int[] { -1 };
- gl.glGenTextures(1, tmp, 0);
-
- if (tmp[0] < 1)
- return -1;
-
- return tmp[0];
- }
-
- @Override
- void texturemapping(Context ctx,
- int px, int py,
- int minX, int minY, int maxX, int maxY,
- int texWidth, int texHeight,
- int rasWidth,
- int format, int objectId,
- byte[] imageYdown,
- int winWidth, int winHeight) {
- if (VERBOSE) System.err.println("JoglPipeline.texturemapping()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- int glType = GL.GL_RGBA;
-
- // Temporarily disable fragment and most 3D operations
- gl.glPushAttrib(GL2.GL_ENABLE_BIT | GL2.GL_TEXTURE_BIT | GL.GL_DEPTH_BUFFER_BIT | GL2.GL_POLYGON_BIT);
- disableAttribFor2D(gl);
-
- // Reset the polygon mode
- gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2.GL_FILL);
-
- gl.glDepthMask(false);
- gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);
- gl.glBindTexture(GL.GL_TEXTURE_2D, objectId);
- // set up texture parameter
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);
-
- gl.glTexEnvf(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
- gl.glEnable(GL.GL_BLEND);
- gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
-
- gl.glEnable(GL.GL_TEXTURE_2D);
-
- // loaded identity modelview and projection matrix
- gl.glMatrixMode(GL2.GL_PROJECTION);
- gl.glLoadIdentity();
-
- gl.glOrtho(0.0, winWidth, 0.0, winHeight, 0.0, 0.0);
-
- gl.glMatrixMode(GL2.GL_MODELVIEW);
- gl.glLoadIdentity();
-
- if (gl.isExtensionAvailable("GL_EXT_abgr")) {
- glType = GL2.GL_ABGR_EXT;
- } else {
- switch (format) {
- case ImageComponentRetained.TYPE_BYTE_RGBA:
- glType = GL.GL_RGBA;
- break;
- case ImageComponentRetained.TYPE_BYTE_RGB:
- glType = GL.GL_RGB;
- break;
- }
- }
- gl.glPixelStorei(GL2.GL_UNPACK_ROW_LENGTH, rasWidth);
- gl.glPixelStorei(GL2.GL_UNPACK_SKIP_PIXELS, minX);
- gl.glPixelStorei(GL2.GL_UNPACK_SKIP_ROWS, minY);
- gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, minX, minY,
- maxX - minX, maxY - minY,
- glType, GL.GL_UNSIGNED_BYTE,
- ByteBuffer.wrap(imageYdown));
- gl.glPixelStorei(GL2.GL_UNPACK_ROW_LENGTH, 0);
- gl.glPixelStorei(GL2.GL_UNPACK_SKIP_PIXELS, 0);
- gl.glPixelStorei(GL2.GL_UNPACK_SKIP_ROWS, 0);
-
- float texMinU = (float) minX/ (float) texWidth;
- float texMinV = (float) minY/ (float) texHeight;
- float texMaxU = (float) maxX/ (float) texWidth;
- float texMaxV = (float) maxY/ (float) texHeight;
- float halfWidth = (float)winWidth/2.0f;
- float halfHeight = (float)winHeight/2.0f;
-
- float mapMinX = (float) (((px + minX)- halfWidth)/halfWidth);
- float mapMinY = (float) ((halfHeight - (py + maxY))/halfHeight);
- float mapMaxX = (float) ((px + maxX - halfWidth)/halfWidth);
- float mapMaxY = (float) ((halfHeight - (py + minY))/halfHeight);
-
- gl.glBegin(GL2.GL_QUADS);
-
- gl.glTexCoord2f(texMinU, texMaxV); gl.glVertex2f(mapMinX,mapMinY);
- gl.glTexCoord2f(texMaxU, texMaxV); gl.glVertex2f(mapMaxX,mapMinY);
- gl.glTexCoord2f(texMaxU, texMinV); gl.glVertex2f(mapMaxX,mapMaxY);
- gl.glTexCoord2f(texMinU, texMinV); gl.glVertex2f(mapMinX,mapMaxY);
- gl.glEnd();
-
- // Java 3D always clears the Z-buffer
- gl.glDepthMask(true);
- gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
- gl.glPopAttrib();
- }
-
- @Override
- boolean initTexturemapping(Context ctx, int texWidth,
- int texHeight, int objectId) {
- if (VERBOSE) System.err.println("JoglPipeline.initTexturemapping()");
-
- GL2 gl = context(ctx).getGL().getGL2();
-
- int glType = (gl.isExtensionAvailable("GL_EXT_abgr") ? GL2.GL_ABGR_EXT : GL.GL_RGBA);
-
- gl.glBindTexture(GL.GL_TEXTURE_2D, objectId);
-
- gl.glTexImage2D(GL2.GL_PROXY_TEXTURE_2D, 0, GL.GL_RGBA, texWidth,
- texHeight, 0, glType, GL.GL_UNSIGNED_BYTE, null);
-
- int[] width = new int[1];
- gl.glGetTexLevelParameteriv(GL2.GL_PROXY_TEXTURE_2D, 0,
- GL2.GL_TEXTURE_WIDTH, width, 0);
-
- if (width[0] <= 0) {
- return false;
- }
-
- // init texture size only without filling the pixels
- gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, texWidth,
- texHeight, 0, glType, GL.GL_UNSIGNED_BYTE, null);
-
- return true;
- }
-
-
- // Set internal render mode to one of FIELD_ALL, FIELD_LEFT or
- // FIELD_RIGHT. Note that it is up to the caller to ensure that
- // stereo is available before setting the mode to FIELD_LEFT or
- // FIELD_RIGHT. The boolean isTRUE for double buffered mode, FALSE
- // foe single buffering.
- @Override
- void setRenderMode(Context ctx, int mode, boolean doubleBuffer) {
- if (VERBOSE) System.err.println("JoglPipeline.setRenderMode()");
-
- GL2 gl = context(ctx).getGL().getGL2();
- int drawBuf = 0;
- if (doubleBuffer) {
- drawBuf = GL.GL_BACK;
- switch (mode) {
- case Canvas3D.FIELD_LEFT:
- drawBuf = GL2.GL_BACK_LEFT;
- break;
- case Canvas3D.FIELD_RIGHT:
- drawBuf = GL2.GL_BACK_RIGHT;
- break;
- case Canvas3D.FIELD_ALL:
- drawBuf = GL.GL_BACK;
- break;
- }
- } else {
- drawBuf = GL.GL_FRONT;
- switch (mode) {
- case Canvas3D.FIELD_LEFT:
- drawBuf = GL2.GL_FRONT_LEFT;
- break;
- case Canvas3D.FIELD_RIGHT:
- drawBuf = GL2.GL_FRONT_RIGHT;
- break;
- case Canvas3D.FIELD_ALL:
- drawBuf = GL.GL_FRONT;
- break;
- }
- }
-
- gl.glDrawBuffer(drawBuf);
- }
-
- // Set glDepthMask.
- @Override
- void setDepthBufferWriteEnable(Context ctx, boolean mode) {
- if (VERBOSE) System.err.println("JoglPipeline.setDepthBufferWriteEnable()");
-
- GL gl = context(ctx).getGL();
- if (mode) {
- gl.glDepthMask(true);
- } else {
- gl.glDepthMask(false);
- }
- }
-
- //----------------------------------------------------------------------
- // Helper private functions for Canvas3D
- //
-
- private boolean getPropertiesFromCurrentContext(JoglContext ctx, GL2 gl) {
-
- // FIXME: this is a heavily abridged set of the stuff in Canvas3D.c;
- // probably need to pull much more in
- int[] tmp = new int[1];
- gl.glGetIntegerv(GL2.GL_MAX_TEXTURE_UNITS, tmp, 0);
- ctx.setMaxTexCoordSets(tmp[0]);
- if (VirtualUniverse.mc.transparentOffScreen) {
- ctx.setAlphaClearValue(0.0f);
- } else {
- ctx.setAlphaClearValue(1.0f);
- }
- if (gl.isExtensionAvailable("GL_ARB_vertex_shader")) {
- gl.glGetIntegerv(GL2.GL_MAX_TEXTURE_COORDS_ARB, tmp, 0);
- ctx.setMaxTexCoordSets(tmp[0]);
- }
- return true;
- }
-
- private int[] extractVersionInfo(String versionString) {
- StringTokenizer tok = new StringTokenizer(versionString, ". ");
- int major = Integer.valueOf(tok.nextToken()).intValue();
- int minor = Integer.valueOf(tok.nextToken()).intValue();
-
- // See if there's vendor-specific information which might
- // imply a more recent OpenGL version
- tok = new StringTokenizer(versionString, " ");
- if (tok.hasMoreTokens()) {
- tok.nextToken();
- if (tok.hasMoreTokens()) {
- Pattern p = Pattern.compile("\\D*(\\d+)\\.(\\d+)\\.?(\\d*).*");
- Matcher m = p.matcher(tok.nextToken());
- if (m.matches()) {
- int altMajor = Integer.valueOf(m.group(1)).intValue();
- int altMinor = Integer.valueOf(m.group(2)).intValue();
- // Avoid possibly confusing situations by requiring
- // major version to match
- if (altMajor == major &&
- altMinor > minor) {
- minor = altMinor;
- }
- }
- }
- }
- return new int[] { major, minor };
- }
-
-// FIXME: GL_SGI_texture_color_table
-// private int getTextureColorTableSize(GL gl) {
-// if (!gl.isExtensionAvailable("GL_ARB_imaging")) {
-// return 0;
-// }
-//
-// gl.glColorTable(GL.GL_PROXY_TEXTURE_COLOR_TABLE_SGI, GL.GL_RGBA, 256, GL.GL_RGB,
-// GL2.GL_INT, null);
-// int[] tmp = new int[1];
-// gl.glGetColorTableParameteriv(GL.GL_PROXY_TEXTURE_COLOR_TABLE_SGI,
-// GL2.GL_COLOR_TABLE_WIDTH, tmp, 0);
-// return tmp[0];
-// }
-
-
- private void checkTextureExtensions(Canvas3D cv,
- JoglContext ctx,
- GL gl,
- boolean gl13) {
- if (gl13) {
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_MULTI_TEXTURE;
- cv.multiTexAccelerated = true;
- int[] tmp = new int[1];
- gl.glGetIntegerv(GL2.GL_MAX_TEXTURE_UNITS, tmp, 0);
- cv.maxTextureUnits = tmp[0];
- cv.maxTexCoordSets = cv.maxTextureUnits;
- if (gl.isExtensionAvailable("GL_ARB_vertex_shader")) {
- gl.glGetIntegerv(GL2.GL_MAX_TEXTURE_COORDS_ARB, tmp, 0);
- cv.maxTexCoordSets = tmp[0];
- }
- }
-// FIXME: GL_SGI_texture_color_table
-// if (gl.isExtensionAvailable("GL_SGI_texture_color_table") ||
-// gl.isExtensionAvailable("GL_ARB_imaging")) {
-// cv.textureExtendedFeatures |= Canvas3D.TEXTURE_COLOR_TABLE;
-//
-// // get texture color table size
-// // need to check later
-// cv.textureColorTableSize = getTextureColorTableSize(gl);
-// if (cv.textureColorTableSize <= 0) {
-// cv.textureExtendedFeatures &= ~Canvas3D.TEXTURE_COLOR_TABLE;
-// }
-// if (cv.textureColorTableSize > 256) {
-// cv.textureColorTableSize = 256;
-// }
-// }
-
- if (gl.isExtensionAvailable("GL_ARB_texture_env_combine")) {
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_COMBINE;
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_COMBINE_SUBTRACT;
- } else if (gl.isExtensionAvailable("GL_EXT_texture_env_combine")) {
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_COMBINE;
- }
-
-// FIXME: GL_NV_register_combiners
-// if (gl.isExtensionAvailable("GL_NV_register_combiners")) {
-// cv.textureExtendedFeatures |= Canvas3D.TEXTURE_REGISTER_COMBINERS;
-// }
-
- if (gl.isExtensionAvailable("GL_ARB_texture_env_dot3") ||
- gl.isExtensionAvailable("GL_EXT_texture_env_dot3")) {
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_COMBINE_DOT3;
- }
-
- if (gl13) {
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_CUBE_MAP;
- }
-
-// FIXME: GL_SGIS_sharpen_texture
-// if (gl.isExtensionAvailable("GL_SGIS_sharpen_texture")) {
-// cv.textureExtendedFeatures |= Canvas3D.TEXTURE_SHARPEN;
-// }
-
-// FIXME: GL_SGIS_sharpen_texture
-// if (gl.isExtensionAvailable("GL_SGIS_detail_texture")) {
-// cv.textureExtendedFeatures |= Canvas3D.TEXTURE_DETAIL;
-// }
-
-// FIXME: GL_SGIS_texture_filter4
-// if (gl.isExtensionAvailable("GL_SGIS_texture_filter4")) {
-// cv.textureExtendedFeatures |= Canvas3D.TEXTURE_FILTER4;
-// }
-
- if (gl.isExtensionAvailable("GL_EXT_texture_filter_anisotropic")) {
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_ANISOTROPIC_FILTER;
- float[] tmp = new float[1];
- gl.glGetFloatv(GL. GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, tmp, 0);
- cv.anisotropicDegreeMax = tmp[0];
- }
-
-// FIXME: GL_SGIX_texture_lod_bias
-// if (gl.isExtensionAvailable("GL_SGIX_texture_lod_bias")) {
-// cv.textureExtendedFeatures |= Canvas3D.TEXTURE_LOD_OFFSET;
-// }
-
- if (!VirtualUniverse.mc.enforcePowerOfTwo &&
- gl.isExtensionAvailable("GL_ARB_texture_non_power_of_two")) {
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_NON_POWER_OF_TWO;
- }
-
- if (gl.isExtensionAvailable("GL_SGIS_generate_mipmap")) {
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_AUTO_MIPMAP_GENERATION;
- }
-
- }
-
-
- private void checkGLSLShaderExtensions(Canvas3D cv,
- JoglContext ctx,
- GL gl,
- boolean hasgl13) {
-
- // Force shaders to be disabled, since no multitexture support
- if (!hasgl13)
- return;
-
- if (gl.isExtensionAvailable("GL_ARB_shader_objects") &&
- gl.isExtensionAvailable("GL_ARB_shading_language_100")) {
-
- // FIXME: this isn't complete and would need to set up the
- // JoglContext for dispatch of various routines such as those
- // related to vertex attributes
- int[] tmp = new int[1];
- gl.glGetIntegerv(GL2.GL_MAX_TEXTURE_IMAGE_UNITS_ARB, tmp, 0);
- cv.maxTextureImageUnits = tmp[0];
- gl.glGetIntegerv(GL2.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, tmp, 0);
- cv.maxVertexTextureImageUnits = tmp[0];
- gl.glGetIntegerv(GL2.GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, tmp, 0);
- cv.maxCombinedTextureImageUnits = tmp[0];
- int vertexAttrOffset = VirtualUniverse.mc.glslVertexAttrOffset;
- ctx.setGLSLVertexAttrOffset(vertexAttrOffset);
- gl.glGetIntegerv(GL2.GL_MAX_VERTEX_ATTRIBS_ARB, tmp, 0);
- cv.maxVertexAttrs = tmp[0];
- // decr count to allow for reserved vertex attrs
- cv.maxVertexAttrs -= vertexAttrOffset;
- if (cv.maxVertexAttrs < 0) {
- cv.maxVertexAttrs = 0;
- }
- cv.shadingLanguageGLSL = true;
- }
- }
-
- private void setupCanvasProperties(Canvas3D cv, JoglContext ctx, GL gl) {
- // Note: this includes relevant portions from both the
- // NativePipeline's getPropertiesFromCurrentContext and setupCanvasProperties
-
- // Reset all fields
- cv.multiTexAccelerated = false;
- cv.maxTextureUnits = 1;
- cv.maxTexCoordSets = 1;
- cv.maxTextureImageUnits = 0;
- cv.maxVertexTextureImageUnits = 0;
- cv.maxCombinedTextureImageUnits = 0;
- cv.maxVertexAttrs = 0;
- cv.extensionsSupported = 0;
- cv.textureExtendedFeatures = 0;
- cv.textureColorTableSize = 0;
- cv.anisotropicDegreeMax = 0;
- cv.textureBoundaryWidthMax = 0;
- cv.textureWidthMax = 0;
- cv.textureHeightMax = 0;
- cv.texture3DWidthMax = 0;
- cv.texture3DHeightMax = 0;
- cv.texture3DDepthMax = 0;
- cv.shadingLanguageGLSL = false;
-
- // Now make queries and set up these fields
- String glVersion = gl.glGetString(GL.GL_VERSION);
- String glVendor = gl.glGetString(GL.GL_VENDOR);
- String glRenderer = gl.glGetString(GL.GL_RENDERER);
- cv.nativeGraphicsVersion = glVersion;
- cv.nativeGraphicsVendor = glVendor;
- cv.nativeGraphicsRenderer = glRenderer;
-
- // find out the version, major and minor version number
- int[] versionNumbers = extractVersionInfo(glVersion);
- int major = versionNumbers[0];
- int minor = versionNumbers[1];
-
- ///////////////////////////////////////////
- // setup the graphics context properties //
-
- // NOTE: Java 3D now requires OpenGL 1.3 for full functionality.
- // For backwards compatibility with certain older graphics cards and
- // drivers (e.g., the Linux DRI driver for older ATI cards),
- // we will try to run on OpenGL 1.2 in an unsupported manner. However,
- // we will not attempt to use OpenGL extensions for any features that
- // are available in OpenGL 1.3, specifically multitexture, multisample,
- // and cube map textures.
-
- if (major < 1 || (major == 1 && minor < 2)) {
- throw new IllegalRenderingStateException(
- "Java 3D ERROR : OpenGL 1.2 or better is required (GL_VERSION=" +
- major + "." + minor + ")");
- }
-
- boolean gl20 = false;
- boolean gl14 = false;
- boolean gl13 = false;
-
- if (major == 1) {
- if (minor == 2) {
- System.err.println("JAVA 3D: OpenGL 1.2 detected; will run with reduced functionality");
- }
- if (minor >= 3) {
- gl13 = true;
- }
- if (minor >= 4) {
- gl14 = true;
- }
- } else /* major >= 2 */ {
- gl13 = true;
- gl14 = true;
- gl20 = true;
- }
-
- if (gl20) {
- assert gl13;
- assert gl14;
- assert gl.isExtensionAvailable("GL_VERSION_2_0");
- }
-
- if (gl14) {
- assert gl13;
- assert gl.isExtensionAvailable("GL_VERSION_1_4");
- }
-
- if (gl13) {
- assert gl.isExtensionAvailable("GL_VERSION_1_3");
- }
-
- // Set up properties for OpenGL 1.3
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_3D;
-
- // Note that we don't query for GL_ARB_imaging here
-
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_LOD_RANGE;
-
- if (gl14) {
- cv.textureExtendedFeatures |= Canvas3D.TEXTURE_AUTO_MIPMAP_GENERATION;
- }
-
- // look for OpenGL 2.0 features
- // Fix to Issue 455 : Need to disable NPOT textures for older cards that claim to support it.
- // Some older cards (e.g., Nvidia fx500 and ATI 9800) claim to support OpenGL 2.0.
- // This means that these cards have to support non-power-of-two (NPOT) texture,
- // but their lack the necessary HW force the vendors the emulate this feature in software.
- // The result is a ~100x slower down compare to power-of-two textures.
- // Do not check for gl20 but instead check of GL_ARB_texture_non_power_of_two extension string
- // if (gl20) {
- // if(!VirtualUniverse.mc.enforcePowerOfTwo) {
- // cv.textureExtendedFeatures |= Canvas3D.TEXTURE_NON_POWER_OF_TWO;
- // }
- // }
-
-
- // Setup GL_EXT_abgr
- if (gl.isExtensionAvailable("GL_EXT_abgr")) {
- cv.extensionsSupported |= Canvas3D.EXT_ABGR;
- }
-
- // GL_BGR is always supported
- cv.extensionsSupported |= Canvas3D.EXT_BGR;
-
- // Setup multisample
- // FIXME: this is not correct for the Windows platform yet
- if (gl13) {
- cv.extensionsSupported |= Canvas3D.MULTISAMPLE;
- ctx.setHasMultisample(true);
- }
-
- if ((cv.extensionsSupported & Canvas3D.MULTISAMPLE) != 0 &&
- !VirtualUniverse.mc.implicitAntialiasing) {
- gl.glDisable(GL.GL_MULTISAMPLE);
- }
-
- // Check texture extensions
- checkTextureExtensions(cv, ctx, gl, gl13);
-
- // Check shader extensions
- checkGLSLShaderExtensions(cv, ctx, gl, gl13);
-
- cv.textureBoundaryWidthMax = 1;
- {
- int[] tmp = new int[1];
- gl.glGetIntegerv(GL.GL_MAX_TEXTURE_SIZE, tmp, 0);
- cv.textureWidthMax = tmp[0];
- cv.textureHeightMax = tmp[0];
-
- tmp[0] = -1;
- gl.glGetIntegerv(GL2.GL_MAX_3D_TEXTURE_SIZE, tmp, 0);
- cv.texture3DWidthMax = tmp[0];
- cv.texture3DHeightMax = tmp[0];
- cv.texture3DDepthMax = tmp[0];
- }
- }
-
- /*
- * Function to disable most rendering attributes when doing a 2D
- * clear, image copy, or image composite operation. Note that the
- * caller must save/restore the attributes with
- * pushAttrib(GL_ENABLE_BIT|...) and popAttrib()
- */
- private void disableAttribFor2D(GL gl) {
- gl.glDisable(GL2.GL_ALPHA_TEST);
- gl.glDisable(GL.GL_BLEND);
- gl.glDisable(GL.GL_COLOR_LOGIC_OP);
- gl.glDisable(GL2.GL_COLOR_MATERIAL);
- gl.glDisable(GL.GL_CULL_FACE);
- gl.glDisable(GL.GL_DEPTH_TEST);
- gl.glDisable(GL2.GL_FOG);
- gl.glDisable(GL2.GL_LIGHTING);
- gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
- gl.glDisable(GL2.GL_POLYGON_STIPPLE);
- gl.glDisable(GL.GL_STENCIL_TEST);
- gl.glDisable(GL.GL_TEXTURE_2D);
- gl.glDisable(GL2.GL_TEXTURE_GEN_Q);
- gl.glDisable(GL2.GL_TEXTURE_GEN_R);
- gl.glDisable(GL2.GL_TEXTURE_GEN_S);
- gl.glDisable(GL2.GL_TEXTURE_GEN_T);
-
-
- for (int i = 0; i < 6; i++) {
- gl.glDisable(GL2.GL_CLIP_PLANE0 + i);
- }
-
- gl.glDisable(GL2.GL_TEXTURE_3D);
- gl.glDisable(GL.GL_TEXTURE_CUBE_MAP);
-
-// FIXME: GL_NV_register_combiners
-// if (gl.isExtensionAvailable("GL_NV_register_combiners")) {
-// gl.glDisable(GL.GL_REGISTER_COMBINERS_NV);
-// }
-// FIXME: GL_SGI_texture_color_table
-// if (gl.isExtensionAvailable("GL_SGI_texture_color_table")) {
-// gl.glDisable(GL.GL_TEXTURE_COLOR_TABLE_SGI);
-// }
- }
-
- private void disableAttribForRaster(GL gl) {
-
- gl.glDisable(GL2.GL_COLOR_MATERIAL);
- gl.glDisable(GL.GL_CULL_FACE);
- gl.glDisable(GL2.GL_LIGHTING);
- gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
- gl.glDisable(GL2.GL_POLYGON_STIPPLE);
-
- // TODO: Disable if Raster.CLIP_POSITION is true
-// for (int i = 0; i < 6; i++) {
-// gl.glDisable(GL2.GL_CLIP_PLANE0 + i);
-// }
-
- }
-
- private void copyTranspose(double[] src, double[] dst) {
- dst[0] = src[0];
- dst[1] = src[4];
- dst[2] = src[8];
- dst[3] = src[12];
- dst[4] = src[1];
- dst[5] = src[5];
- dst[6] = src[9];
- dst[7] = src[13];
- dst[8] = src[2];
- dst[9] = src[6];
- dst[10] = src[10];
- dst[11] = src[14];
- dst[12] = src[3];
- dst[13] = src[7];
- dst[14] = src[11];
- dst[15] = src[15];
- }
-
- // ---------------------------------------------------------------------
-
- //
- // Canvas3D / GraphicsConfigTemplate3D methods - logic dealing with
- // native graphics configuration or drawing surface
- //
-
- // Return a graphics config based on the one passed in. Note that we can
- // assert that the input config is non-null and was created from a
- // GraphicsConfigTemplate3D.
- // This method must return a valid GraphicsConfig, or else it must throw
- // an exception if one cannot be returned.
- @Override
- GraphicsConfiguration getGraphicsConfig(GraphicsConfiguration gconfig) {
- if (VERBOSE) System.err.println("JoglPipeline.getGraphicsConfig()");
-
- GraphicsConfigInfo gcInf0 = Canvas3D.graphicsConfigTable.get(gconfig);
- AWTGraphicsConfiguration awtConfig = (AWTGraphicsConfiguration)gcInf0.getPrivateData();
-
- return awtConfig.getAWTGraphicsConfiguration();
- }
-
- private enum DisabledCaps {
- STEREO,
- AA,
- DOUBLE_BUFFER,
- }
-
- // Get best graphics config from pipeline
- @Override
- GraphicsConfiguration getBestConfiguration(GraphicsConfigTemplate3D gct,
- GraphicsConfiguration[] gc) {
- if (VERBOSE) System.err.println("JoglPipeline.getBestConfiguration()");
-
- // Create a GLCapabilities based on the GraphicsConfigTemplate3D
- final GLCapabilities caps = new GLCapabilities(profile);
-
- caps.setDoubleBuffered(gct.getDoubleBuffer() != GraphicsConfigTemplate.UNNECESSARY);
-
- caps.setStereo(gct.getStereo() != GraphicsConfigTemplate.UNNECESSARY);
-
- // Scene antialiasing only if double buffering
- if (gct.getSceneAntialiasing() != GraphicsConfigTemplate.UNNECESSARY &&
- gct.getDoubleBuffer() != GraphicsConfigTemplate.UNNECESSARY) {
- caps.setSampleBuffers(true);
- caps.setNumSamples(2);
- } else {
- caps.setSampleBuffers(false);
- caps.setNumSamples(0);
- }
-
- caps.setDepthBits(gct.getDepthSize());
- caps.setStencilBits(gct.getStencilSize());
-
- caps.setRedBits(Math.max(5, gct.getRedSize()));
- caps.setGreenBits(Math.max(5, gct.getGreenSize()));
- caps.setBlueBits(Math.max(5, gct.getBlueSize()));
-
-
- // Issue 399: Request alpha buffer if transparentOffScreen is set
- if (VirtualUniverse.mc.transparentOffScreen) {
- caps.setAlphaBits(1);
- }
-
-
- // Add PREFERRED capabilities in order of least to highest priority and we will try disabling them
- ArrayList<DisabledCaps> capsToDisable = new ArrayList<DisabledCaps>();
-
- if (gct.getStereo() == GraphicsConfigTemplate.PREFERRED) {
- capsToDisable.add(DisabledCaps.STEREO);
- }
-
- if (gct.getSceneAntialiasing() == GraphicsConfigTemplate.PREFERRED) {
- capsToDisable.add(DisabledCaps.AA);
- }
-
- // if AA is required, so is double buffering.
- if (gct.getSceneAntialiasing() != GraphicsConfigTemplate.REQUIRED &&
- gct.getDoubleBuffer() == GraphicsConfigTemplate.PREFERRED) {
- capsToDisable.add(DisabledCaps.DOUBLE_BUFFER);
- }
-
-
- // Pick an arbitrary graphics device.
- GraphicsDevice device = gc[0].getDevice();
- AbstractGraphicsScreen screen = (device != null) ? AWTGraphicsScreen.createScreenDevice(device, AbstractGraphicsDevice.DEFAULT_UNIT) :
- AWTGraphicsScreen.createDefault();
-
- // Create a Frame and dummy GLCanvas to perform eager pixel format selection
-
- // Note that we loop in similar fashion to the NativePipeline's
- // native code in the situation where we need to disable certain
- // capabilities which aren't required
- boolean tryAgain = true;
- CapabilitiesCapturer capturer = null;
- AWTGraphicsConfiguration awtConfig = null;
- while (tryAgain) {
- Frame f = new Frame(device.getDefaultConfiguration());
- f.setUndecorated(true);
- f.setLayout(new BorderLayout());
- capturer = new CapabilitiesCapturer();
- try {
- awtConfig = createAwtGraphicsConfiguration(caps, capturer, screen);
- QueryCanvas canvas = new QueryCanvas(awtConfig, capturer);
- f.add(canvas, BorderLayout.CENTER);
- f.setSize(MIN_FRAME_SIZE, MIN_FRAME_SIZE);
- f.setVisible(true);
- canvas.doQuery();
- if (DEBUG_CONFIG) {
- System.err.println("Waiting for CapabilitiesCapturer");
- }
- // Try to wait for result without blocking EDT
- if (!EventQueue.isDispatchThread()) {
- synchronized(capturer) {
- if (!capturer.done()) {
- try {
- capturer.wait(WAIT_TIME);
- } catch (InterruptedException e) {
- }
- }
- }
- }
- disposeOnEDT(f);
- tryAgain = false;
- } catch (GLException e) {
- // Failure to select a pixel format; try switching off one
- // of the only-preferred capabilities
- if (capsToDisable.size() == 0) {
- tryAgain = false;
- } else {
- switch (capsToDisable.remove(0)) {
- case STEREO:
- caps.setStereo(false);
- break;
- case AA:
- caps.setSampleBuffers(false);
- break;
- case DOUBLE_BUFFER:
- caps.setDoubleBuffered(false);
- break;
- }
- awtConfig = null;
- }
- }
- }
- int chosenIndex = capturer.getChosenIndex();
- GLCapabilities chosenCaps = null;
- if (chosenIndex < 0) {
- if (DEBUG_CONFIG) {
- System.err.println("CapabilitiesCapturer returned invalid index");
- }
- // It's possible some platforms or implementations might not
- // support the GLCapabilitiesChooser mechanism; feed in the
- // same GLCapabilities later which we gave to the selector
- chosenCaps = caps;
- } else {
- if (DEBUG_CONFIG) {
- System.err.println("CapabilitiesCapturer returned index=" + chosenIndex);
- }
- chosenCaps = capturer.getCapabilities();
- }
-
- // FIXME chosenIndex isn't used anymore, used -1 instead of finding it.
- JoglGraphicsConfiguration config = new JoglGraphicsConfiguration(chosenCaps, chosenIndex, device);
-
-
-
- // FIXME: because of the fact that JoglGraphicsConfiguration
- // doesn't override hashCode() or equals(), we will basically be
- // creating a new one each time getBestConfiguration() is
- // called; in theory, we should probably map the same
- // GLCapabilities on the same GraphicsDevice to the same
- // JoglGraphicsConfiguration object
-
- // Cache the GraphicsTemplate3D
- GraphicsConfigInfo gcInf0 = new GraphicsConfigInfo(gct);
- gcInf0.setPrivateData(awtConfig);
-
- synchronized (Canvas3D.graphicsConfigTable) {
- Canvas3D.graphicsConfigTable.put(config, gcInf0);
- }
-
- return config;
- }
-
- // Determine whether specified graphics config is supported by pipeline
- @Override
- boolean isGraphicsConfigSupported(GraphicsConfigTemplate3D gct,
- GraphicsConfiguration gc) {
- if (VERBOSE) System.err.println("JoglPipeline.isGraphicsConfigSupported()");
-
- // FIXME: it looks like this method is implemented incorrectly
- // in the existing NativePipeline in both the Windows and X11
- // ports. According to the semantics of the javadoc, it looks
- // like this method is supposed to figure out the OpenGL
- // capabilities which would be requested by the passed
- // GraphicsConfiguration object were it to be used, and see
- // whether it is possible to create a context with them.
- // Instead, on both platforms, the implementations basically set
- // up a query based on the contents of the
- // GraphicsConfigTemplate3D object, using the
- // GraphicsConfiguration object only to figure out on which
- // GraphicsDevice and screen we're making the request, and see
- // whether it's possible to choose an OpenGL pixel format based
- // on that information. This makes this method less useful and
- // we can probably just safely return true here uniformly
- // without breaking anything.
- return true;
- }
-
- // Methods to get actual capabilities from Canvas3D
- @Override
- boolean hasDoubleBuffer(Canvas3D cv) {
- if (VERBOSE) System.err.println("JoglPipeline.hasDoubleBuffer()");
- if (VERBOSE) System.err.println(" Returning " + caps(cv).getDoubleBuffered());
- return caps(cv).getDoubleBuffered();
- }
-
- @Override
- boolean hasStereo(Canvas3D cv) {
- if (VERBOSE) System.err.println("JoglPipeline.hasStereo()");
- if (VERBOSE) System.err.println(" Returning " + caps(cv).getStereo());
- return caps(cv).getStereo();
- }
-
- @Override
- int getStencilSize(Canvas3D cv) {
- if (VERBOSE) System.err.println("JoglPipeline.getStencilSize()");
- if (VERBOSE) System.err.println(" Returning " + caps(cv).getStencilBits());
- return caps(cv).getStencilBits();
- }
-
- @Override
- boolean hasSceneAntialiasingMultisample(Canvas3D cv) {
- if (VERBOSE) System.err.println("JoglPipeline.hasSceneAntialiasingMultisample()");
- if (VERBOSE) System.err.println(" Returning " + caps(cv).getSampleBuffers());
-
- return caps(cv).getSampleBuffers();
- }
-
- @Override
- boolean hasSceneAntialiasingAccum(Canvas3D cv) {
- if (VERBOSE) System.err.println("JoglPipeline.hasSceneAntialiasingAccum()");
- GLCapabilities caps = caps(cv);
- if (VERBOSE) System.err.println(" Returning " + (caps.getAccumRedBits() > 0 &&
- caps.getAccumGreenBits() > 0 &&
- caps.getAccumBlueBits() > 0));
- return (caps.getAccumRedBits() > 0 &&
- caps.getAccumGreenBits() > 0 &&
- caps.getAccumBlueBits() > 0);
- }
-
- private boolean checkedForGetScreenMethod = false;
- private Method getScreenMethod = null;
- @Override
- int getScreen(final GraphicsDevice graphicsDevice) {
- if (VERBOSE) System.err.println("JoglPipeline.getScreen()");
-
- if (!checkedForGetScreenMethod) {
- // All of the Sun GraphicsDevice implementations have a method
- // int getScreen();
- // which we want to call reflectively if it's available.
- AccessController.doPrivileged(new PrivilegedAction<Object>() {
- @Override
- public Object run() {
- try {
- getScreenMethod = graphicsDevice.getClass().getDeclaredMethod("getScreen", new Class[] {});
- getScreenMethod.setAccessible(true);
- } catch (Exception e) {
- }
- checkedForGetScreenMethod = true;
- return null;
- }
- });
- }
-
- if (getScreenMethod != null) {
- try {
- return ((Integer) getScreenMethod.invoke(graphicsDevice, (Object[]) null)).intValue();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- return 0;
- }
-
- //----------------------------------------------------------------------
- // Helper classes and methods to support query context functionality
- // and pixel format selection
-
- interface ExtendedCapabilitiesChooser extends GLCapabilitiesChooser {
- public void init(GLContext context);
- }
-
- // Canvas subclass to help with various query operations such as the
- // "query context" mechanism and pixel format selection.
- // Must defeat and simplify the single-threading behavior of JOGL's
- // GLCanvas in order to be able to set up a temporary pixel format
- // and OpenGL context. Apparently simply turning off the
- // single-threaded mode isn't enough to do this.
- private final class QueryCanvas extends Canvas {
-
- private GLDrawable glDrawable;
- private ExtendedCapabilitiesChooser chooser;
- private boolean alreadyRan;
-
- private AWTGraphicsConfiguration awtConfig = null;
- private JAWTWindow nativeWindow = null;
-
- private QueryCanvas(AWTGraphicsConfiguration awtConfig,
- ExtendedCapabilitiesChooser chooser) {
- // The platform-specific GLDrawableFactory will only provide a
- // non-null GraphicsConfiguration on platforms where this is
- // necessary (currently only X11, as Windows allows the pixel
- // format of the window to be set later and Mac OS X seems to
- // handle this very differently than all other platforms). On
- // other platforms this method returns null; it is the case (at
- // least in the Sun AWT implementation) that this will result in
- // equivalent behavior to calling the no-arg super() constructor
- // for Canvas.
- super(awtConfig.getAWTGraphicsConfiguration());
-
- this.awtConfig = awtConfig;
- this.chooser = chooser;
- }
-
- @Override
- public void addNotify() {
- super.addNotify();
-
- nativeWindow = (JAWTWindow)NativeWindowFactory.getNativeWindow(this, awtConfig);
- nativeWindow.lockSurface();
- try {
- glDrawable = GLDrawableFactory.getFactory(profile).createGLDrawable(nativeWindow);
- }
- finally {
- nativeWindow.unlockSurface();
- }
-
- glDrawable.setRealized(true);
- }
-
- // It seems that at least on Mac OS X we need to do the OpenGL
- // context-related work outside of the addNotify call because the
- // Canvas hasn't been resized to a non-zero size by that point
- private void doQuery() {
- if (alreadyRan)
- return;
- GLContext context = glDrawable.createContext(null);
- int res = context.makeCurrent();
- if (res != GLContext.CONTEXT_NOT_CURRENT) {
- try {
- chooser.init(context);
- } finally {
- context.release();
- }
- }
- context.destroy();
- alreadyRan = true;
-
- glDrawable.setRealized(false);
- nativeWindow.destroy();
- }
- }
-
- private static AWTGraphicsConfiguration createAwtGraphicsConfiguration(GLCapabilities capabilities,
- CapabilitiesChooser chooser,
- AbstractGraphicsScreen screen) {
- GraphicsConfigurationFactory factory = GraphicsConfigurationFactory.getFactory(AWTGraphicsDevice.class, GLCapabilities.class);
- AWTGraphicsConfiguration awtGraphicsConfiguration = (AWTGraphicsConfiguration) factory.chooseGraphicsConfiguration(capabilities, capabilities,
- chooser, screen, VisualIDHolder.VID_UNDEFINED);
- return awtGraphicsConfiguration;
- }
-
- // Used in conjunction with IndexCapabilitiesChooser in pixel format
- // selection -- see getBestConfiguration
- static class CapabilitiesCapturer extends DefaultGLCapabilitiesChooser implements ExtendedCapabilitiesChooser {
- private boolean done;
- private GLCapabilities capabilities;
- private int chosenIndex = -1;
-
- public boolean done() {
- return done;
- }
-
- public GLCapabilities getCapabilities() {
- return capabilities;
- }
-
- public int getChosenIndex() {
- return chosenIndex;
- }
-
- public int chooseCapabilities(GLCapabilities desired,
- GLCapabilities[] available,
- int windowSystemRecommendedChoice) {
- int res = super.chooseCapabilities(desired, Arrays.asList(available), windowSystemRecommendedChoice);
- capabilities = available[res];
- chosenIndex = res;
- markDone();
- return res;
- }
-
- @Override
- public void init(GLContext context) {
- // Avoid hanging things up for several seconds
- kick();
- }
-
- private void markDone() {
- synchronized (this) {
- done = true;
- notifyAll();
- }
- }
-
- private void kick() {
- synchronized (this) {
- notifyAll();
- }
- }
- }
-
- // Used to support the query context mechanism -- needs to be more
- // than just a GLCapabilitiesChooser
- private final class ContextQuerier extends DefaultGLCapabilitiesChooser
- implements ExtendedCapabilitiesChooser {
- private Canvas3D canvas;
- private boolean done;
-
- public ContextQuerier(Canvas3D canvas) {
- this.canvas = canvas;
- }
-
- public boolean done() {
- return done;
- }
-
- @Override
- public void init(GLContext context) {
- // This is basically a temporary
- JoglContext jctx = new JoglContext(context);
- GL2 gl = context.getGL().getGL2();
- // Set up various properties
- if (getPropertiesFromCurrentContext(jctx, gl)) {
- setupCanvasProperties(canvas, jctx, gl);
- }
- markDone();
- }
-
- private void markDone() {
- synchronized (this) {
- done = true;
- notifyAll();
- }
- }
- }
-
- private void disposeOnEDT(final Frame f) {
- Runnable r = new Runnable() {
- @Override
- public void run() {
- f.setVisible(false);
- f.dispose();
- }
- };
- if (!EventQueue.isDispatchThread()) {
- EventQueue.invokeLater(r);
- } else {
- r.run();
- }
- }
-
-
- // ---------------------------------------------------------------------
-
- //
- // DrawingSurfaceObject methods
- //
-
- // Method to construct a new DrawingSurfaceObject
- @Override
- DrawingSurfaceObject createDrawingSurfaceObject(Canvas3D cv) {
- if (VERBOSE) System.err.println("JoglPipeline.createDrawingSurfaceObject()");
- return new JoglDrawingSurfaceObject(cv);
- }
-
- // Method to free the drawing surface object
- @Override
- void freeDrawingSurface(Canvas3D cv, DrawingSurfaceObject drawingSurfaceObject) {
- if (VERBOSE) System.err.println("JoglPipeline.freeDrawingSurface()");
- // This method is a no-op
- }
-
- // Method to free the native drawing surface object
- @Override
- void freeDrawingSurfaceNative(Object o) {
- if (VERBOSE) System.err.println("JoglPipeline.freeDrawingSurfaceNative()");
- // This method is a no-op
- }
-
- //----------------------------------------------------------------------
- // Context-related routines
- //
-
- // Helper used everywhere
- GLContext context(Context ctx) {
- if (ctx == null)
- return null;
- return ((JoglContext) ctx).getGLContext();
- }
-
- // Helper used everywhere
- GLDrawable drawable(Drawable drawable) {
- if (drawable == null)
- return null;
- return ((JoglDrawable) drawable).getGLDrawable();
- }
-
- GLCapabilities caps(Canvas3D ctx) {
- if (ctx.drawable != null) {
- // latest state for on- and offscreen drawables
- return (GLCapabilities)drawable(ctx.drawable).getChosenGLCapabilities();
- }
- else {
- // state at the time of 'getBestConfiguration'
- return ((JoglGraphicsConfiguration) ctx.graphicsConfiguration).getGLCapabilities();
- }
- }
-
- //----------------------------------------------------------------------
- // General helper routines
- //
-
- private static ThreadLocal<FloatBuffer> nioVertexTemp = new ThreadLocal<FloatBuffer>();
- private static ThreadLocal<DoubleBuffer> nioVertexDoubleTemp = new ThreadLocal<DoubleBuffer>();
- private static ThreadLocal<FloatBuffer> nioColorTemp = new ThreadLocal<FloatBuffer>();
- private static ThreadLocal<ByteBuffer> nioColorByteTemp = new ThreadLocal<ByteBuffer>();
- private static ThreadLocal<FloatBuffer> nioNormalTemp = new ThreadLocal<FloatBuffer>();
- private static ThreadLocal<FloatBuffer[]> nioTexCoordSetTemp = new ThreadLocal<FloatBuffer[]>();
- private static ThreadLocal<FloatBuffer[]> nioVertexAttrSetTemp = new ThreadLocal<FloatBuffer[]>();
-
- private static FloatBuffer getVertexArrayBuffer(float[] vertexArray) {
- return getVertexArrayBuffer(vertexArray, true);
- }
-
- private static FloatBuffer getVertexArrayBuffer(float[] vertexArray, boolean copyData) {
- return getNIOBuffer(vertexArray, nioVertexTemp, copyData);
- }
-
- private static DoubleBuffer getVertexArrayBuffer(double[] vertexArray) {
- return getVertexArrayBuffer(vertexArray, true);
- }
-
- private static DoubleBuffer getVertexArrayBuffer(double[] vertexArray, boolean copyData) {
- return getNIOBuffer(vertexArray, nioVertexDoubleTemp, true);
- }
-
- private static FloatBuffer getColorArrayBuffer(float[] colorArray) {
- return getColorArrayBuffer(colorArray, true);
- }
-
- private static FloatBuffer getColorArrayBuffer(float[] colorArray, boolean copyData) {
- return getNIOBuffer(colorArray, nioColorTemp, true);
- }
-
- private static ByteBuffer getColorArrayBuffer(byte[] colorArray) {
- return getColorArrayBuffer(colorArray, true);
- }
-
- private static ByteBuffer getColorArrayBuffer(byte[] colorArray, boolean copyData) {
- return getNIOBuffer(colorArray, nioColorByteTemp, true);
- }
-
- private static FloatBuffer getNormalArrayBuffer(float[] normalArray) {
- return getNormalArrayBuffer(normalArray, true);
- }
-
- private static FloatBuffer getNormalArrayBuffer(float[] normalArray, boolean copyData) {
- return getNIOBuffer(normalArray, nioNormalTemp, true);
- }
-
- private static FloatBuffer[] getTexCoordSetBuffer(Object[] texCoordSet) {
- return getNIOBuffer(texCoordSet, nioTexCoordSetTemp);
- }
-
- private static FloatBuffer[] getVertexAttrSetBuffer(Object[] vertexAttrSet) {
- return getNIOBuffer(vertexAttrSet, nioVertexAttrSetTemp);
- }
-
- private static FloatBuffer getNIOBuffer(float[] array, ThreadLocal<FloatBuffer> threadLocal, boolean copyData) {
- if (array == null) {
- return null;
- }
- FloatBuffer buf = threadLocal.get();
- if (buf == null) {
- buf = Buffers.newDirectFloatBuffer(array.length);
- threadLocal.set(buf);
- } else {
- buf.rewind();
- if (buf.remaining() < array.length) {
- int newSize = Math.max(2 * buf.remaining(), array.length);
- buf = Buffers.newDirectFloatBuffer(newSize);
- threadLocal.set(buf);
- }
- }
- if (copyData) {
- buf.put(array);
- buf.rewind();
- }
- return buf;
- }
-
- private static DoubleBuffer getNIOBuffer(double[] array, ThreadLocal<DoubleBuffer> threadLocal, boolean copyData) {
- if (array == null) {
- return null;
- }
- DoubleBuffer buf = threadLocal.get();
- if (buf == null) {
- buf = Buffers.newDirectDoubleBuffer(array.length);
- threadLocal.set(buf);
- } else {
- buf.rewind();
- if (buf.remaining() < array.length) {
- int newSize = Math.max(2 * buf.remaining(), array.length);
- buf = Buffers.newDirectDoubleBuffer(newSize);
- threadLocal.set(buf);
- }
- }
- if (copyData) {
- buf.put(array);
- buf.rewind();
- }
- return buf;
- }
-
- private static ByteBuffer getNIOBuffer(byte[] array, ThreadLocal<ByteBuffer> threadLocal, boolean copyData) {
- if (array == null) {
- return null;
- }
- ByteBuffer buf = threadLocal.get();
- if (buf == null) {
- buf = Buffers.newDirectByteBuffer(array.length);
- threadLocal.set(buf);
- } else {
- buf.rewind();
- if (buf.remaining() < array.length) {
- int newSize = Math.max(2 * buf.remaining(), array.length);
- buf = Buffers.newDirectByteBuffer(newSize);
- threadLocal.set(buf);
- }
- }
- if (copyData) {
- buf.put(array);
- buf.rewind();
- }
- return buf;
- }
-
- private static FloatBuffer[] getNIOBuffer(Object[] array, ThreadLocal<FloatBuffer[]> threadLocal) {
- if (array == null) {
- return null;
- }
- FloatBuffer[] bufs = threadLocal.get();
-
- // First resize array of FloatBuffers
- if (bufs == null) {
- bufs = new FloatBuffer[array.length];
- threadLocal.set(bufs);
- } else if (bufs.length < array.length) {
- FloatBuffer[] newBufs = new FloatBuffer[array.length];
- System.arraycopy(bufs, 0, newBufs, 0, bufs.length);
- bufs = newBufs;
- threadLocal.set(bufs);
- }
-
- // Now go down array of arrays, converting each into a direct FloatBuffer
- for (int i = 0; i < array.length; i++) {
- float[] cur = (float[]) array[i];
- FloatBuffer buf = bufs[i];
- if (buf == null) {
- buf = Buffers.newDirectFloatBuffer(cur.length);
- bufs[i] = buf;
- } else {
- buf.rewind();
- if (buf.remaining() < cur.length) {
- int newSize = Math.max(2 * buf.remaining(), cur.length);
- buf = Buffers.newDirectFloatBuffer(newSize);
- bufs[i] = buf;
- }
- }
- buf.put(cur);
- buf.rewind();
- }
-
- return bufs;
- }
-}