commit da681e7efa41965b338fe3e6806f89e5701bca23
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Nov 26 21:21:26 2018 +0000

    Some simplifications in Meshes. Hide stuff inside MeshBase.

diff --git a/src/main/java/org/distorted/library/main/DistortedEffects.java b/src/main/java/org/distorted/library/main/DistortedEffects.java
index f29982a..a02d5fe 100644
--- a/src/main/java/org/distorted/library/main/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/main/DistortedEffects.java
@@ -426,8 +426,9 @@ public class DistortedEffects
   private void displayNormals(MeshBase mesh)
     {
     int num = mesh.getNumVertices();
+    int tfo = mesh.getTFO();
 
-    GLES31.glBindBufferBase(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0, mesh.getTFO() );
+    GLES31.glBindBufferBase(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo );
     GLES31.glBeginTransformFeedback( GLES31.GL_POINTS);
     DistortedRenderState.switchOffDrawing();
     GLES31.glDrawArrays( GLES31.GL_POINTS, 0, num );
@@ -437,9 +438,7 @@ public class DistortedEffects
 
     mNormalProgram.useProgram();
     GLES31.glUniformMatrix4fv(mNormalMVPMatrixH, 1, false, mM.getMVP() , 0);
-    GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getTFO() );
-    GLES31.glVertexAttribPointer(mNormalProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, 0, 0);
-    GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
+    mesh.bindTransformAttribs(mNormalProgram);
     GLES31.glLineWidth(8.0f);
     GLES31.glDrawArrays(GLES31.GL_LINES, 0, 2*num);
     }
@@ -470,11 +469,7 @@ public class DistortedEffects
     GLES31.glUniform2ui(mMainOITSizeH, surface.mWidth, surface.mHeight);
     GLES31.glUniform1ui(mMainOITNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) );
 
-    GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getVBO() );
-    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET0);
-    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[1], MeshBase.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET1);
-    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[2], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET2);
-    GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
+    mesh.bindVertexAttribs(mMainOITProgram);
 
     mM.send(surface,halfW,halfH,halfZ,0,1);
     mV.send(1);
@@ -508,11 +503,7 @@ public class DistortedEffects
     mMainProgram.useProgram();
     GLES31.glUniform1i(mMainTextureH, 0);
 
-    GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getVBO() );
-    GLES31.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET0);
-    GLES31.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshBase.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET1);
-    GLES31.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET2);
-    GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
+    mesh.bindVertexAttribs(mMainProgram);
 
     mM.send(surface,halfW,halfH,halfZ,0,0);
     mV.send(0);
diff --git a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
index c9961d7..28406e4 100644
--- a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
@@ -171,11 +171,7 @@ class EffectQueuePostprocess extends EffectQueue
 
       mPreProgram.useProgram();
 
-      GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getVBO() );
-      GLES31.glVertexAttribPointer(mPreProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET0);
-      GLES31.glVertexAttribPointer(mPreProgram.mAttribute[1], MeshBase.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET1);
-      GLES31.glVertexAttribPointer(mPreProgram.mAttribute[2], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET2);
-      GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
+      mesh.bindVertexAttribs(mPreProgram);
 
       node.getEffects().send(halfW, halfH, halfZ, margin, buffer, 2);
 
diff --git a/src/main/java/org/distorted/library/mesh/MeshBase.java b/src/main/java/org/distorted/library/mesh/MeshBase.java
index 597552d..a3e465c 100644
--- a/src/main/java/org/distorted/library/mesh/MeshBase.java
+++ b/src/main/java/org/distorted/library/mesh/MeshBase.java
@@ -23,7 +23,10 @@ import android.opengl.GLES31;
 
 import org.distorted.library.main.Distorted;
 import org.distorted.library.main.DistortedBuffer;
+import org.distorted.library.program.DistortedProgram;
 
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
 import java.nio.FloatBuffer;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -31,35 +34,30 @@ import java.nio.FloatBuffer;
  * Abstract class which represents a Mesh, ie 3 arrays of Vertex attributes: 1) positions
  * 2) normals 3) texture coordinates.
  * <p>
- * If you want to render to a particular shape, extend from here, construct the attrib FloatBuffer
- * and provide correct numVertices.
+ * If you want to render to a particular shape, extend from here, construct a float array
+ * containing per-vertex attributes, and call back setData().
  */
 public abstract class MeshBase
    {
-   private static final int BYTES_PER_FLOAT = 4;
+   static final int POS_DATA_SIZE= 3;
+   static final int NOR_DATA_SIZE= 3;
+   static final int TEX_DATA_SIZE= 2;
 
-   public static final int POS_DATA_SIZE= 3;
-   public static final int NOR_DATA_SIZE= 3;
-   public static final int TEX_DATA_SIZE= 2;
+   private static final int BYTES_PER_FLOAT = 4;
 
-   public static final int OFFSET0 =                                                           0;
-   public static final int OFFSET1 = (POS_DATA_SIZE                            )*BYTES_PER_FLOAT;
-   public static final int OFFSET2 = (POS_DATA_SIZE+NOR_DATA_SIZE              )*BYTES_PER_FLOAT;
+   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;
 
-   public static final int TFSIZE  = (POS_DATA_SIZE+POS_DATA_SIZE              )*BYTES_PER_FLOAT;
-   public 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+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
    private final float zFactor;        // strange workaround for the fact that we need to somehow store the 'depth'
                                        // of the Mesh. Used in DistortedEffects. See DistortedTexture.getDepth().
-
-   ////////////////////////////////////////////////////////////////////////////////
-   // derived classes need to compute and fill up those 2 variables with data
-   // describing a particular shape. Having done so, call setData()
-   int mNumVertices;
-   FloatBuffer mVertAttribs;   // packed: PosX,PosY,PosZ, NorX,NorY,NorZ, TexS,TexT
-   ////////////////////////////////////////////////////////////////////////////////
+   private int mNumVertices;
+   private FloatBuffer mVertAttribs;   // packed: PosX,PosY,PosZ, NorX,NorY,NorZ, TexS,TexT
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -75,10 +73,15 @@ public abstract class MeshBase
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // when a derived class is done computing its mesh, it has to call this method.
 
-   void setData(int numVertices, FloatBuffer vertAttribs)
+   void setData(int numVertices, float[] vertexAttribs)
      {
-     mVBO.setData(numVertices*VERTSIZE, vertAttribs);
-     mTFO.setData(numVertices*TFSIZE  , null       );
+     mNumVertices = numVertices;
+
+     mVertAttribs = ByteBuffer.allocateDirect(mNumVertices*VERTSIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
+     mVertAttribs.put(vertexAttribs).position(0);
+
+     mVBO.setData(numVertices*VERTSIZE, mVertAttribs);
+     mTFO.setData(numVertices*TFSIZE  , null        );
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -87,9 +90,9 @@ public abstract class MeshBase
  *
  * @y.exclude
  */
-   public int getVBO()
+   public int getTFO()
      {
-     return mVBO.mIndex[0];
+     return mTFO.mIndex[0];
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -98,9 +101,9 @@ public abstract class MeshBase
  *
  * @y.exclude
  */
-   public int getTFO()
+   public int getNumVertices()
      {
-     return mTFO.mIndex[0];
+     return mNumVertices;
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -109,9 +112,9 @@ public abstract class MeshBase
  *
  * @y.exclude
  */
-   public int getNumVertices()
+   public float getZFactor()
      {
-     return mNumVertices;
+     return zFactor;
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -120,9 +123,26 @@ public abstract class MeshBase
  *
  * @y.exclude
  */
-   public float getZFactor()
+   public void bindVertexAttribs(DistortedProgram program)
      {
-     return zFactor;
+     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.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Not part of public API, do not document (public only because has to be used from the main package)
+ *
+ * @y.exclude
+ */
+   public void bindTransformAttribs(DistortedProgram program)
+     {
+     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mTFO.mIndex[0] );
+     GLES31.glVertexAttribPointer(program.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, 0, 0);
+     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 a19c3e2..4ac6de3 100644
--- a/src/main/java/org/distorted/library/mesh/MeshCubes.java
+++ b/src/main/java/org/distorted/library/mesh/MeshCubes.java
@@ -19,8 +19,6 @@
 
 package org.distorted.library.mesh;
 
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
 import java.util.ArrayList;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -61,6 +59,7 @@ public class MeshCubes extends MeshBase
    private ArrayList<Edge> mEdges = new ArrayList<>();
 
    private int remainingVert;
+   private int numVertices;
    private int mSideBends;
    private int mEdgeNum;
    private int mSideWalls;
@@ -183,7 +182,7 @@ public class MeshCubes extends MeshBase
      mRows       =0;
      mCols       =0;
      mSlices     =slices;
-     mNumVertices=0;
+     numVertices =0;
      
      if( cols>0 && desc.contains("1") )
        {
@@ -197,9 +196,8 @@ public class MeshCubes extends MeshBase
            mCubes[i][j] = (desc.charAt(i*mCols+j) == '1' ? 1:0);
 
        markRegions();
-       mNumVertices = computeDataLength();
-
-       remainingVert = mNumVertices;
+       numVertices = computeDataLength();
+       remainingVert = numVertices;
        }
      }
 
@@ -211,7 +209,7 @@ public class MeshCubes extends MeshBase
      mRows        =rows;
      mCols        =cols;
      mSlices      =slices;
-     mNumVertices =   0;
+     numVertices  =0;
 
      if( cols>0 && rows>0 )
        {
@@ -222,9 +220,8 @@ public class MeshCubes extends MeshBase
            mCubes[i][j] = 1;
 
        markRegions();
-       mNumVertices = computeDataLength();
-
-       remainingVert = mNumVertices;
+       numVertices = computeDataLength();
+       remainingVert = numVertices;
        }
      }
 
@@ -691,7 +688,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)*mNumVertices];
+     float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
 
      vertSoFar = buildFrontBackGrid(true, vertSoFar,attribs);
 
@@ -713,10 +710,7 @@ public class MeshCubes extends MeshBase
      if( remainingVert!=0 )
        android.util.Log.e("MeshCubes", "remainingVert " +remainingVert );
 
-     mVertAttribs = ByteBuffer.allocateDirect(mNumVertices*VERTSIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
-     mVertAttribs.put(attribs).position(0);
-
-     setData(mNumVertices, mVertAttribs);
+     setData(numVertices, attribs);
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/mesh/MeshFlat.java b/src/main/java/org/distorted/library/mesh/MeshFlat.java
index f7d0763..d037c74 100644
--- a/src/main/java/org/distorted/library/mesh/MeshFlat.java
+++ b/src/main/java/org/distorted/library/mesh/MeshFlat.java
@@ -19,9 +19,6 @@
 
 package org.distorted.library.mesh;
 
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Create a flat, rectangular grid.
@@ -33,6 +30,7 @@ public class MeshFlat extends MeshBase
   {
   private int mCols, mRows;
   private int remainingVert;
+  private int numVertices;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // Create a flat, full grid.
@@ -44,17 +42,17 @@ public class MeshFlat extends MeshBase
 
      if( cols==1 && rows==1 )
        {
-       mNumVertices = 4;
+       numVertices = 4;
        }
      else
        {
-       mNumVertices = 2*( mRows*mCols +2*mRows - 1) +2*(mCols>=2 ? mRows:0) +
+       numVertices = 2*( mRows*mCols +2*mRows - 1) +2*(mCols>=2 ? mRows:0) +
                      (mCols>=2 && mRows>=2 ? 2*mRows-2 : 1);
        }
 
      //android.util.Log.e("MeshFlat","vertices="+numVertices+" rows="+mRows+" cols="+mCols);
 
-     remainingVert = mNumVertices;
+     remainingVert = numVertices;
      }
 
 
@@ -178,7 +176,7 @@ public class MeshFlat extends MeshBase
     super(0.0f);
     computeNumberOfVertices(cols,rows);
 
-    float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*mNumVertices];
+    float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
 
     buildGrid(attribs);
 
@@ -188,9 +186,6 @@ public class MeshFlat extends MeshBase
     if( remainingVert!=0 )
       android.util.Log.d("MeshFlat", "remainingVert " +remainingVert );
 
-    mVertAttribs = ByteBuffer.allocateDirect(mNumVertices*VERTSIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
-    mVertAttribs.put(attribs).position(0);
-
-    setData(mNumVertices, mVertAttribs);
+    setData(numVertices, attribs);
     }
  }
\ No newline at end of file
