commit e78a30fd53d9463903521921e177028e5c869514
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Thu May 4 15:21:59 2017 +0100

    Progress with Transform Feedback.

diff --git a/src/main/java/org/distorted/library/DistortedEffects.java b/src/main/java/org/distorted/library/DistortedEffects.java
index 3a8ecb8..00fd3e0 100644
--- a/src/main/java/org/distorted/library/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/DistortedEffects.java
@@ -38,6 +38,7 @@ import org.distorted.library.type.Data5D;
 import org.distorted.library.type.Static3D;
 
 import java.io.InputStream;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.FloatBuffer;
@@ -140,7 +141,9 @@ public class DistortedEffects
     //android.util.Log.e("Effects", "vertHeader= "+mainVertHeader);
     //android.util.Log.e("Effects", "fragHeader= "+mainFragHeader);
 
-    mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader, Distorted.GLSL);
+    String[] feedback = { "v_Position" };
+
+    mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader, Distorted.GLSL, feedback);
 
     int mainProgramH = mMainProgram.getProgramHandle();
     EffectQueueFragment.getUniforms(mainProgramH);
@@ -306,12 +309,37 @@ public class DistortedEffects
     GLES30.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshObject.NORMAL_DATA_SIZE  , GLES30.GL_FLOAT, false, 0, 0);
     GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mTexVBO[0]);
     GLES30.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, 0);
+
+    //GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, mesh.mPosTBO[0]);
+
+//    GLES30.glBeginTransformFeedback(GLES30.GL_TRIANGLES);
     GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.dataLength);
+  //  GLES30.glEndTransformFeedback();
+  //  GLES30.glFlush();
+
     GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0 );
+/*
+int len = mesh.dataLength*MeshObject.BYTES_PER_FLOAT*MeshObject.POSITION_DATA_SIZE;
+
+Buffer mappedBuffer =  GLES30.glMapBufferRange(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, len, GLES30.GL_MAP_READ_BIT);
+FloatBuffer fb = ((ByteBuffer) mappedBuffer).order(ByteOrder.nativeOrder()).asFloatBuffer();
+FloatBuffer bb = mesh.mMeshPositions;
+
+String msgB = "BEFORE: ", msgA = "AFTER : ";
+for(int d=0; d<mesh.dataLength; d++)
+  {
+  msgB+="("+(2*halfW*bb.get(3*d+0))+","+(2*halfH*bb.get(3*d+1))+","+(2*halfZ*bb.get(3*d+2))+")";
+  msgA+="("+fb.get(3*d+0)+","+fb.get(3*d+1)+","+fb.get(3*d+2)+")";
+  }
+android.util.Log.d( "Feedback", msgB);
+android.util.Log.d( "Feedback", msgA);
 
     /// DEBUG ONLY //////
-    // displayBoundingRect(halfInputW, halfInputH, halfZ, df, mM.getMVP(), mesh.getBoundingVertices() );
+    // displayBoundingRect(halfW, halfH, halfZ, surface, mM.getMVP(), fb, currTime );
     /// END DEBUG ///////
+
+GLES30.glUnmapBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER);
+*/
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/EffectQueueMatrix.java b/src/main/java/org/distorted/library/EffectQueueMatrix.java
index 647ccd3..2ddb4ad 100644
--- a/src/main/java/org/distorted/library/EffectQueueMatrix.java
+++ b/src/main/java/org/distorted/library/EffectQueueMatrix.java
@@ -250,6 +250,13 @@ class EffectQueueMatrix extends EffectQueue
     mUniforms[NUM_UNIFORMS*index+6] = mUniforms[NUM_UNIFORMS*(index+1)+6];
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float[] getMVP()
+    {
+    return mMVPMatrix;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   synchronized void send(DistortedOutputSurface projection, float halfX, float halfY, float halfZ)
diff --git a/src/main/java/org/distorted/library/MeshObject.java b/src/main/java/org/distorted/library/MeshObject.java
index 23e560d..f86a73d 100644
--- a/src/main/java/org/distorted/library/MeshObject.java
+++ b/src/main/java/org/distorted/library/MeshObject.java
@@ -44,6 +44,8 @@ public abstract class MeshObject extends DistortedObject
    int[] mNorVBO = new int[1];
    int[] mTexVBO = new int[1];
 
+   int[] mPosTBO = new int[1]; // Transform Feedback
+
    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().
 
@@ -84,6 +86,13 @@ public abstract class MeshObject extends DistortedObject
        GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, dataLength*    TEX_DATA_SIZE*BYTES_PER_FLOAT, mMeshTexture  , GLES30.GL_STATIC_READ);
        }
 
+     if( mPosTBO[0]<0 )
+       {
+       GLES30.glBindBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, mPosTBO[0]);
+       GLES30.glBufferData(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, dataLength*POSITION_DATA_SIZE*BYTES_PER_FLOAT, null, GLES30.GL_STATIC_READ);
+       GLES30.glBindBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0);
+       }
+
      GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0);
      }
 
@@ -107,6 +116,11 @@ public abstract class MeshObject extends DistortedObject
        GLES30.glDeleteBuffers(1, mTexVBO, 0);
        mTexVBO[0] = -1;
        }
+     if( mPosTBO[0]>=0 )
+       {
+       GLES30.glDeleteBuffers(1, mPosTBO, 0);
+       mPosTBO[0] = -1;
+       }
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -116,6 +130,7 @@ public abstract class MeshObject extends DistortedObject
      mPosVBO[0] = -1;
      mNorVBO[0] = -1;
      mTexVBO[0] = -1;
+     mPosTBO[0] = -1;
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
