commit ea88d502088f7e953ef3aad1d1dff7206c2cf40f
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Feb 28 00:19:22 2020 +0000

    New API: MeshBase.join() and a skeleton of an App to test it.

diff --git a/src/main/java/org/distorted/library/mesh/MeshBase.java b/src/main/java/org/distorted/library/mesh/MeshBase.java
index 14f5d66..ca3eb34 100644
--- a/src/main/java/org/distorted/library/mesh/MeshBase.java
+++ b/src/main/java/org/distorted/library/mesh/MeshBase.java
@@ -94,7 +94,6 @@ public abstract class MeshBase
        mTextureMap = new float[8];
        System.arraycopy(original.mTextureMap,0,mTextureMap,0,8);
        }
-
      }
 
    private ArrayList<Component> mComponent;
@@ -388,7 +387,81 @@ public abstract class MeshBase
  */
    public void join(MeshBase[] meshes)
      {
+     MeshBase mesh;
+     Component comp;
+     int com, num, len = meshes.length;
+     int origVertices = mNumVertices;
+
+     // compute new numVertices; take care of Components
+     mNumVertices+= ( mNumVertices%2==1 ? 2:1 );
+     com = mComponent.size();
+     mComponent.get(com-1).mEndIndex = mNumVertices;
+
+     for(int i=0; i<len; i++)
+       {
+       mesh = meshes[i];
+       com = mesh.mComponent.size();
+
+       for(int j=0; j<com; j++)
+         {
+         comp = new Component(mesh.mComponent.get(j));
+         comp.mEndIndex += mNumVertices;
+         mComponent.add(comp);
+         }
+
+       num = mesh.mNumVertices;
+       mNumVertices+= (i<len-1 ? ( num%2==1 ? num+2 : num+1 ) : num);
+       }
+
+     // allocate new attrib array
+     float[] newAttribs = new float[VERT_ATTRIBS*mNumVertices];
+     num = origVertices;
+
+     System.arraycopy(mVertAttribs,                             0, newAttribs,                         0, VERT_ATTRIBS*num);
+     System.arraycopy(mVertAttribs, VERT_ATTRIBS*(origVertices-1), newAttribs, VERT_ATTRIBS*origVertices, VERT_ATTRIBS    );
+     origVertices++;
+
+     if( num%2==1 )
+       {
+       System.arraycopy(mVertAttribs, VERT_ATTRIBS*(origVertices-1), newAttribs, VERT_ATTRIBS*origVertices, VERT_ATTRIBS);
+       origVertices++;
+       }
+
+     for(int i=0; i<len; i++)
+       {
+       mesh = meshes[i];
+       num = mesh.mNumVertices;
+
+       System.arraycopy(mesh.mVertAttribs, 0, newAttribs, VERT_ATTRIBS*origVertices, VERT_ATTRIBS    );
+       origVertices++;
+       System.arraycopy(mesh.mVertAttribs, 0, newAttribs, VERT_ATTRIBS*origVertices, VERT_ATTRIBS*num);
+       origVertices+=num;
+
+       if( i<len-1 )
+         {
+         System.arraycopy(mesh.mVertAttribs, VERT_ATTRIBS*(num-1), newAttribs, VERT_ATTRIBS*origVertices, VERT_ATTRIBS);
+         origVertices++;
+
+         if( num%2==1 )
+           {
+           System.arraycopy(mesh.mVertAttribs, VERT_ATTRIBS*(num-1), newAttribs, VERT_ATTRIBS*origVertices, VERT_ATTRIBS);
+           origVertices++;
+           }
+         }
+       }
 
+     if( origVertices!=mNumVertices )
+       {
+       android.util.Log.e("mesh", "join: origVertices: "+origVertices+" numVertices: "+mNumVertices);
+       }
+
+     mVertAttribs = newAttribs;
+
+     FloatBuffer attribs = ByteBuffer.allocateDirect(mNumVertices*VERT_SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
+     attribs.put(mVertAttribs).position(0);
+
+     mVBO.setData(mNumVertices*VERT_SIZE, attribs);
+     mTFO.setData(mNumVertices*TRAN_SIZE, null   );
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
