⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 indexedgeometryarrayretained.java

📁 JAVA3D矩陈的相关类
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
/* * $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 + -