Package javax.media.j3d

Source Code of javax.media.j3d.GeometryStripArrayRetained

/*
* 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);
    }
}
TOP

Related Classes of javax.media.j3d.GeometryStripArrayRetained

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.