aboutsummaryrefslogtreecommitdiffstats
path: root/src/javax/media/j3d/GeometryStripArrayRetained.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/javax/media/j3d/GeometryStripArrayRetained.java')
-rw-r--r--src/javax/media/j3d/GeometryStripArrayRetained.java828
1 files changed, 828 insertions, 0 deletions
diff --git a/src/javax/media/j3d/GeometryStripArrayRetained.java b/src/javax/media/j3d/GeometryStripArrayRetained.java
new file mode 100644
index 0000000..f08c9e9
--- /dev/null
+++ b/src/javax/media/j3d/GeometryStripArrayRetained.java
@@ -0,0 +1,828 @@
+/*
+ * 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.FloatBuffer;
+import java.util.ArrayList;
+
+import javax.vecmath.TexCoord2f;
+import javax.vecmath.TexCoord3f;
+
+
+/**
+ * The GeometryStripArray object is an abstract class that is extended for
+ * a set of GeometryArray strip primitives. These include LINE_STRIP,
+ * TRIANGLE_STRIP, and TRIANGLE_FAN.
+ */
+
+abstract class GeometryStripArrayRetained extends GeometryArrayRetained {
+
+ // Array of per-strip vertex counts
+ int stripVertexCounts[];
+
+ // Array of per-strip starting index
+ int stripStartVertexIndices[]; // start of vertices for both by-copy
+ // and by-ref
+ int stripStartOffsetIndices[]; // Used in byRef non_interleaved
+
+ // Following variables are only used in the compile mode
+ // isCompiled = true
+ int[] compileNumStrips;
+ int[] compileStripCountOffset;
+
+
+ /**
+ * Set stripVertexCount data into local array
+ */
+ void setStripVertexCounts(int stripVertexCounts[]) {
+ boolean nullGeo = false;
+
+ int i, num = stripVertexCounts.length, total = 0;
+ for (i=0; i < num; i++) {
+ total += stripVertexCounts[i];
+ if (this instanceof LineStripArrayRetained) {
+ if (stripVertexCounts[i] < 2) {
+ throw new IllegalArgumentException(J3dI18N.getString("LineStripArrayRetained1"));
+ }
+ }
+ else if (this instanceof TriangleStripArrayRetained) {
+ if (stripVertexCounts[i] < 3) {
+ throw new IllegalArgumentException(J3dI18N.getString("TriangleStripArrayRetained1"));
+ }
+ }
+ else if (this instanceof TriangleFanArrayRetained) {
+ if (stripVertexCounts[i] < 3) {
+ throw new IllegalArgumentException(J3dI18N.getString("TriangleFanArrayRetained1"));
+ }
+ }
+ }
+
+ if ((initialVertexIndex + total) > vertexCount) {
+ throw new IllegalArgumentException(J3dI18N.getString("GeometryStripArray3"));
+ }
+ if ((initialCoordIndex + total) > vertexCount) {
+ throw new IllegalArgumentException(J3dI18N.getString("GeometryStripArray7"));
+ }
+ if ((initialColorIndex + total) > vertexCount) {
+ throw new IllegalArgumentException(J3dI18N.getString("GeometryStripArray4"));
+ }
+ if ((initialNormalIndex + total) > vertexCount) {
+ throw new IllegalArgumentException(J3dI18N.getString("GeometryStripArray5"));
+ }
+ if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) {
+ if ((vertexFormat & (GeometryArray.BY_REFERENCE|vertexFormat &GeometryArray.INTERLEAVED)) == GeometryArray.BY_REFERENCE) {
+ for (i = 0; i < texCoordSetCount; i++) {
+ if ((initialTexCoordIndex[i] + total) > vertexCount) {
+ throw new IllegalArgumentException(
+ J3dI18N.getString("GeometryStripArray6"));
+ }
+ }
+ }
+ }
+ if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
+ if ((vertexFormat & (GeometryArray.BY_REFERENCE|vertexFormat &GeometryArray.INTERLEAVED)) == GeometryArray.BY_REFERENCE) {
+ for (i = 0; i < vertexAttrCount; i++) {
+ if ((initialVertexAttrIndex[i] + total) > vertexCount) {
+ throw new IllegalArgumentException(
+ J3dI18N.getString("GeometryStripArray8"));
+ }
+ }
+ }
+ }
+ boolean isLive = source!=null && source.isLive();
+ if(isLive){
+ geomLock.getLock();
+ }
+ dirtyFlag |= STRIPCOUNT_CHANGED;
+ validVertexCount = total;
+ this.stripVertexCounts = new int[num];
+ stripStartVertexIndices = new int[num];
+ stripStartOffsetIndices = new int[num];
+ stripStartOffsetIndices[0] = 0;
+ if ((vertexFormat & (GeometryArray.BY_REFERENCE|vertexFormat &GeometryArray.INTERLEAVED)) == GeometryArray.BY_REFERENCE) {
+ stripStartVertexIndices[0] = initialCoordIndex;
+ nullGeo = ((vertexType & GeometryArrayRetained.VERTEX_DEFINED) == 0);
+ }
+ else {
+ stripStartVertexIndices[0] = initialVertexIndex;
+ if ((vertexFormat & GeometryArray.INTERLEAVED) != 0) {
+ if (( vertexFormat & GeometryArray.USE_NIO_BUFFER) != 0) {
+ nullGeo = (interLeavedVertexData == null);
+ }
+ else {
+ nullGeo = (interleavedFloatBufferImpl == null);
+ }
+ }
+ }
+
+ for (i=0; i<num-1; i++) {
+ this.stripVertexCounts[i] = stripVertexCounts[i];
+ stripStartVertexIndices[i+1] = stripStartVertexIndices[i] +
+ stripVertexCounts[i];
+ stripStartOffsetIndices[i+1] = stripStartOffsetIndices[i]+stripVertexCounts[i];
+ }
+ this.stripVertexCounts[num-1] = stripVertexCounts[num-1];
+ if(isLive) {
+ geomLock.unLock();
+ }
+ if (!inUpdater && isLive) {
+ processCoordsChanged(nullGeo);
+ sendDataChangedMessage(true);
+ }
+
+ }
+ void unIndexify(IndexedGeometryStripArrayRetained src) {
+ if ((src.vertexFormat & GeometryArray.USE_NIO_BUFFER) == 0) {
+ unIndexifyJavaArray(src);
+ }
+ else {
+ unIndexifyNIOBuffer(src);
+ }
+ }
+
+ private void unIndexifyJavaArray(IndexedGeometryStripArrayRetained src) {
+ int vOffset = 0, srcOffset, tOffset = 0;
+ int base = src.initialIndexIndex;
+ int i,j, k, index, colorStride = 0;
+ float[] vdata = null;
+
+ if (((src.vertexFormat & GeometryArray.BY_REFERENCE) == 0) ||
+ ((src.vertexFormat & GeometryArray.INTERLEAVED) != 0)) {
+
+ if ((src.vertexFormat & GeometryArray.BY_REFERENCE) == 0) {
+ vdata = src.vertexData;
+ if ((src.vertexFormat & GeometryArray.COLOR) != 0)
+ colorStride = 4;
+ }
+ else if ((src.vertexFormat & GeometryArray.INTERLEAVED) != 0) {
+ vdata = src.interLeavedVertexData;
+ if ((src.vertexFormat & GeometryArray.WITH_ALPHA) != 0)
+ colorStride = 4;
+ else if ((src.vertexFormat & GeometryArray.COLOR) != 0)
+ colorStride = 3;
+ }
+
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j + base;
+ if ((vertexFormat & GeometryArray.NORMALS) != 0){
+ System.arraycopy(vdata,
+ src.indexNormal[index]*src.stride + src.normalOffset,
+ vertexData, vOffset + normalOffset, 3);
+ }
+
+ if (colorStride == 4) {
+ /*
+ System.err.println("vdata.length = "+vdata.length);
+ System.err.println("vertexData.length = "+vertexData.length);
+ System.err.println("src.stride = "+src.stride);
+ System.err.println("src.colorOffset = "+src.colorOffset);
+ System.err.println("index = "+index+" src.indexColor.length = "+src.indexColor.length);
+ System.err.println("src.indexColor[index] = "+src.indexColor[index]);
+ System.err.println("base = "+base);
+ */
+ System.arraycopy(vdata,
+ src.indexColor[index]*src.stride + src.colorOffset,
+ vertexData, vOffset + colorOffset, colorStride);
+ } else if (colorStride == 3) {
+ System.arraycopy(vdata,
+ src.indexColor[index]*src.stride + src.colorOffset,
+ vertexData, vOffset + colorOffset, colorStride);
+ vertexData[vOffset + colorOffset + 3] = 1.0f;
+ }
+
+ if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) {
+ for (k = 0; k < texCoordSetCount; k++) {
+ System.arraycopy(vdata,
+ (src.indexTexCoord[k][index])
+ * src.stride + src.textureOffset +
+ src.texCoordSetMapOffset[k],
+ vertexData,
+ vOffset + textureOffset +
+ texCoordSetMapOffset[k],
+ texCoordStride);
+ }
+ }
+
+ if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
+ for (k = 0; k < vertexAttrCount; k++) {
+ System.arraycopy(vdata,
+ src.indexVertexAttr[k][index] * src.stride + src.vertexAttrOffsets[k],
+ vertexData,
+ vOffset + vertexAttrOffsets[k],
+ vertexAttrSizes[k]);
+ }
+ }
+
+ if ((vertexFormat & GeometryArray.COORDINATES) != 0) {
+ System.arraycopy(vdata,
+ src.indexCoord[index]*src.stride + src.coordinateOffset,
+ vertexData, vOffset + coordinateOffset, 3);
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ }
+ else {
+ if ((vertexFormat & GeometryArray.NORMALS) != 0){
+ base = src.initialIndexIndex;
+ vOffset = normalOffset;
+ switch ((src.vertexType & NORMAL_DEFINED)) {
+ case NF:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+ System.arraycopy(src.floatRefNormals,
+ src.indexNormal[index]*3,
+ vertexData,
+ vOffset, 3);
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case N3F:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = src.indexNormal[j+base];
+ vertexData[vOffset] = src.v3fRefNormals[index].x;
+ vertexData[vOffset+1] = src.v3fRefNormals[index].y;
+ vertexData[vOffset+2] = src.v3fRefNormals[index].z;
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if ((vertexFormat & GeometryArray.COLOR) != 0){
+ base = src.initialIndexIndex;
+ vOffset = colorOffset;
+ int multiplier = 3;
+ if ((src.vertexFormat & GeometryArray.WITH_ALPHA) != 0)
+ multiplier = 4;
+
+ switch ((src.vertexType & COLOR_DEFINED)) {
+ case CF:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+
+ if ((src.vertexFormat & GeometryArray.WITH_ALPHA) != 0) {
+ System.arraycopy(src.floatRefColors,
+ src.indexColor[index]*multiplier,
+ vertexData,
+ vOffset, 4);
+ }
+ else {
+ System.arraycopy(src.floatRefColors,
+ src.indexColor[index]*multiplier,
+ vertexData,
+ vOffset, 3);
+ vertexData[vOffset+3] = 1.0f;
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case CUB:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = src.indexColor[j+base] * multiplier;
+ vertexData[vOffset] = (src.byteRefColors[index] & 0xff) * ByteToFloatScale;
+ vertexData[vOffset+1] = (src.byteRefColors[index+1] & 0xff) * ByteToFloatScale;;
+ vertexData[vOffset+2] = (src.byteRefColors[index+2] & 0xff) * ByteToFloatScale;;
+ if ((src.vertexFormat & GeometryArray.WITH_ALPHA) != 0) {
+ vertexData[vOffset+3] = (src.byteRefColors[index+3] & 0xff) * ByteToFloatScale;
+ }
+ else {
+ vertexData[vOffset+3] = 1.0f;
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case C3F:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = src.indexColor[j+base];
+ vertexData[vOffset] = src.c3fRefColors[index].x;
+ vertexData[vOffset+1] = src.c3fRefColors[index].y;
+ vertexData[vOffset+2] = src.c3fRefColors[index].z;
+ vertexData[vOffset+3] = 1.0f;
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case C4F:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = src.indexColor[j+base];
+ vertexData[vOffset] = src.c4fRefColors[index].x;
+ vertexData[vOffset+1] = src.c4fRefColors[index].y;
+ vertexData[vOffset+2] = src.c4fRefColors[index].z;
+ vertexData[vOffset+3] = src.c4fRefColors[index].w;
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case C3UB:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = src.indexColor[j+base];
+ vertexData[vOffset] = (src.c3bRefColors[index].x & 0xff) * ByteToFloatScale;
+ vertexData[vOffset+1] = (src.c3bRefColors[index].y & 0xff) * ByteToFloatScale;
+ vertexData[vOffset+2] = (src.c3bRefColors[index].z & 0xff) * ByteToFloatScale;
+ vertexData[vOffset+3] = 1.0f;
+
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case C4UB:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = src.indexColor[j+base];
+ vertexData[vOffset] = (src.c4bRefColors[index].x & 0xff) * ByteToFloatScale;
+ vertexData[vOffset+1] = (src.c4bRefColors[index].y & 0xff) * ByteToFloatScale;
+ vertexData[vOffset+2] = (src.c4bRefColors[index].z & 0xff) * ByteToFloatScale;
+ vertexData[vOffset+3] = (src.c4bRefColors[index].w & 0xff) * ByteToFloatScale;
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) {
+ base = src.initialIndexIndex;
+ vOffset = textureOffset;
+ switch ((src.vertexType & TEXCOORD_DEFINED)) {
+ case TF:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+
+ for (k = 0, tOffset = vOffset;
+ k < texCoordSetCount; k++) {
+ System.arraycopy(src.refTexCoords[k],
+ src.indexTexCoord[k][index]
+ *texCoordStride,
+ vertexData, tOffset, texCoordStride);
+ tOffset += texCoordStride;
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case T2F:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+ for (k = 0, tOffset = vOffset;
+ k < texCoordSetCount; k++) {
+ srcOffset =
+ src.indexTexCoord[k][index];
+ vertexData[tOffset] = ((TexCoord2f[])
+ src.refTexCoords[k])[srcOffset].x;
+ vertexData[tOffset+1] = ((TexCoord2f[])
+ src.refTexCoords[k])[srcOffset].y;
+ tOffset += texCoordStride;
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case T3F:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+ for (k = 0, tOffset = vOffset;
+ k < texCoordSetCount; k++) {
+ srcOffset =
+ src.indexTexCoord[k][index];
+ vertexData[tOffset] = ((TexCoord3f[])
+ src.refTexCoords[k])[srcOffset].x;
+ vertexData[tOffset+1] = ((TexCoord3f[])
+ src.refTexCoords[k])[srcOffset].y;
+ vertexData[tOffset+2] = ((TexCoord3f[])
+ src.refTexCoords[k])[srcOffset].z;
+ tOffset += texCoordStride;
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
+ base = src.initialIndexIndex;
+ vOffset = 0;
+ switch (src.vertexType & VATTR_DEFINED) {
+ case AF:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+
+ for (k = 0; k < vertexAttrCount; k++) {
+ System.arraycopy(src.floatRefVertexAttrs[k],
+ src.indexVertexAttr[k][index]*vertexAttrSizes[k],
+ vertexData,
+ vOffset + vertexAttrOffsets[k],
+ vertexAttrSizes[k]);
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ }
+ }
+
+ if ((vertexFormat & GeometryArray.COORDINATES) != 0){
+ vOffset = coordinateOffset;
+ base = src.initialIndexIndex;
+ switch ((src.vertexType & VERTEX_DEFINED)) {
+ case PF:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+ System.arraycopy(src.floatRefCoords,
+ src.indexCoord[index]*3,
+ vertexData,
+ vOffset, 3);
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case PD:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = src.indexCoord[j+base] * 3;
+ vertexData[vOffset] = (float)src.doubleRefCoords[index];
+ vertexData[vOffset+1] = (float)src.doubleRefCoords[index+1];
+ vertexData[vOffset+2] = (float)src.doubleRefCoords[index+2];
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case P3F:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = src.indexCoord[j+base];
+ vertexData[vOffset] = src.p3fRefCoords[index].x;
+ vertexData[vOffset+1] = src.p3fRefCoords[index].y;
+ vertexData[vOffset+2] = src.p3fRefCoords[index].z;
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case P3D:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = src.indexCoord[j+base];
+ vertexData[vOffset] = (float)src.p3dRefCoords[index].x;
+ vertexData[vOffset+1] = (float)src.p3dRefCoords[index].y;
+ vertexData[vOffset+2] = (float)src.p3dRefCoords[index].z;
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ private void unIndexifyNIOBuffer(IndexedGeometryStripArrayRetained src) {
+ int vOffset = 0, srcOffset, tOffset = 0;
+ int base = src.initialIndexIndex;
+ int i,j, k, index, colorStride = 0;
+
+
+ // interleaved case
+ if ((src.vertexFormat & GeometryArray.INTERLEAVED) != 0) {
+ if ((src.vertexFormat & GeometryArray.WITH_ALPHA) != 0)
+ colorStride = 4;
+ else if ((src.vertexFormat & GeometryArray.COLOR) != 0)
+ colorStride = 3;
+
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j + base;
+ if ((vertexFormat & GeometryArray.NORMALS) != 0){
+ src.interleavedFloatBufferImpl.position(src.indexNormal[index]*src.stride + src.normalOffset);
+ src.interleavedFloatBufferImpl.get(vertexData, vOffset + normalOffset, 3);
+ }
+ if (colorStride == 4) {
+ src.interleavedFloatBufferImpl.position(src.indexColor[index]*src.stride + src.colorOffset);
+ src.interleavedFloatBufferImpl.get(vertexData, vOffset + colorOffset, colorStride);
+ } else if (colorStride == 3) {
+ src.interleavedFloatBufferImpl.position(src.indexColor[index]*src.stride + src.colorOffset);
+ src.interleavedFloatBufferImpl.get(vertexData, vOffset + colorOffset, colorStride);
+ vertexData[vOffset + colorOffset + 3] = 1.0f;
+ }
+
+ if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) {
+ for (k = 0; k < texCoordSetCount; k++) {
+ src.interleavedFloatBufferImpl.position((src.indexTexCoord[k][index])
+ *src.stride + src.textureOffset +
+ src.texCoordSetMapOffset[k]);
+
+ src.interleavedFloatBufferImpl.get(vertexData,
+ vOffset + textureOffset + texCoordSetMapOffset[k], texCoordStride);
+ }
+ }
+
+ if ((vertexFormat & GeometryArray.COORDINATES) != 0){
+ src.interleavedFloatBufferImpl.position(src.indexCoord[index]*src.stride + src.coordinateOffset);
+ src.interleavedFloatBufferImpl.get( vertexData, vOffset + coordinateOffset, 3);
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ }
+ else {
+ if ((vertexFormat & GeometryArray.NORMALS) != 0) {
+ base = src.initialIndexIndex;
+ vOffset = normalOffset;
+ if((src.vertexType & NORMAL_DEFINED) != 0) {
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+ src.floatBufferRefNormals.position(src.indexNormal[index]*3);
+ src.floatBufferRefNormals.get(vertexData, vOffset, 3);
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ }
+ }
+
+ if ((vertexFormat & GeometryArray.COLOR) != 0) {
+ base = src.initialIndexIndex;
+ vOffset = colorOffset;
+ int multiplier = 3;
+ if ((src.vertexFormat & GeometryArray.WITH_ALPHA) != 0)
+ multiplier = 4;
+
+ switch ((src.vertexType & COLOR_DEFINED)) {
+ case CF:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+
+ if ((src.vertexFormat & GeometryArray.WITH_ALPHA) != 0) {
+ src.floatBufferRefColors.position(src.indexColor[index]*multiplier);
+ src.floatBufferRefColors.get(vertexData, vOffset, 4);
+
+ }
+ else {
+ src.floatBufferRefColors.position(src.indexColor[index]*multiplier);
+ src.floatBufferRefColors.get(vertexData, vOffset, 3);
+
+ vertexData[vOffset+3] = 1.0f;
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case CUB:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = src.indexColor[j+base] * multiplier;
+ vertexData[vOffset] = (src.byteBufferRefColors.get(index) & 0xff) * ByteToFloatScale;
+ vertexData[vOffset+1] = (src.byteBufferRefColors.get(index+1) & 0xff) * ByteToFloatScale;;
+ vertexData[vOffset+2] = (src.byteBufferRefColors.get(index+2) & 0xff) * ByteToFloatScale;;
+ if ((src.vertexFormat & GeometryArray.WITH_ALPHA) != 0) {
+ vertexData[vOffset+3] = (src.byteBufferRefColors.get(index+3) & 0xff) * ByteToFloatScale;
+ }
+ else {
+ vertexData[vOffset+3] = 1.0f;
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if ((vertexFormat & GeometryArray.TEXTURE_COORDINATE) != 0) {
+ base = src.initialIndexIndex;
+ vOffset = textureOffset;
+ if((src.vertexType & TEXCOORD_DEFINED) != 0) {
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+
+ for (k = 0, tOffset = vOffset;
+ k < texCoordSetCount; k++) {
+ FloatBuffer texBuffer = (FloatBuffer)src.refTexCoordsBuffer[k].getROBuffer();
+ texBuffer.position(src.indexTexCoord[k][index]*texCoordStride);
+ texBuffer.get(vertexData, tOffset, texCoordStride);
+ tOffset += texCoordStride;
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ }
+ }
+
+ if ((vertexFormat & GeometryArray.VERTEX_ATTRIBUTES) != 0) {
+ base = src.initialIndexIndex;
+ vOffset = 0;
+ if((src.vertexType & VATTR_DEFINED) == AF) {
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+
+ for (k = 0; k < vertexAttrCount; k++) {
+ int vaOffset = vOffset + vertexAttrOffsets[k];
+ FloatBuffer vaBuffer = src.floatBufferRefVertexAttrs[k];
+ vaBuffer.position(src.indexVertexAttr[k][index]*vertexAttrSizes[k]);
+ vaBuffer.get(vertexData, vaOffset, vertexAttrSizes[k]);
+ }
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ }
+ }
+
+ if ((vertexFormat & GeometryArray.COORDINATES) != 0) {
+ vOffset = coordinateOffset;
+ base = src.initialIndexIndex;
+ switch ((src.vertexType & VERTEX_DEFINED)) {
+ case PF:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = j+base;
+ src.floatBufferRefCoords.position(src.indexCoord[index]*3);
+ src.floatBufferRefCoords.get(vertexData, vOffset, 3);
+
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+ case PD:
+ for (i=0; i < src.stripIndexCounts.length; i++) {
+ for (j=0; j < src.stripIndexCounts[i]; j++) {
+ index = src.indexCoord[j+base] * 3;
+ vertexData[vOffset] = (float)src.doubleBufferRefCoords.get(index);
+ vertexData[vOffset+1] = (float)src.doubleBufferRefCoords.get(index+1);
+ vertexData[vOffset+2] = (float)src.doubleBufferRefCoords.get(index+2);
+ vOffset += stride;
+ }
+ base += src.stripIndexCounts[i];
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Get number of strips in the GeometryStripArray
+ * @return numStrips number of strips
+ */
+ int getNumStrips(){
+ return stripVertexCounts.length;
+ }
+
+ /**
+ * Get a list of vertexCounts for each strip
+ * @param stripVertexCounts an array that will receive vertexCounts
+ */
+ void getStripVertexCounts(int stripVertexCounts[]){
+
+ int i, num = this.stripVertexCounts.length;
+
+ for (i=0;i < num;i++)
+ {
+ stripVertexCounts[i] = this.stripVertexCounts[i];
+ }
+
+ }
+
+ void getStripVertexCounts(int id, int counts[]) {
+ int stripOffset = compileStripCountOffset[id];
+ int stripLength = compileNumStrips[id];
+ System.arraycopy(stripVertexCounts, stripOffset, counts, 0,stripLength);
+ }
+
+
+ int getNumStrips(int id) {
+ return compileNumStrips[id];
+ }
+
+ // Called only for "by-copy" geometry
+ @Override
+ void mergeGeometryArrays(ArrayList list) {
+ int numMerge = list.size();
+ int numStrips = 0;
+
+
+ for (int i = 0; i < numMerge; i++) {
+ numStrips +=
+ ((GeometryStripArrayRetained)list.get(i)).stripVertexCounts.length;
+ }
+ stripVertexCounts = new int[numStrips];
+ stripStartVertexIndices = new int[numStrips];
+ stripStartOffsetIndices = new int[numStrips];
+ int curStripOffset = 0;
+ int curStripIndexOffset = 0,stripLength;
+ int[] curStripVertexCounts;
+ int[] curStripStartIndices ;
+ int[] curStripOffsetIndices ;
+
+
+ compileNumStrips = new int[numMerge];
+ compileStripCountOffset = new int[numMerge];
+ for (int i = 0; i < numMerge; i++) {
+ GeometryStripArrayRetained strip =
+ (GeometryStripArrayRetained)list.get(i);
+ curStripVertexCounts = strip.stripVertexCounts;
+ curStripStartIndices = strip.stripStartVertexIndices;
+ curStripOffsetIndices = strip.stripStartOffsetIndices;
+ stripLength = curStripVertexCounts.length;
+ compileNumStrips[i] = stripLength;
+ compileStripCountOffset[i] = curStripOffset;
+ System.arraycopy(curStripVertexCounts, 0, stripVertexCounts,
+ curStripOffset, stripLength);
+ // Can't just copy StartIndices, have to update to reflect
+ // updated vertex position on the merged vertexData
+ for (int j = 0; j < stripLength; j++) {
+ stripStartVertexIndices[j+curStripOffset] = curStripStartIndices[j] +
+ curStripIndexOffset;
+ stripStartOffsetIndices[j+curStripOffset] = curStripOffsetIndices[j] +
+ curStripIndexOffset;
+ }
+ curStripOffset += stripLength;
+ curStripIndexOffset += strip.validVertexCount;
+ }
+ // Assign the merged validVertexCount
+ validVertexCount = curStripIndexOffset;
+
+ // call the super to merge the vertex data
+ super.mergeGeometryArrays(list);
+ }
+}