📄 indexedgeometryarrayretained.java
字号:
/* * $RCSfile: IndexedGeometryArrayRetained.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Use is subject to license terms. * * $Revision: 1.9 $ * $Date: 2007/04/12 17:34:05 $ * $State: Exp $ */package javax.media.j3d;import javax.vecmath.*;import java.util.ArrayList;import com.sun.j3d.internal.FloatBufferWrapper;/** * 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; int vOffset; 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); 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")); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -