commit 6f2d931d4c74c430f8a869c64f642dda32f2c5a6
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Nov 26 22:31:43 2018 +0000

    Added a new attribute to vertices of a MeshBase object: the vec3 'inflate' vector.
    This vector describes the direction where the vertex needs to be moved when we 'inflate' the whole mesh.
    If the mesh is locally smooth, this is simply the normal vector; otherwise (for example in the corners of the MeshCubes) - not.
    
    Currently the new attribute is always set to (1,0,0) and not used yet.

diff --git a/src/main/java/org/distorted/library/mesh/MeshBase.java b/src/main/java/org/distorted/library/mesh/MeshBase.java
index a3e465c..35800cf 100644
--- a/src/main/java/org/distorted/library/mesh/MeshBase.java
+++ b/src/main/java/org/distorted/library/mesh/MeshBase.java
@@ -39,18 +39,26 @@ import java.nio.FloatBuffer;
  */
 public abstract class MeshBase
    {
-   static final int POS_DATA_SIZE= 3;
-   static final int NOR_DATA_SIZE= 3;
-   static final int TEX_DATA_SIZE= 2;
+   private static final int POS_DATA_SIZE= 3;
+   private static final int NOR_DATA_SIZE= 3;
+   private static final int INF_DATA_SIZE= 3;
+   private static final int TEX_DATA_SIZE= 2;
+
+   static final int POS_ATTRIB   = 0;
+   static final int NOR_ATTRIB   = POS_DATA_SIZE;
+   static final int INF_ATTRIB   = POS_DATA_SIZE + NOR_DATA_SIZE;
+   static final int TEX_ATTRIB   = POS_DATA_SIZE + NOR_DATA_SIZE + INF_DATA_SIZE;
+   static final int VERT_ATTRIBS = POS_DATA_SIZE + NOR_DATA_SIZE + INF_DATA_SIZE + TEX_DATA_SIZE;
 
    private static final int BYTES_PER_FLOAT = 4;
 
-   private static final int OFFSET_POS =                                                        0;
-   private static final int OFFSET_NOR = (POS_DATA_SIZE                         )*BYTES_PER_FLOAT;
-   private static final int OFFSET_TEX = (POS_DATA_SIZE+NOR_DATA_SIZE           )*BYTES_PER_FLOAT;
+   private static final int OFFSET_POS = POS_ATTRIB*BYTES_PER_FLOAT;
+   private static final int OFFSET_NOR = NOR_ATTRIB*BYTES_PER_FLOAT;
+   private static final int OFFSET_INF = INF_ATTRIB*BYTES_PER_FLOAT;
+   private static final int OFFSET_TEX = TEX_ATTRIB*BYTES_PER_FLOAT;
 
-   private static final int TFSIZE  = (POS_DATA_SIZE+POS_DATA_SIZE              )*BYTES_PER_FLOAT;
-   private static final int VERTSIZE= (POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*BYTES_PER_FLOAT;
+   private static final int TFSIZE  = (POS_DATA_SIZE+POS_DATA_SIZE                            )*BYTES_PER_FLOAT;
+   private static final int VERTSIZE= (POS_DATA_SIZE+NOR_DATA_SIZE+INF_DATA_SIZE+TEX_DATA_SIZE)*BYTES_PER_FLOAT;
 
    private boolean mShowNormals;       // when rendering this mesh, draw normal vectors?
    private DistortedBuffer mVBO, mTFO; // main vertex buffer and transform feedback buffer
@@ -128,7 +136,8 @@ public abstract class MeshBase
      GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mVBO.mIndex[0] );
      GLES31.glVertexAttribPointer(program.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET_POS);
      GLES31.glVertexAttribPointer(program.mAttribute[1], MeshBase.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET_NOR);
-     GLES31.glVertexAttribPointer(program.mAttribute[2], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET_TEX);
+     GLES31.glVertexAttribPointer(program.mAttribute[2], MeshBase.INF_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET_INF);
+     GLES31.glVertexAttribPointer(program.mAttribute[3], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET_TEX);
      GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
      }
 
diff --git a/src/main/java/org/distorted/library/mesh/MeshCubes.java b/src/main/java/org/distorted/library/mesh/MeshCubes.java
index 4ac6de3..caa6c7a 100644
--- a/src/main/java/org/distorted/library/mesh/MeshCubes.java
+++ b/src/main/java/org/distorted/library/mesh/MeshCubes.java
@@ -461,31 +461,6 @@ public class MeshCubes extends MeshBase
      return vertex;
      }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private int repeatLast(int vertex, float[] attribs)
-     {
-     //android.util.Log.e("CUBES", "repeating last vertex!");
-
-     if( vertex>0 )
-       {
-       remainingVert--;
-
-       attribs[8*vertex  ] = attribs[8*vertex-8];
-       attribs[8*vertex+1] = attribs[8*vertex-7];
-       attribs[8*vertex+2] = attribs[8*vertex-6];
-       attribs[8*vertex+3] = attribs[8*vertex-5];
-       attribs[8*vertex+4] = attribs[8*vertex-4];
-       attribs[8*vertex+5] = attribs[8*vertex-3];
-       attribs[8*vertex+6] = attribs[8*vertex-2];
-       attribs[8*vertex+7] = attribs[8*vertex-1];
-         
-       vertex++;     
-       }
-     
-     return vertex;
-     }
-   
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private int buildSideGrid(int vertex, float[] attribs)
@@ -607,14 +582,20 @@ public class MeshCubes extends MeshBase
      float x = (float)col/mCols;
      float y = (float)row/mRows;
 
-     attribs[8*vertex  ] = x-0.5f;
-     attribs[8*vertex+1] = 0.5f-y;
-     attribs[8*vertex+2] = vectZ;
-     attribs[8*vertex+3] = mNormalX[index];
-     attribs[8*vertex+4] = mNormalY[index];
-     attribs[8*vertex+5] = mNormalZ[index];
-     attribs[8*vertex+6] = x;
-     attribs[8*vertex+7] = 1.0f-y;
+     attribs[VERT_ATTRIBS*vertex + POS_ATTRIB  ] = x-0.5f;
+     attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f-y;
+     attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = vectZ;
+
+     attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB  ] = mNormalX[index];
+     attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = mNormalY[index];
+     attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = mNormalZ[index];
+
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = 1.0f;  //
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f;  // TODO
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f;  //
+
+     attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] = x;
+     attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f-y;
 
      return vertex+1;
      }
@@ -633,54 +614,113 @@ public class MeshCubes extends MeshBase
        {
        case NORTH: x = (float)(back ? (curr.col  ):(curr.col+1))/mCols;
 
-                   attribs[8*vertex  ] = x - 0.5f;
-                   attribs[8*vertex+1] = 0.5f - (float)curr.row/mRows;
-                   attribs[8*vertex+2] = 0.5f - (float)slice/mSlices;
-                   attribs[8*vertex+3] = side==NORTH ? 0.0f : (side==WEST?-R:R);
-                   attribs[8*vertex+4] = 1.0f;
-                   attribs[8*vertex+5] = (slice==0 ? R : (slice==mSlices ? -R:0) );
-                   attribs[8*vertex+6] = x;
-                   attribs[8*vertex+7] = 1.0f-(float)(curr.row-slice)/mRows;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB  ] = x - 0.5f;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f - (float)curr.row/mRows;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;
+
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB  ] = side==NORTH ? 0.0f : (side==WEST?-R:R);
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = 1.0f;
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );
+
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = 1.0f;  //
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f;  // TODO
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f;  //
+
+                   attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] = x;
+                   attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f-(float)(curr.row-slice)/mRows;
                    break;
        case SOUTH: x = (float)(back ? (curr.col+1):(curr.col  ))/mCols;
 
-                   attribs[8*vertex  ] = x - 0.5f;
-                   attribs[8*vertex+1] = 0.5f - (float)(curr.row+1)/mRows;
-                   attribs[8*vertex+2] = 0.5f - (float)slice/mSlices;
-                   attribs[8*vertex+3] = side==SOUTH ? 0.0f: (side==EAST?-R:R);
-                   attribs[8*vertex+4] =-1.0f;
-                   attribs[8*vertex+5] = (slice==0 ? R : (slice==mSlices ? -R:0) );
-                   attribs[8*vertex+6] = x;
-                   attribs[8*vertex+7] = 1.0f - (float)(curr.row+1+slice)/mRows;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB  ] = x - 0.5f;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f - (float)(curr.row+1)/mRows;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;
+
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB  ] = side==SOUTH ? 0.0f: (side==EAST?-R:R);
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] =-1.0f;
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );
+
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = 1.0f;  //
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f;  // TODO
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f;  //
+
+                   attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] = x;
+                   attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f - (float)(curr.row+1+slice)/mRows;
                    break;
        case WEST : y = (float)(back  ? (curr.row+1):(curr.row))/mRows;
 
-                   attribs[8*vertex  ] = (float)curr.col/mCols -0.5f;
-                   attribs[8*vertex+1] = 0.5f - y;
-                   attribs[8*vertex+2] = 0.5f - (float)slice/mSlices;
-                   attribs[8*vertex+3] =-1.0f;
-                   attribs[8*vertex+4] = side==WEST ? 0.0f : (side==NORTH?-R:R);
-                   attribs[8*vertex+5] = (slice==0 ? R : (slice==mSlices ? -R:0) );
-                   attribs[8*vertex+6] = (float)(curr.col-slice)/mCols;
-                   attribs[8*vertex+7] = 1.0f - y;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB  ] = (float)curr.col/mCols -0.5f;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f - y;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;
+
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB  ] =-1.0f;
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = side==WEST ? 0.0f : (side==NORTH?-R:R);
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );
+
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = 1.0f;  //
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f;  // TODO
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f;  //
+
+                   attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] = (float)(curr.col-slice)/mCols;
+                   attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f - y;
                    break;
        case EAST : y = (float)(back  ? (curr.row):(curr.row+1))/mRows;
 
-                   attribs[8*vertex  ] = (float)(curr.col+1)/mCols -0.5f;
-                   attribs[8*vertex+1] = 0.5f - y;
-                   attribs[8*vertex+2] = 0.5f - (float)slice/mSlices;
-                   attribs[8*vertex+3] = 1.0f;
-                   attribs[8*vertex+4] = side==EAST ? 0.0f : (side==SOUTH?-R:R);
-                   attribs[8*vertex+5] = (slice==0 ? R : (slice==mSlices ? -R:0) );
-                   attribs[8*vertex+6] = (float)(curr.col+1+slice)/mCols;
-                   attribs[8*vertex+7] = 1.0f - y;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB  ] = (float)(curr.col+1)/mCols -0.5f;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f - y;
+                   attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;
+
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB  ] = 1.0f;
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = side==EAST ? 0.0f : (side==SOUTH?-R:R);
+                   attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );
+
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = 1.0f;  //
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f;  // TODO
+                   attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f;  //
+
+                   attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] = (float)(curr.col+1+slice)/mCols;
+                   attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f - y;
                    break;
        }
-     
-     if(attribs[8*vertex+6]>1.0f) attribs[8*vertex+6] = 2.0f-attribs[8*vertex+6];
-     if(attribs[8*vertex+6]<0.0f) attribs[8*vertex+6] =     -attribs[8*vertex+6];
-     if(attribs[8*vertex+7]>1.0f) attribs[8*vertex+7] = 2.0f-attribs[8*vertex+7];
-     if(attribs[8*vertex+7]<0.0f) attribs[8*vertex+7] =     -attribs[8*vertex+7];
+
+     float tex0 =  attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ];
+     float tex1 =  attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1];
+
+     if(tex0>1.0f) attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] = 2.0f-tex0;
+     if(tex0<0.0f) attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] =     -tex0;
+     if(tex1>1.0f) attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 2.0f-tex1;
+     if(tex1<0.0f) attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] =     -tex1;
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private int repeatLast(int vertex, float[] attribs)
+     {
+     //android.util.Log.e("CUBES", "repeating last vertex!");
+
+     if( vertex>0 )
+       {
+       remainingVert--;
+
+       attribs[VERT_ATTRIBS*vertex + POS_ATTRIB  ] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB  ];
+       attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB+1];
+       attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB+2];
+
+       attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB  ] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB  ];
+       attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB+1];
+       attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB+2];
+
+       attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB  ];
+       attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB+1];
+       attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB+2];
+
+       attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] = attribs[VERT_ATTRIBS*(vertex-1) + TEX_ATTRIB  ];
+       attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + TEX_ATTRIB+1];
+
+
+       vertex++;
+       }
+
+     return vertex;
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -688,7 +728,7 @@ public class MeshCubes extends MeshBase
   private void build()
      {
      int vertSoFar=0;
-     float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
+     float[] attribs= new float[VERT_ATTRIBS*numVertices];
 
      vertSoFar = buildFrontBackGrid(true, vertSoFar,attribs);
 
diff --git a/src/main/java/org/distorted/library/mesh/MeshFlat.java b/src/main/java/org/distorted/library/mesh/MeshFlat.java
index d037c74..417f117 100644
--- a/src/main/java/org/distorted/library/mesh/MeshFlat.java
+++ b/src/main/java/org/distorted/library/mesh/MeshFlat.java
@@ -62,16 +62,20 @@ public class MeshFlat extends MeshBase
      {
      remainingVert--;
 
-     attribs[8*vertex  ] = x-0.5f;
-     attribs[8*vertex+1] = 0.5f-y;
-     attribs[8*vertex+2] = 0;
+     attribs[VERT_ATTRIBS*vertex + POS_ATTRIB  ] = x-0.5f;
+     attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f-y;
+     attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0;
 
-     attribs[8*vertex+3] = 0.0f;
-     attribs[8*vertex+4] = 0.0f;
-     attribs[8*vertex+5] = 1.0f;
+     attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB  ] = 0.0f;
+     attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = 0.0f;
+     attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = 1.0f;
 
-     attribs[8*vertex+6] = x;
-     attribs[8*vertex+7] = 1.0f-y;
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = 1.0f;  //
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f;  // TODO
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f;  //
+
+     attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] = x;
+     attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f-y;
 
      return vertex+1;
      }
@@ -80,20 +84,26 @@ public class MeshFlat extends MeshBase
 
   private int repeatLast(int vertex, float[] attribs)
      {
-     remainingVert--;
-
      //android.util.Log.e("MeshFlat", "repeating last vertex!");
 
      if( vertex>0 )
        {
-       attribs[8*vertex  ] = attribs[8*vertex-8];
-       attribs[8*vertex+1] = attribs[8*vertex-7];
-       attribs[8*vertex+2] = attribs[8*vertex-6];
-       attribs[8*vertex+3] = attribs[8*vertex-5];
-       attribs[8*vertex+4] = attribs[8*vertex-4];
-       attribs[8*vertex+5] = attribs[8*vertex-3];
-       attribs[8*vertex+6] = attribs[8*vertex-2];
-       attribs[8*vertex+7] = attribs[8*vertex-1];
+       remainingVert--;
+
+       attribs[VERT_ATTRIBS*vertex + POS_ATTRIB  ] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB  ];
+       attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB+1];
+       attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB+2];
+
+       attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB  ] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB  ];
+       attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB+1];
+       attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB+2];
+
+       attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB  ];
+       attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB+1];
+       attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB+2];
+
+       attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] = attribs[VERT_ATTRIBS*(vertex-1) + TEX_ATTRIB  ];
+       attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + TEX_ATTRIB+1];
 
        vertex++;
        }
@@ -176,12 +186,12 @@ public class MeshFlat extends MeshBase
     super(0.0f);
     computeNumberOfVertices(cols,rows);
 
-    float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
+    float[] attribs= new float[VERT_ATTRIBS*numVertices];
 
     buildGrid(attribs);
 
     //android.util.Log.e("MeshFlat", "dataLen="+numVertices);
-    //android.util.Log.d("MeshFlat", "attribs: "+debug(attribs,8) );
+    //android.util.Log.d("MeshFlat", "attribs: "+debug(attribs,VERT_ATTRIBS) );
 
     if( remainingVert!=0 )
       android.util.Log.d("MeshFlat", "remainingVert " +remainingVert );
diff --git a/src/main/res/raw/main_vertex_shader.glsl b/src/main/res/raw/main_vertex_shader.glsl
index 3b6b69d..a88a1fb 100644
--- a/src/main/res/raw/main_vertex_shader.glsl
+++ b/src/main/res/raw/main_vertex_shader.glsl
@@ -22,7 +22,10 @@ precision highp int;
 
 in vec3 a_Position;                  // Per-vertex position.
 in vec3 a_Normal;                    // Per-vertex normal vector.
+in vec3 a_Inflate;                   // This vector describes the direction this vertex needs to go when we 'inflate' the whole mesh.
+                                     // If the mesh is locally smooth, this is equal to the normal vector. Otherwise (on sharp edges) - no.
 in vec2 a_TexCoordinate;             // Per-vertex texture coordinate.
+
 out vec3 v_Position;                 //
 out vec3 v_endPosition;              // for Transform Feedback only
 out vec3 v_Normal;                   //
