diff options
Diffstat (limited to 'src/javax/media/j3d/IndexedGeometryArrayRetained.java')
-rw-r--r-- | src/javax/media/j3d/IndexedGeometryArrayRetained.java | 1932 |
1 files changed, 0 insertions, 1932 deletions
diff --git a/src/javax/media/j3d/IndexedGeometryArrayRetained.java b/src/javax/media/j3d/IndexedGeometryArrayRetained.java deleted file mode 100644 index 528c46f..0000000 --- a/src/javax/media/j3d/IndexedGeometryArrayRetained.java +++ /dev/null @@ -1,1932 +0,0 @@ -/* - * Copyright 1997-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.nio.Buffer; -import java.nio.FloatBuffer; -import java.util.ArrayList; - -import javax.vecmath.TexCoord2f; -import javax.vecmath.TexCoord3f; - -/** - * The IndexedGeometryArray object contains arrays of positional coordinates, - * colors, normals and/or texture coordinates that describe - * point, line, or surface geometry. It is extended to create - * the various primitive types (e.g., lines, triangle_strips, etc.) - */ - -abstract class IndexedGeometryArrayRetained extends GeometryArrayRetained { - - // arrays to save indices for coord, color, normal, texcoord, vertexAttr - int[] indexCoord; - int[] indexColor; - int[] indexNormal; - int[][] indexTexCoord; - int[][] indexVertexAttr; - - int indexCount = 0; - - int initialIndexIndex = 0; - int validIndexCount = 0; - - // Following variables are only used in compile mode - int[] compileIndexCount; - int[] compileIndexOffset; - - int maxCoordIndex = 0; - int maxColorIndex = 0; - int maxNormalIndex = 0; - int[] maxTexCoordIndices = null; - int[] maxVertexAttrIndices = null; - - void createIndexedGeometryArrayData(int indexCount) { - this.indexCount = indexCount; - this.validIndexCount = indexCount; - - // Only allocate color, normal, texCoord, and vertexAttr - // index arrays if USE_COORD_INDEX_ONLY is not set - boolean notUCIO = (this.vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) == 0; - - //NVaidya - // Only allocate indexCoord if BY_REFERENCE_INDICES not set - if(((this.vertexFormat & GeometryArray.COORDINATES) != 0) && - ((this.vertexFormat & GeometryArray.BY_REFERENCE_INDICES) == 0)) - this.indexCoord = new int[indexCount]; - - if(((this.vertexFormat & GeometryArray.NORMALS) != 0) && notUCIO) - this.indexNormal = new int[indexCount]; - - if(((this.vertexFormat & GeometryArray.COLOR) != 0) && notUCIO) - this.indexColor = new int[indexCount]; - - if((this.vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - this.indexTexCoord = new int[this.texCoordSetCount][]; - if(notUCIO) { - for (int i = 0; i < this.texCoordSetCount; i++) { - this.indexTexCoord[i] = new int[indexCount]; - } - } - maxTexCoordIndices = new int[texCoordSetCount]; - } - - if ((this.vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - this.indexVertexAttr = new int[this.vertexAttrCount][]; - if (notUCIO) { - for (int i = 0; i < this.vertexAttrCount; i++) { - this.indexVertexAttr[i] = new int[indexCount]; - } - } - this.maxVertexAttrIndices = new int[this.vertexAttrCount]; - } - } - - - GeometryArrayRetained cloneNonIndexedGeometry() { - GeometryArrayRetained obj = null; - - switch (this.geoType) { - case GEO_TYPE_INDEXED_LINE_SET: - obj = new LineArrayRetained(); - break; - case GEO_TYPE_INDEXED_POINT_SET: - obj = new PointArrayRetained(); - break; - case GEO_TYPE_INDEXED_QUAD_SET: - obj = new QuadArrayRetained(); - break; - case GEO_TYPE_INDEXED_TRI_SET: - obj = new TriangleArrayRetained(); - break; - default: - assert false; // Should never get here - } - - obj.createGeometryArrayData(validIndexCount, - (vertexFormat & ~(GeometryArray.BY_REFERENCE|GeometryArray.INTERLEAVED|GeometryArray.USE_NIO_BUFFER)), - texCoordSetCount, texCoordSetMap, - vertexAttrCount, vertexAttrSizes); - obj.cloneSourceArray = this; - obj.unIndexify(this); - obj.source=source; - - return obj; - } - - - /** - * Gets current number of indices - * @return indexCount - */ - int getIndexCount(){ - return indexCount; - } - - void doErrorCheck(int newMax) { - doCoordCheck(newMax); - if ((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) != 0) { - if ((vertexFormat & GeometryArray.COLOR) != 0) { - doColorCheck(newMax); - } - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - for (int i = 0; i < texCoordSetCount; i++) { - doTexCoordCheck(newMax, i); - } - } - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - for (int i = 0; i < vertexAttrCount; i++) { - doVertexAttrCheck(newMax, i); - } - } - if ((vertexFormat & GeometryArray.NORMALS) != 0) { - doNormalCheck(newMax); - } - } - } - - void doCoordCheck(int newMax) { - // Check to make sure that the array length defined by the user is ateast maxCoordIndex long - if ((vertexFormat & GeometryArray.BY_REFERENCE) == 0) { - if (newMax >= vertexCount) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray23")); - } - } - else { - if(( vertexFormat & GeometryArray.USE_NIO_BUFFER) != 0) { - if ((vertexFormat & GeometryArray.INTERLEAVED) == 0) { - switch ((vertexType & GeometryArrayRetained.VERTEX_DEFINED)) { - case PF: - if(floatBufferRefCoords != null && 3 * newMax >= floatBufferRefCoords.limit() ) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray23")); - } - break; - case PD: - if(doubleBufferRefCoords != null && 3 * newMax >= doubleBufferRefCoords.limit() ) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray23")); - } - break; - } - } - else { - if(interleavedFloatBufferImpl != null && stride * newMax >= interleavedFloatBufferImpl.limit() ) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray23")); - } - } - } else { - if ((vertexFormat & GeometryArray.INTERLEAVED) == 0) { - switch ((vertexType & VERTEX_DEFINED)) { - case PF: - if (floatRefCoords != null && (3 * newMax >= floatRefCoords.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray23")); - } - break; - case PD: - if (doubleRefCoords != null && (3 * newMax >= doubleRefCoords.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray23")); - } - - break; - case P3F: - if (p3fRefCoords != null && (newMax >= p3fRefCoords.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray23")); - } - break; - case P3D: - if (p3dRefCoords != null && (newMax >= p3dRefCoords.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray23")); - } - break; - default: - break; - } - } - else { - if (interLeavedVertexData != null && (stride * newMax >= interLeavedVertexData.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray23")); - } - } - } - } - - } - - void doColorCheck(int newMax) { - // If the new Value is greater than the old value, make sure there is array length - // to support the change - // Check to make sure that the array length defined by the user is ateast maxCoordIndex long - if ((vertexFormat & GeometryArray.COLOR) == 0) - return; - - if ((vertexFormat & GeometryArray.BY_REFERENCE) == 0) { - if (newMax >= vertexCount) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray24")); - } - } - else { - int multiplier = getColorStride(); - - if(( vertexFormat & GeometryArray.USE_NIO_BUFFER) != 0) { - if ((vertexFormat & GeometryArray.INTERLEAVED) == 0) { - switch ((vertexType & COLOR_DEFINED)) { - case CF: - if (floatBufferRefColors != null && multiplier * newMax >= floatBufferRefColors.limit()) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray24")); - } - break; - case CUB: - if (byteBufferRefColors != null && multiplier * newMax >= byteBufferRefColors.limit()) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray24")); - } - break; - } - } - else { - if(interleavedFloatBufferImpl != null && - stride * newMax >= interleavedFloatBufferImpl.limit()) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray24")); - } - } - } else { - if ((vertexFormat & GeometryArray.INTERLEAVED) == 0) { - switch ((vertexType & COLOR_DEFINED)) { - case CF: - if (floatRefColors != null && (multiplier * newMax >= floatRefColors.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray24")); - } - break; - case CUB: - if (byteRefColors != null && (multiplier * newMax >= byteRefColors.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray24")); - } - - break; - case C3F: - if (c3fRefColors != null && (newMax >= c3fRefColors.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray24")); - } - break; - case C4F: - if (c4fRefColors != null && (newMax >= c4fRefColors.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray24")); - } - break; - case C3UB: - if (c3bRefColors != null && (newMax >= c3bRefColors.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray24")); - } - break; - case C4UB: - if (c4bRefColors != null && (newMax >= c4bRefColors.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray24")); - } - break; - default: - break; - } - } else { - if (interLeavedVertexData != null && (stride * newMax >= interLeavedVertexData.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray24")); - } - } - } - } - - } - - - void doNormalCheck(int newMax) { - if ((vertexFormat & GeometryArray.NORMALS) == 0) - return; - - // Check to make sure that the array length defined by the user is ateast maxCoordIndex long - if ((vertexFormat & GeometryArray.BY_REFERENCE) == 0) { - if (newMax >= vertexCount) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray26")); - } - } - else { - if(( vertexFormat & GeometryArray.USE_NIO_BUFFER) != 0) { - if ((vertexFormat & GeometryArray.INTERLEAVED) == 0) { - switch ((vertexType & GeometryArrayRetained.NORMAL_DEFINED)) { - case NF: - if(floatBufferRefNormals != null && 3 * newMax >= floatBufferRefNormals.limit() ) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray26")); - } - break; - } - } - else { - if(interleavedFloatBufferImpl != null && stride * newMax >= interleavedFloatBufferImpl.limit() ) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray26")); - } - } - } else { - if ((vertexFormat & GeometryArray.INTERLEAVED) == 0) { - switch ((vertexType & NORMAL_DEFINED)) { - case NF: - if (floatRefNormals != null && (3 * newMax >= floatRefNormals.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray26")); - } - break; - case N3F: - if (v3fRefNormals != null && (newMax >= v3fRefNormals.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray26")); - } - - break; - default: - break; - } - } - else { - if (interLeavedVertexData != null && (stride * newMax >= interLeavedVertexData.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray26")); - } - } - } - } - - } - - - - void doTexCoordCheck(int newMax, int texCoordSet) { - - // Check to make sure that the array length defined by the user is ateast maxCoordIndex long - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) == 0) - return; - - if ((vertexFormat & GeometryArray.BY_REFERENCE) == 0) { - if (newMax >= vertexCount) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray25")); - } - } - else { - int multiplier = getTexStride(); - - if(( vertexFormat & GeometryArray.USE_NIO_BUFFER) != 0) { - if ((vertexFormat & GeometryArray.INTERLEAVED) == 0) { - switch ((vertexType & GeometryArrayRetained.TEXCOORD_DEFINED)) { - case TF: - FloatBuffer texBuffer = (FloatBuffer)refTexCoordsBuffer[texCoordSet].getROBuffer(); - if(refTexCoords[texCoordSet] != null && multiplier * newMax >= texBuffer.limit()) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray25")); - } - break; - } - } - else { - if(interleavedFloatBufferImpl != null && stride * newMax >= interleavedFloatBufferImpl.limit() ) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray25")); - } - } - } else { - - if ((vertexFormat & GeometryArray.INTERLEAVED) == 0) { - switch ((vertexType & TEXCOORD_DEFINED)) { - case TF: - if (refTexCoords[texCoordSet] != null && (multiplier * newMax >= ((float[])refTexCoords[texCoordSet]).length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray25")); - } - break; - case T2F: - if (refTexCoords[texCoordSet] != null && (newMax >= ((TexCoord2f[])refTexCoords[texCoordSet]).length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray25")); - } - - break; - case T3F: - if (refTexCoords[texCoordSet] != null && (newMax >= ((TexCoord3f[])refTexCoords[texCoordSet]).length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray25")); - } - break; - default: - break; - } - } - else { - if (interLeavedVertexData != null && (stride * newMax >= interLeavedVertexData.length)) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray25")); - } - } - } - } - - } - - void doVertexAttrCheck(int newMax, int vertexAttrNum) { - - // Check to make sure that the array length defined by the user is ateast maxVertexAttrIndex long - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) == 0) { - return; - } - - // Vertex attributes must not be interleaved - assert (vertexFormat & GeometryArray.INTERLEAVED) == 0; - - if ((vertexFormat & GeometryArray.BY_REFERENCE) == 0) { - if (newMax >= vertexCount) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray30")); - } - } else { - int multiplier = vertexAttrSizes[vertexAttrNum]; - - if(( vertexFormat & GeometryArray.USE_NIO_BUFFER) != 0) { - switch (vertexType & VATTR_DEFINED) { - case AF: - if(multiplier * newMax >= floatBufferRefVertexAttrs[vertexAttrNum].limit()) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray30")); - } - break; - } - } else { - switch (vertexType & VATTR_DEFINED) { - case AF: - if (multiplier * newMax >= floatRefVertexAttrs[vertexAttrNum].length) { - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray30")); - } - break; - } - } - } - } - - - /** - * Sets the coordinate index associated with the vertex at - * the specified index for this object. - * @param index the vertex index - * @param coordinateIndex the new coordinate index - */ - final void setCoordinateIndex(int index, int coordinateIndex) { - int newMax; - newMax = doIndexCheck(index, maxCoordIndex, indexCoord, coordinateIndex); - if (newMax > maxCoordIndex) { - doErrorCheck(newMax); - } - if ((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) != 0) { - if ((vertexFormat & GeometryArray.COLOR) != 0) { - maxColorIndex = newMax; - } - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - for (int i = 0; i < texCoordSetCount; i++) { - maxTexCoordIndices[i] = newMax; - } - } - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - for (int i = 0; i < vertexAttrCount; i++) { - maxVertexAttrIndices[i] = newMax; - } - } - if ((vertexFormat & GeometryArray.NORMALS) != 0) { - maxNormalIndex = newMax; - } - } - - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - dirtyFlag |= INDEX_CHANGED; - this.indexCoord[index] = coordinateIndex; - maxCoordIndex = newMax; - if(isLive) { - geomLock.unLock(); - } - if (!inUpdater && isLive) { - sendDataChangedMessage(true); - } - } - - int doIndexCheck(int index, int maxIndex, int[] indices, int dataValue) { - int newMax = maxIndex; - if (index < initialIndexIndex) - return newMax; - - if (index >= (initialIndexIndex+validIndexCount)) - return newMax; - - if (dataValue < 0) { - // Throw an exception, since index is negative - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray27")); - - } - - if (newMax == indices[index]) { - if (dataValue >= newMax) { - newMax = dataValue; - } - // Go thru the entire list and look for the max - else { - for (int i = 0; i < indices.length; i++) { - if (indices[i] > newMax) { - newMax = indices[i]; - } - } - } - } - else if (dataValue > newMax) { - newMax = dataValue; - } - return newMax; - } - - int doIndicesCheck(int index, int maxIndex, int[] indices, int[] newIndices) { - int newMax = maxIndex; - boolean computeNewMax = false; - int i, j, num = newIndices.length; - boolean maxReset = false; - for (j = 0; j < num; j++) { - if ((index+j) < initialIndexIndex) - continue; - - if ((index+j) >= (initialIndexIndex+validIndexCount)) - continue; - if (newIndices[j] < 0) { - // Throw an exception, since index is negative - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray27")); - - } - if (indices[index+j] == maxIndex) { - if (newIndices[j] >= newMax) { - newMax = newIndices[j]; - computeNewMax = false; - maxReset = true; - } - // Go thru the entire list and look for the max - // If in the new list there is no value that is >= - // to the old maximum - else if (!maxReset){ - computeNewMax = true; - } - } - else if (newIndices[j] >= newMax) { - newMax = newIndices[j]; - computeNewMax = false; - maxReset = true; - } - } - if (computeNewMax) { - for (i = 0; i < indices.length; i++) { - if (indices[i] > newMax) { - newMax = indices[i]; - } - } - } - return newMax; - } - - - /** - * Sets the coordinate indices associated with the vertices starting at - * the specified index for this object. - * @param index the vertex index - * @param coordinateIndices an array of coordinate indices - */ - final void setCoordinateIndices(int index, int coordinateIndices[]) { - int newMax; - int i, j, num = coordinateIndices.length; - newMax = doIndicesCheck(index, maxCoordIndex, indexCoord, coordinateIndices); - if (newMax > maxCoordIndex) { - doErrorCheck(newMax); - } - if ((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) != 0) { - if ((vertexFormat & GeometryArray.COLOR) != 0) { - maxColorIndex = newMax; - } - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - for (i = 0; i < texCoordSetCount; i++) { - maxTexCoordIndices[i] = newMax; - } - } - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - for (i = 0; i < vertexAttrCount; i++) { - maxVertexAttrIndices[i] = newMax; - } - } - if ((vertexFormat & GeometryArray.NORMALS) != 0) { - maxNormalIndex = newMax; - } - } - - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - dirtyFlag |= INDEX_CHANGED; - maxCoordIndex = newMax; - for (i=0, j = index; i < num;i++, j++) { - this.indexCoord[j] = coordinateIndices[i]; - } - if(isLive) { - geomLock.unLock(); - } - if (!inUpdater && isLive) { - sendDataChangedMessage(true); - } - } - - //NVaidya - /** - * Sets the coordinate indices by reference to the specified array - * @param coordinateIndices an array of coordinate indices - */ - final void setCoordIndicesRef(int coordinateIndices[]) { - int newMax = 0; - - if (coordinateIndices != null) { - if (coordinateIndices.length < initialIndexIndex + validIndexCount) { - throw new IllegalArgumentException(J3dI18N.getString("IndexedGeometryArray33")); - } - - // - // option 1: could fake the args to "re-use" doIndicesCheck() - //NVaidya - // newMax = doIndicesCheck(0, maxCoordIndex, coordinateIndices, coordinateIndices); - // if (newMax > maxCoordIndex) { - // doErrorCheck(newMax); - // } - // - // option 2: same logic as in setInitialIndexIndex: Better, I Think ? - // computeMaxIndex() doesn't check for index < 0 while doIndicesCheck() does. - // So, a new method computeMaxIndexWithCheck - //NVaidya - newMax = computeMaxIndexWithCheck(initialIndexIndex, validIndexCount, coordinateIndices); - if (newMax > maxCoordIndex) { - doErrorCheck(newMax); - } - } - - if ((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) != 0) { - if ((vertexFormat & GeometryArray.COLOR) != 0) { - maxColorIndex = newMax; - } - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - for (int i = 0; i < texCoordSetCount; i++) { - maxTexCoordIndices[i] = newMax; - } - } - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - for (int i = 0; i < vertexAttrCount; i++) { - maxVertexAttrIndices[i] = newMax; - } - } - if ((vertexFormat & GeometryArray.NORMALS) != 0) { - maxNormalIndex = newMax; - } - } - - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - dirtyFlag |= INDEX_CHANGED; - maxCoordIndex = newMax; - this.indexCoord = coordinateIndices; - if(isLive) { - geomLock.unLock(); - } - if (!inUpdater && isLive) { - sendDataChangedMessage(true); - } - } - - //NVaidya - /** - * trigger from GeometryArrayRetained#updateData() - * to recompute maxCoordIndex and perform index integrity checks - */ - final void doPostUpdaterUpdate() { - // user may have called setCoordIndicesRef and/or - // changed contents of indexCoord array. Thus, need to - // recompute maxCoordIndex unconditionally (and redundantly - // if user had only invoked setCoordIndicesRef but not also - // changed contents). geomLock is currently locked. - - // Option 1: - // simply call setCoordIndicesRef(indexCoord); but this seems to cause - // deadlock or freeze - probably because the !inUpdater branch sends - // out too many sendDataChangedMessage(true) - occurs if updateData - // method is called rapidly. - // setCoordIndicesRef(indexCoord); - - // Option 2: - // use only necessary code from setCoordIndicesRef - // System.err.println("IndexedGeometryArrayretained#doUpdaterUpdate"); - int newMax = 0; - - if (indexCoord != null) { - newMax = computeMaxIndexWithCheck(initialIndexIndex, validIndexCount, indexCoord); - if (newMax > maxCoordIndex) { - doErrorCheck(newMax); - } - } - - if ((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) != 0) { - if ((vertexFormat & GeometryArray.COLOR) != 0) { - maxColorIndex = newMax; - } - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - for (int i = 0; i < texCoordSetCount; i++) { - maxTexCoordIndices[i] = newMax; - } - } - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - for (int i = 0; i < vertexAttrCount; i++) { - maxVertexAttrIndices[i] = newMax; - } - } - if ((vertexFormat & GeometryArray.NORMALS) != 0) { - maxNormalIndex = newMax; - } - } - - dirtyFlag |= INDEX_CHANGED; - maxCoordIndex = newMax; - } - - /** - * Sets the color index associated with the vertex at - * the specified index for this object. - * @param index the vertex index - * @param colorIndex the new color index - */ - final void setColorIndex(int index, int colorIndex) { - int newMax = maxColorIndex; - - newMax = doIndexCheck(index, maxColorIndex, indexColor, colorIndex); - if (newMax > maxColorIndex) { - doColorCheck(newMax); - } - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - // No need to set INDEX_CHANGED since IndexBuffer - // is used only when USE_COORD_INDEX_ONLY specified. - // In this case only coordinate index array is - // considered. - this.indexColor[index] = colorIndex; - maxColorIndex = newMax; - if(isLive) { - geomLock.unLock(); - } - if (!inUpdater && isLive) { - sendDataChangedMessage(false); - } - } - - /** - * Sets the color indices associated with the vertices starting at - * the specified index for this object. - * @param index the vertex index - * @param colorIndices an array of color indices - */ - final void setColorIndices(int index, int colorIndices[]) { - int i, j, num = colorIndices.length; - int newMax; - - newMax = doIndicesCheck(index, maxColorIndex, indexColor, colorIndices); - if (newMax > maxColorIndex) { - doColorCheck(newMax); - } - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - maxColorIndex = newMax; - for (i=0, j = index; i < num;i++, j++) { - this.indexColor[j] = colorIndices[i]; - } - if(isLive) { - geomLock.unLock(); - } - if (!inUpdater && isLive) { - sendDataChangedMessage(false); - } - } - - /** - * Sets the normal index associated with the vertex at - * the specified index for this object. - * @param index the vertex index - * @param normalIndex the new normal index - */ - final void setNormalIndex(int index, int normalIndex) { - int newMax; - - newMax = doIndexCheck(index, maxNormalIndex, indexNormal, normalIndex); - if (newMax > maxNormalIndex) { - doNormalCheck(newMax); - } - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - maxNormalIndex = newMax; - this.indexNormal[index] = normalIndex; - if(isLive) { - geomLock.unLock(); - } - if (!inUpdater && isLive) { - sendDataChangedMessage(false); - } - } - - /** - * Sets the normal indices associated with the vertices starting at - * the specified index for this object. - * @param index the vertex index - * @param normalIndices an array of normal indices - */ - final void setNormalIndices(int index, int normalIndices[]) { - int i, j, num = normalIndices.length; - int newMax; - - newMax = doIndicesCheck(index, maxNormalIndex, indexNormal, normalIndices); - if (newMax > maxNormalIndex) { - doNormalCheck(newMax); - } - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - for (i=0, j = index; i < num;i++, j++) { - this.indexNormal[j] = normalIndices[i]; - } - maxNormalIndex = newMax; - if(isLive) { - geomLock.unLock(); - } - if (!inUpdater && isLive) { - sendDataChangedMessage(false); - } - } - - /** - * Sets the texture coordinate index associated with the vertex at - * the specified index for this object. - * @param texCoordSet the texture coordinate set - * @param index the vertex index - * @param texCoordIndex the new texture coordinate index - */ - final void setTextureCoordinateIndex(int texCoordSet, int index, int texCoordIndex) { - int newMax; - int [] indices = this.indexTexCoord[texCoordSet]; - - newMax = doIndexCheck(index, maxTexCoordIndices[texCoordSet],indices, texCoordIndex); - if (newMax > maxTexCoordIndices[texCoordSet]) { - doTexCoordCheck(newMax, texCoordSet); - } - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - maxTexCoordIndices[texCoordSet] = newMax; - indices[index] = texCoordIndex; - if(isLive) { - geomLock.unLock(); - } - if (!inUpdater && isLive) { - sendDataChangedMessage(false); - } - } - - /** - * Sets the texture coordinate indices associated with the vertices - * starting at the specified index for this object. - * @param texCoordSet the texture coordinate set - * @param index the vertex index - * @param texCoordIndices an array of texture coordinate indices - */ - final void setTextureCoordinateIndices(int texCoordSet, int index, int texCoordIndices[]) { - int i, j, num = texCoordIndices.length; - int [] indices = this.indexTexCoord[texCoordSet]; - - int newMax; - - newMax = doIndicesCheck(index, maxTexCoordIndices[texCoordSet], indices, texCoordIndices); - if (newMax > maxTexCoordIndices[texCoordSet]) { - doTexCoordCheck(newMax, texCoordSet); - } - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - maxTexCoordIndices[texCoordSet] = newMax; - for (i=0, j = index; i < num;i++, j++) { - indices[j] = texCoordIndices[i]; - } - if(isLive) { - geomLock.unLock(); - } - if (!inUpdater && isLive) { - sendDataChangedMessage(false); - } - } - - /** - * Sets the vertex attribute index associated with the vertex at - * the specified index for the specified vertex attribute number - * for this object. - */ - void setVertexAttrIndex(int vertexAttrNum, - int index, - int vertexAttrIndex) { - - int newMax; - int [] indices = this.indexVertexAttr[vertexAttrNum]; - - newMax = doIndexCheck(index, maxVertexAttrIndices[vertexAttrNum],indices, vertexAttrIndex); - if (newMax > maxVertexAttrIndices[vertexAttrNum]) { - doVertexAttrCheck(newMax, vertexAttrNum); - } - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - maxVertexAttrIndices[vertexAttrNum] = newMax; - indices[index] = vertexAttrIndex; - if(isLive) { - geomLock.unLock(); - } - if (!inUpdater && isLive) { - sendDataChangedMessage(false); - } - } - - /** - * Sets the vertex attribute indices associated with the vertices - * starting at the specified index for the specified vertex attribute number - * for this object. - */ - void setVertexAttrIndices(int vertexAttrNum, - int index, - int[] vertexAttrIndices) { - - int i, j, num = vertexAttrIndices.length; - int [] indices = this.indexVertexAttr[vertexAttrNum]; - - int newMax; - - newMax = doIndicesCheck(index, maxVertexAttrIndices[vertexAttrNum], indices, vertexAttrIndices); - if (newMax > maxVertexAttrIndices[vertexAttrNum]) { - doVertexAttrCheck(newMax, vertexAttrNum); - } - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - maxVertexAttrIndices[vertexAttrNum] = newMax; - for (i=0, j = index; i < num;i++, j++) { - indices[j] = vertexAttrIndices[i]; - } - if(isLive) { - geomLock.unLock(); - } - if (!inUpdater && isLive) { - sendDataChangedMessage(false); - } - } - - /** - * Retrieves the coordinate index associated with the vertex at - * the specified index for this object. - * @param index the vertex index - * @return the coordinate index - */ - final int getCoordinateIndex(int index) { - return this.indexCoord[index]; - } - - /** - * Retrieves the coordinate indices associated with the vertices starting at - * the specified index for this object. - * @param index the vertex index - * @param coordinateIndices array that will receive the coordinate indices - */ - final void getCoordinateIndices(int index, int coordinateIndices[]) { - int i, j, num = coordinateIndices.length; - - for (i=0, j = index;i < num;i++, j++) { - coordinateIndices[i] = this.indexCoord[j]; - } - } - - //NVaidya - /** - * Returns a reference to the coordinate indices associated - * with the vertices - */ - final int[] getCoordIndicesRef() { - return this.indexCoord; - } - - /** - * Retrieves the color index associated with the vertex at - * the specified index for this object. - * @param index the vertex index - * @return the color index - */ - final int getColorIndex(int index) { - return this.indexColor[index]; - } - - /** - * Retrieves the color indices associated with the vertices starting at - * the specified index for this object. - * @param index the vertex index - * @param colorIndices array that will receive the color indices - */ - final void getColorIndices(int index, int colorIndices[]) { - int i, j, num = colorIndices.length; - - for (i=0, j = index;i < num;i++, j++) { - colorIndices[i] = this.indexColor[j]; - } - } - - /** - * Retrieves the normal index associated with the vertex at - * the specified index for this object. - * @param index the vertex index - * @return the normal index - */ - final int getNormalIndex(int index) { - return this.indexNormal[index]; - } - - /** - * Retrieves the normal indices associated with the vertices starting at - * the specified index for this object. - * @param index the vertex index - * @param normalIndices array that will receive the normal indices - */ - final void getNormalIndices(int index, int normalIndices[]) { - int i, j, num = normalIndices.length; - - for (i=0, j = index;i < num;i++, j++) { - normalIndices[i] = this.indexNormal[j]; - } - } - - /** - * Retrieves the texture coordinate index associated with the vertex at - * the specified index for this object. - * @param texCoordSet the texture coordinate set - * @param index the vertex index - * @return the texture coordinate index - */ - final int getTextureCoordinateIndex(int texCoordSet, int index) { - int [] indices = this.indexTexCoord[texCoordSet]; - - return indices[index]; - } - - /** - * Retrieves the texture coordinate indices associated with the vertices - * starting at the specified index for this object. - * @param texCoordSet the texture coordinate set - * @param index the vertex index - * @param texCoordIndices array that will receive the texture coordinate indices - */ - final void getTextureCoordinateIndices(int texCoordSet, int index, int texCoordIndices[]) { - int i, j, num = texCoordIndices.length; - int [] indices = this.indexTexCoord[texCoordSet]; - - for (i=0, j = index;i < num;i++, j++) { - texCoordIndices[i] = indices[j]; - } - } - - /** - * Retrieves the vertex attribute index associated with the vertex at - * the specified index for the specified vertex attribute number - * for this object. - */ - int getVertexAttrIndex(int vertexAttrNum, - int index) { - - int [] indices = this.indexVertexAttr[vertexAttrNum]; - - return indices[index]; - } - - /** - * Retrieves the vertex attribute indices associated with the vertices - * starting at the specified index for the specified vertex attribute number - * for this object. - */ - void getVertexAttrIndices(int vertexAttrNum, - int index, - int[] vertexAttrIndices) { - - int i, j, num = vertexAttrIndices.length; - int [] indices = this.indexVertexAttr[vertexAttrNum]; - - for (i=0, j = index;i < num;i++, j++) { - vertexAttrIndices[i] = indices[j]; - } - } - - - @Override - void execute(Canvas3D cv, RenderAtom ra, boolean isNonUniformScale, - boolean updateAlpha, float alpha, - int screen, boolean ignoreVertexColors) { - - int cdirty; - boolean useAlpha = false; - Object[] retVal; - if (mirrorGeometry != null) { - mirrorGeometry.execute(cv, ra, isNonUniformScale, updateAlpha, alpha, - screen, ignoreVertexColors); - return; - } - - // Check if index array is null; if yes, don't draw anything - if (indexCoord == null) { - return; - } - - //By reference with java array - if ((vertexFormat & GeometryArray.USE_NIO_BUFFER) == 0) { - if ((vertexFormat & GeometryArray.BY_REFERENCE) == 0) { - float[] vdata; - // System.err.println("by-copy"); - synchronized (this) { - cdirty = dirtyFlag; - if (updateAlpha && !ignoreVertexColors) { - // update the alpha values - retVal = updateAlphaInVertexData(cv, screen, alpha); - useAlpha = (retVal[0] == Boolean.TRUE); - vdata = (float[])retVal[1]; - - // D3D only - if (alpha != lastScreenAlpha) { - // handle multiple screen case - lastScreenAlpha = alpha; - cdirty |= COLOR_CHANGED; - } - } else { - vdata = vertexData; - // if transparency switch between on/off - if (lastScreenAlpha != -1) { - lastScreenAlpha = -1; - cdirty |= COLOR_CHANGED; - } - } - // geomLock is get in MasterControl when - // RenderBin render the geometry. So it is safe - // just to set the dirty flag here - dirtyFlag = 0; - } - - Pipeline.getPipeline().executeIndexedGeometry(cv.ctx, - this, geoType, isNonUniformScale, - useAlpha, - ignoreVertexColors, - initialIndexIndex, - validIndexCount, - // Vertex Count is maxCoordIndex + 1 - maxCoordIndex + 1, - ((vertexFormat & GeometryArray.COLOR) != 0)?(vertexFormat|GeometryArray.COLOR_4):vertexFormat, - vertexAttrCount, vertexAttrSizes, - texCoordSetCount, texCoordSetMap, - (texCoordSetMap == null) ? 0 : texCoordSetMap.length, - texCoordSetMapOffset, - cv.numActiveTexUnit, - vdata, null, - cdirty, indexCoord); - - - } // end of non by reference - else if ((vertexFormat & GeometryArray.INTERLEAVED) != 0) { - if(interLeavedVertexData == null) - return; - - float[] cdata = null; - - synchronized (this) { - cdirty = dirtyFlag; - if (updateAlpha && !ignoreVertexColors) { - // update the alpha values - retVal = updateAlphaInInterLeavedData(cv, screen, alpha); - useAlpha = (retVal[0] == Boolean.TRUE); - cdata = (float[])retVal[1]; - if (alpha != lastScreenAlpha) { - lastScreenAlpha = alpha; - cdirty |= COLOR_CHANGED; - } - } else { - // if transparency switch between on/off - if (lastScreenAlpha != -1) { - lastScreenAlpha = -1; - cdirty |= COLOR_CHANGED; - } - } - dirtyFlag = 0; - } - - Pipeline.getPipeline().executeIndexedGeometry(cv.ctx, - this, geoType, isNonUniformScale, - useAlpha, - ignoreVertexColors, - initialIndexIndex, - validIndexCount, - maxCoordIndex + 1, - vertexFormat, - vertexAttrCount, vertexAttrSizes, - texCoordSetCount, texCoordSetMap, - (texCoordSetMap == null) ? 0 : texCoordSetMap.length, - texCoordSetMapOffset, - cv.numActiveTexUnit, - interLeavedVertexData, cdata, - cdirty, indexCoord); - } //end of interleaved - else { - // Check if a vertexformat is set, but the array is null - // if yes, don't draw anything - if ((vertexType == 0) || - ((vertexType & VERTEX_DEFINED) == 0) || - (((vertexFormat & GeometryArray.COLOR) != 0) && - (vertexType & COLOR_DEFINED) == 0) || - (((vertexFormat & GeometryArray.NORMALS) != 0) && - (vertexType & NORMAL_DEFINED) == 0) || - (((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) && - (vertexType & VATTR_DEFINED) == 0) || - (((vertexFormat& GeometryArray.TEXTURE_COORDINATE) != 0) && - (vertexType & TEXCOORD_DEFINED) == 0)) { - return; - } else { - byte[] cbdata = null; - float[] cfdata = null; - - if ((vertexType & (CF | C3F | C4F )) != 0) { - synchronized (this) { - cdirty = dirtyFlag; - if (updateAlpha && !ignoreVertexColors) { - cfdata = updateAlphaInFloatRefColors(cv, - screen, alpha); - if (alpha != lastScreenAlpha) { - lastScreenAlpha = alpha; - cdirty |= COLOR_CHANGED; - } - } else { - cfdata = mirrorFloatRefColors[0]; - // if transparency switch between on/off - if (lastScreenAlpha != -1) { - lastScreenAlpha = -1; - cdirty |= COLOR_CHANGED; - } - - } - dirtyFlag = 0; - } - } else if ((vertexType & (CUB| C3UB | C4UB)) != 0) { - synchronized (this) { - cdirty = dirtyFlag; - if (updateAlpha && !ignoreVertexColors) { - cbdata = updateAlphaInByteRefColors( - cv, screen, alpha); - if (alpha != lastScreenAlpha) { - lastScreenAlpha = alpha; - cdirty |= COLOR_CHANGED; - } - } else { - cbdata = mirrorUnsignedByteRefColors[0]; - // if transparency switch between on/off - if (lastScreenAlpha != -1) { - lastScreenAlpha = -1; - cdirty |= COLOR_CHANGED; - } - } - dirtyFlag = 0; - } - } else { - cdirty = dirtyFlag; - } - - int vdefined = 0; - if((vertexType & (PF | P3F)) != 0) - vdefined |= COORD_FLOAT; - if((vertexType & (PD | P3D)) != 0) - vdefined |= COORD_DOUBLE; - if((vertexType & (CF | C3F | C4F)) != 0) - vdefined |= COLOR_FLOAT; - if((vertexType & (CUB| C3UB | C4UB)) != 0) - vdefined |= COLOR_BYTE; - if((vertexType & NORMAL_DEFINED) != 0) - vdefined |= NORMAL_FLOAT; - if((vertexType & VATTR_DEFINED) != 0) - vdefined |= VATTR_FLOAT; - if((vertexType & TEXCOORD_DEFINED) != 0) - vdefined |= TEXCOORD_FLOAT; - - Pipeline.getPipeline().executeIndexedGeometryVA(cv.ctx, - this, geoType, isNonUniformScale, - ignoreVertexColors, - initialIndexIndex, - validIndexCount, - maxCoordIndex + 1, - (vertexFormat | c4fAllocated), - vdefined, - mirrorFloatRefCoords, mirrorDoubleRefCoords, - cfdata, cbdata, - mirrorFloatRefNormals, - vertexAttrCount, vertexAttrSizes, - mirrorFloatRefVertexAttrs, - ((texCoordSetMap == null) ? 0:texCoordSetMap.length), - texCoordSetMap, - cv.numActiveTexUnit, - texCoordStride, - mirrorRefTexCoords, cdirty, indexCoord); - } - } // end of non interleaved and by reference - }//end of non io buffer - - else { - if ((vertexFormat & GeometryArray.INTERLEAVED) != 0) { - if( interleavedFloatBufferImpl == null) - return; - - float[] cdata = null; - - synchronized (this) { - cdirty = dirtyFlag; - if (updateAlpha && !ignoreVertexColors) { - // update the alpha values - retVal = updateAlphaInInterLeavedData(cv, screen, alpha); - useAlpha = (retVal[0] == Boolean.TRUE); - cdata = (float[])retVal[1]; - if (alpha != lastScreenAlpha) { - lastScreenAlpha = alpha; - cdirty |= COLOR_CHANGED; - } - } else { - // if transparency switch between on/off - if (lastScreenAlpha != -1) { - lastScreenAlpha = -1; - cdirty |= COLOR_CHANGED; - } - } - dirtyFlag = 0; - } - - Pipeline.getPipeline().executeIndexedGeometryBuffer(cv.ctx, - this, geoType, isNonUniformScale, - useAlpha, - ignoreVertexColors, - initialIndexIndex, - validIndexCount, - maxCoordIndex + 1, - vertexFormat, - texCoordSetCount, texCoordSetMap, - (texCoordSetMap == null) ? 0 : texCoordSetMap.length, - texCoordSetMapOffset, - cv.numActiveTexUnit, - interleavedFloatBufferImpl, cdata, - cdirty, indexCoord); - } //end of interleaved - else { - // Check if a vertexformat is set, but the array is null - // if yes, don't draw anything - if ((vertexType == 0) || - ((vertexType & VERTEX_DEFINED) == 0) || - (((vertexFormat & GeometryArray.COLOR) != 0) && - (vertexType & COLOR_DEFINED) == 0) || - (((vertexFormat & GeometryArray.NORMALS) != 0) && - (vertexType & NORMAL_DEFINED) == 0) || - (((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) && - (vertexType & VATTR_DEFINED) == 0) || - (((vertexFormat& GeometryArray.TEXTURE_COORDINATE) != 0) && - (vertexType & TEXCOORD_DEFINED) == 0)) { - return; - } else { - byte[] cbdata = null; - float[] cfdata = null; - - if ((vertexType & CF ) != 0) { - synchronized (this) { - cdirty = dirtyFlag; - if (updateAlpha && !ignoreVertexColors) { - cfdata = updateAlphaInFloatRefColors(cv, - screen, alpha); - if (alpha != lastScreenAlpha) { - lastScreenAlpha = alpha; - cdirty |= COLOR_CHANGED; - } - } else { - // XXXX: handle transparency case - //cfdata = null; - cfdata = mirrorFloatRefColors[0]; - // if transparency switch between on/off - if (lastScreenAlpha != -1) { - lastScreenAlpha = -1; - cdirty |= COLOR_CHANGED; - } - - } - dirtyFlag = 0; - } - } else if ((vertexType & CUB ) != 0) { - synchronized (this) { - cdirty = dirtyFlag; - if (updateAlpha && !ignoreVertexColors) { - cbdata = updateAlphaInByteRefColors( - cv, screen, alpha); - if (alpha != lastScreenAlpha) { - lastScreenAlpha = alpha; - cdirty |= COLOR_CHANGED; - } - } else { - // XXXX: handle transparency case - // cbdata = null; - cbdata = mirrorUnsignedByteRefColors[0]; - // if transparency switch between on/off - if (lastScreenAlpha != -1) { - lastScreenAlpha = -1; - cdirty |= COLOR_CHANGED; - } - } - dirtyFlag = 0; - } - } else { - cdirty = dirtyFlag; - } - - Buffer vcoord = null; - Buffer cdataBuffer = null; - FloatBuffer normal = null; - - int vdefined = 0; - if((vertexType & PF) != 0) { - vdefined |= COORD_FLOAT; - vcoord = floatBufferRefCoords; - } else if((vertexType & PD ) != 0) { - vdefined |= COORD_DOUBLE; - vcoord = doubleBufferRefCoords; - } - if((vertexType & CF ) != 0) { - vdefined |= COLOR_FLOAT; - cdataBuffer = floatBufferRefColors; - } else if((vertexType & CUB) != 0) { - vdefined |= COLOR_BYTE; - cdataBuffer = byteBufferRefColors; - } - - if((vertexType & NORMAL_DEFINED) != 0) { - vdefined |= NORMAL_FLOAT; - normal = floatBufferRefNormals; - } - - if ((vertexType & VATTR_DEFINED) != 0) { - vdefined |= VATTR_FLOAT; - } - - if ((vertexType & TEXCOORD_DEFINED) != 0) { - vdefined |= TEXCOORD_FLOAT; - } - - Pipeline.getPipeline().executeIndexedGeometryVABuffer(cv.ctx, - this, geoType, isNonUniformScale, - ignoreVertexColors, - initialIndexIndex, - validIndexCount, - maxCoordIndex + 1, - (vertexFormat | c4fAllocated), - vdefined, - vcoord, - cdataBuffer, - cfdata, cbdata, - normal, - vertexAttrCount, vertexAttrSizes, - floatBufferRefVertexAttrs, - ((texCoordSetMap == null) ? 0:texCoordSetMap.length), - texCoordSetMap, - cv.numActiveTexUnit, - texCoordStride, - refTexCoords, cdirty, indexCoord); - - } - } // end of non interleaved and by reference - } // end of nio buffer - } - - @Override - void buildGA(Canvas3D cv, RenderAtom ra, boolean isNonUniformScale, - boolean updateAlpha, float alpha, boolean ignoreVertexColors, - Transform3D xform, Transform3D nxform) { - int cdirty; - boolean useAlpha = false; - Object[] retVal; - if (mirrorGeometry != null) { - ((GeometryArrayRetained)mirrorGeometry).buildGA(cv, ra, isNonUniformScale, updateAlpha, alpha, - ignoreVertexColors, xform, nxform); - } - else { - - if ((vertexFormat & GeometryArray.BY_REFERENCE) == 0) { - float[] vdata; - // System.err.println("by-copy"); - synchronized (this) { - cdirty = dirtyFlag; - if (updateAlpha && !ignoreVertexColors) { - // update the alpha values - retVal = updateAlphaInVertexData(cv, cv.screen.screen, alpha); - useAlpha = (retVal[0] == Boolean.TRUE); - vdata = (float[])retVal[1]; - - // D3D only - if (alpha != lastScreenAlpha) { - // handle multiple screen case - lastScreenAlpha = alpha; - cdirty |= COLOR_CHANGED; - } - } else { - vdata = vertexData; - // if transparency switch between on/off - if (lastScreenAlpha != -1) { - lastScreenAlpha = -1; - cdirty |= COLOR_CHANGED; - } - } - // geomLock is get in MasterControl when - // RenderBin render the geometry. So it is safe - // just to set the dirty flag here - dirtyFlag = 0; - } - - Pipeline.getPipeline().buildIndexedGeometry(cv.ctx, - this, geoType, isNonUniformScale, - updateAlpha, alpha, ignoreVertexColors, - initialIndexIndex, - validIndexCount, - maxCoordIndex + 1, - vertexFormat, - vertexAttrCount, vertexAttrSizes, - texCoordSetCount, texCoordSetMap, - (texCoordSetMap == null) ? 0 : texCoordSetMap.length, - texCoordSetMapOffset, - (xform == null) ? null : xform.mat, - (nxform == null) ? null : nxform.mat, - vdata, indexCoord); - } - // XXXX: Note that there is no "else" clause here, and no - // buildIndexedGeometryForByRef() method. - // We would need to create one if we ever wanted to support by-ref - // indexed geometry in display lists. Better yet, we could fix - // canBeInDisplayList so that unindexified by-ref geometry could - // go into a display list. - } - } - - @Override - void mergeGeometryArrays(ArrayList list) { - int numMerge = list.size(); - int[] texCoord = null; - indexCount = 0; - for (int i=0; i < numMerge; i++) { - IndexedGeometryArrayRetained geo= (IndexedGeometryArrayRetained)list.get(i); - indexCount += geo.validIndexCount; - } - validIndexCount = indexCount; - initialIndexIndex = 0; - compileIndexCount = new int[numMerge]; - compileIndexOffset = new int[numMerge]; - indexCoord = new int[indexCount]; - boolean notUCIO = (vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) == 0; - if (notUCIO) { - if ((vertexFormat & GeometryArray.COLOR) != 0) - indexColor = new int[indexCount]; - if ((vertexFormat & GeometryArray.NORMALS) != 0) - indexNormal = new int[indexCount]; - // We only merge if the texCoordSetCount is 1 and there are no - // vertex attrs - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - indexTexCoord = new int[1][]; - indexTexCoord[0] = new int[indexCount]; - texCoord = indexTexCoord[0]; - } - } - int curDataOffset = 0; - int curIndexOffset = 0; - for (int i = 0; i < numMerge; i++) { - IndexedGeometryArrayRetained geo= (IndexedGeometryArrayRetained)list.get(i); - int curIndexCount = geo.validIndexCount; - compileIndexCount[i] = curIndexCount; - // Copy all the indices - for (int j = 0; j < curIndexCount; j++) { - indexCoord[j+curIndexOffset] = geo.indexCoord[j+geo.initialIndexIndex]+curDataOffset; - if (notUCIO) { - if ((vertexFormat & GeometryArray.COLOR) != 0) - indexColor[j+curIndexOffset] = geo.indexColor[j+geo.initialIndexIndex]+curDataOffset; - if ((vertexFormat & GeometryArray.NORMALS) != 0) - indexNormal[j+curIndexOffset] = geo.indexNormal[j+geo.initialIndexIndex]+curDataOffset; - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) - texCoord[j+curIndexOffset] = geo.indexTexCoord[0][j+geo.initialIndexIndex]+curDataOffset; - } - } - maxCoordIndex = geo.maxCoordIndex +curDataOffset; - compileIndexOffset[i] = curIndexOffset; - curDataOffset += geo.vertexCount; - curIndexOffset += curIndexCount; - } - // reset the max Values - - // call the super to merge the vertex data - super.mergeGeometryArrays(list); - } - - - @Override - boolean isWriteStatic() { - - if (!super.isWriteStatic() || - source.getCapability(IndexedGeometryArray.ALLOW_COORDINATE_INDEX_WRITE ) || - source.getCapability(IndexedGeometryArray.ALLOW_COLOR_INDEX_WRITE) || - source.getCapability(IndexedGeometryArray.ALLOW_NORMAL_INDEX_WRITE) || - source.getCapability(IndexedGeometryArray.ALLOW_VERTEX_ATTR_INDEX_WRITE) || - source.getCapability(IndexedGeometryArray.ALLOW_TEXCOORD_INDEX_WRITE)) { - return false; - } - - return true; - } - - /** - * Gets current number of indices - * @return indexCount - */ - int getIndexCount(int id){ - return compileIndexCount[id]; - } - - int computeMaxIndex(int initial, int count, int[] indices) { - int maxIndex = 0; - if (indices != null) { - for (int i = initial; i < (initial+count); i++) { - if (indices[i] > maxIndex) { - maxIndex = indices[i]; - } - } - } - return maxIndex; - - } - - //NVaidya - // same as computeMaxIndex method but checks for index < 0 - int computeMaxIndexWithCheck(int initial, int count, int[] indices) { - int maxIndex = 0; - for (int i = initial; i < (initial+count); i++) { - // Throw an exception, since index is negative - if (indices[i] < 0) - throw new ArrayIndexOutOfBoundsException(J3dI18N.getString("IndexedGeometryArray27")); - if (indices[i] > maxIndex) { - maxIndex = indices[i]; - } - } - return maxIndex; - - } - - void setValidIndexCount(int validIndexCount) { - if (validIndexCount < 0) { - throw new IllegalArgumentException(J3dI18N.getString("IndexedGeometryArray21")); - } - if ((initialIndexIndex + validIndexCount) > indexCount) { - throw new IllegalArgumentException(J3dI18N.getString("IndexedGeometryArray22")); - } - if ((vertexFormat & GeometryArray.BY_REFERENCE_INDICES) != 0) { - if (indexCoord != null && indexCoord.length < initialIndexIndex + validIndexCount) { - throw new IllegalArgumentException(J3dI18N.getString("IndexedGeometryArray33")); - } - } - int newCoordMax =0; - int newColorIndex=0; - int newNormalIndex=0; - int[] newTexCoordIndex = null; - int[] newVertexAttrIndex = null; - - newCoordMax = computeMaxIndex(initialIndexIndex, validIndexCount,indexCoord ); - doErrorCheck(newCoordMax); - if ((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) == 0) { - if ((vertexFormat & GeometryArray.COLOR) != 0) { - newColorIndex = computeMaxIndex(initialIndexIndex, validIndexCount, indexColor); - doColorCheck(newColorIndex); - } - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - newTexCoordIndex = new int[texCoordSetCount]; - for (int i = 0; i < texCoordSetCount; i++) { - newTexCoordIndex[i] = computeMaxIndex(initialIndexIndex,validIndexCount, - indexTexCoord[i]); - doTexCoordCheck(newTexCoordIndex[i], i); - } - } - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - newVertexAttrIndex = new int[vertexAttrCount]; - for (int i = 0; i < vertexAttrCount; i++) { - newVertexAttrIndex[i] = computeMaxIndex(initialIndexIndex, - validIndexCount, - indexVertexAttr[i]); - doVertexAttrCheck(newVertexAttrIndex[i], i); - } - } - if ((vertexFormat & GeometryArray.NORMALS) != 0) { - newNormalIndex = computeMaxIndex(initialIndexIndex, validIndexCount, indexNormal); - doNormalCheck(newNormalIndex); - } - } - - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - this.validIndexCount = validIndexCount; - maxCoordIndex = newCoordMax; - if ((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) == 0) { - maxColorIndex = newColorIndex; - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - for (int i = 0; i < texCoordSetCount; i++) { - maxTexCoordIndices[i] = newTexCoordIndex[i]; - } - } - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - for (int i = 0; i < vertexAttrCount; i++) { - maxVertexAttrIndices[i] = newVertexAttrIndex[i]; - } - } - maxNormalIndex = newNormalIndex; - } - else { - maxColorIndex = maxCoordIndex; - maxNormalIndex = maxCoordIndex; - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - for (int i = 0; i < texCoordSetCount; i++) { - maxTexCoordIndices[i] = maxCoordIndex; - } - } - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - for (int i = 0; i < vertexAttrCount; i++) { - maxVertexAttrIndices[i] = maxCoordIndex; - } - } - } - if(isLive) { - geomLock.unLock(); - } - // bbox is computed for the entries list. - // so, send as false - if (!inUpdater && isLive) { - sendDataChangedMessage(true); - } - - } - - void setInitialIndexIndex(int initialIndexIndex) { - if ((initialIndexIndex + validIndexCount) > indexCount) { - throw new IllegalArgumentException(J3dI18N.getString("IndexedGeometryArray22")); - } - if ((vertexFormat & GeometryArray.BY_REFERENCE_INDICES) != 0) { - if (indexCoord != null && indexCoord.length < initialIndexIndex + validIndexCount) { - throw new IllegalArgumentException(J3dI18N.getString("IndexedGeometryArray33")); - } - } - - int newCoordMax =0; - int newColorIndex=0; - int newNormalIndex=0; - int[] newTexCoordIndex = null; - int[] newVertexAttrIndex = null; - - newCoordMax = computeMaxIndex(initialIndexIndex, validIndexCount, indexCoord); - doErrorCheck(newCoordMax); - if ((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) == 0) { - if ((vertexFormat & GeometryArray.COLOR) != 0) { - newColorIndex = computeMaxIndex(initialIndexIndex, validIndexCount, indexColor); - doColorCheck(newColorIndex); - } - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - newTexCoordIndex = new int[texCoordSetCount]; - for (int i = 0; i < texCoordSetCount; i++) { - newTexCoordIndex[i] = computeMaxIndex(initialIndexIndex,validIndexCount, - indexTexCoord[i]); - doTexCoordCheck(newTexCoordIndex[i], i); - } - } - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - newVertexAttrIndex = new int[vertexAttrCount]; - for (int i = 0; i < vertexAttrCount; i++) { - newVertexAttrIndex[i] = computeMaxIndex(initialIndexIndex, - validIndexCount, - indexVertexAttr[i]); - doVertexAttrCheck(newVertexAttrIndex[i], i); - } - } - if ((vertexFormat & GeometryArray.NORMALS) != 0) { - newNormalIndex = computeMaxIndex(initialIndexIndex, validIndexCount, indexNormal); - doNormalCheck(newNormalIndex); - } - } - - boolean isLive = source!=null && source.isLive(); - if(isLive){ - geomLock.getLock(); - } - dirtyFlag |= INDEX_CHANGED; - this.initialIndexIndex = initialIndexIndex; - maxCoordIndex = newCoordMax; - if ((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) == 0) { - maxColorIndex = newColorIndex; - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - for (int i = 0; i < texCoordSetCount; i++) { - maxTexCoordIndices[i] = newTexCoordIndex[i]; - } - } - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - for (int i = 0; i < vertexAttrCount; i++) { - maxVertexAttrIndices[i] = newVertexAttrIndex[i]; - } - } - maxNormalIndex = newNormalIndex; - } - else { - maxColorIndex = maxCoordIndex; - maxNormalIndex = maxCoordIndex; - if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { - for (int i = 0; i < texCoordSetCount; i++) { - maxTexCoordIndices[i] = maxCoordIndex; - } - } - if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { - for (int i = 0; i < vertexAttrCount; i++) { - maxVertexAttrIndices[i] = maxCoordIndex; - } - } - } - if(isLive) { - geomLock.unLock(); - } - // bbox is computed for the entries list. - // so, send as false - if (!inUpdater && isLive) { - sendDataChangedMessage(true); - } - } - - int getInitialIndexIndex() { - return initialIndexIndex; - } - - int getValidIndexCount() { - return validIndexCount; - } - - @Override - void handleFrequencyChange(int bit) { - if ((bit == IndexedGeometryArray.ALLOW_COORDINATE_INDEX_WRITE) || - (((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) == 0) && - ((vertexFormat & GeometryArray.COLOR) != 0) && - bit == IndexedGeometryArray.ALLOW_COLOR_INDEX_WRITE) || - (((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) == 0) && - ((vertexFormat & GeometryArray.NORMALS) != 0) && - bit == IndexedGeometryArray.ALLOW_NORMAL_INDEX_WRITE) || - (((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) == 0)&& - ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0)&& - bit == IndexedGeometryArray.ALLOW_VERTEX_ATTR_INDEX_WRITE) || - (((vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) == 0)&& - ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0)&& - bit == IndexedGeometryArray.ALLOW_TEXCOORD_INDEX_WRITE)) { - - setFrequencyChangeMask(bit, 0x1); - } - else { - super.handleFrequencyChange(bit); - } - } -} |