📄 indexedgeometryarrayretained.java
字号:
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. } } 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); } 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); } } 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; } } } geomLock.unLock(); // bbox is computed for the entries list. // so, send as false if (!inUpdater && source != null && source.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); } } 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; } } } geomLock.unLock(); // bbox is computed for the entries list. // so, send as false if (!inUpdater && source != null && source.isLive()) { sendDataChangedMessage(true); } } int getInitialIndexIndex() { return initialIndexIndex; } int getValidIndexCount() { return validIndexCount; } 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); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -