commit f80337b5c8febccb2cf6a1c46c256a7d0eedf512
Author: leszek <leszek@koltunski.pl>
Date:   Tue May 9 10:30:05 2017 +0100

    Revert "Some progress with Transform Feedback. Still many bugs all over."
    
    This reverts commit 79921db22e4ff5a3b2e6e3466a39445f5607a695.

diff --git a/src/main/java/org/distorted/library/DistortedEffects.java b/src/main/java/org/distorted/library/DistortedEffects.java
index 4839f3d..d5b2de5 100644
--- a/src/main/java/org/distorted/library/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/DistortedEffects.java
@@ -52,6 +52,10 @@ import java.nio.FloatBuffer;
  */
 public class DistortedEffects
   {
+  static final int MAIN_PROGRAM = 0;
+  static final int FEED_PROGRAM = 1;
+  static final int NUM_PROGRAMS = 2;
+
   // THIS IS FOR MAIN AND FEEDBACK PROGRAMS ///
   private static boolean[] mEffectEnabled = new boolean[EffectNames.size()];
 
@@ -88,6 +92,10 @@ public class DistortedEffects
   private static int mDebugObjDH;
   private static int mDebugMVPMatrixH;
 
+  /// FEEDBACK PROGRAM //
+  private static DistortedProgram mFeedbackProgram;
+
+
   private static float[] mMVPMatrix = new float[16];
   private static float[] mTmpMatrix = new float[16];
 
@@ -146,16 +154,29 @@ public class DistortedEffects
     final InputStream mainVertStream = resources.openRawResource(R.raw.main_vertex_shader);
     final InputStream mainFragStream = resources.openRawResource(R.raw.main_fragment_shader);
 
-    String[] feedback = { "v_Position", "v_Normal" };
-
-    mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader, Distorted.GLSL, feedback);
+    mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader, Distorted.GLSL);
 
     int mainProgramH = mMainProgram.getProgramHandle();
     EffectQueueFragment.getUniforms(mainProgramH);
-    EffectQueueVertex.getUniforms(mainProgramH);
-    EffectQueueMatrix.getUniforms(mainProgramH);
+    EffectQueueVertex.getUniforms(MAIN_PROGRAM,mainProgramH);
+    EffectQueueMatrix.getUniforms(MAIN_PROGRAM,mainProgramH);
     mMainTextureH= GLES30.glGetUniformLocation( mainProgramH, "u_Texture");
 
+    //////////////////////////////////////////////////////////////////////////////////////
+    ////////// FEEDBACK PROGRAM //////////////////////////////////////////////////////////
+    //////////////////////////////////////////////////////////////////////////////////////
+    final InputStream feedVertStream = resources.openRawResource(R.raw.main_vertex_shader);
+    final InputStream feedFragStream = resources.openRawResource(R.raw.feedback_fragment_shader);
+
+    String[] feedback = { "v_Position" };
+
+    mFeedbackProgram = new DistortedProgram(feedVertStream,feedFragStream, mainVertHeader, Distorted.GLSL_VERSION, Distorted.GLSL, feedback);
+
+    int feedProgramH = mFeedbackProgram.getProgramHandle();
+    EffectQueueFragment.getUniforms(feedProgramH);
+    EffectQueueVertex.getUniforms(FEED_PROGRAM,feedProgramH);
+    EffectQueueMatrix.getUniforms(FEED_PROGRAM,feedProgramH);
+
     //////////////////////////////////////////////////////////////////////////////////////
     ////////// BLIT PROGRAM //////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -305,8 +326,8 @@ public class DistortedEffects
     mMainProgram.useProgram();
     GLES30.glUniform1i(mMainTextureH, 0);
     surface.setAsOutput(currTime);
-    mM.send(surface,halfW,halfH,halfZ);
-    mV.send(halfW,halfH,halfZ);
+    mM.send(MAIN_PROGRAM,surface,halfW,halfH,halfZ);
+    mV.send(MAIN_PROGRAM,halfW,halfH,halfZ);
     mF.send(halfW,halfH);
 
     GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mPosVBO[0]);
@@ -324,8 +345,6 @@ public class DistortedEffects
 
   void drawPrivFeedback(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime)
     {
-    int error;
-
     mM.compute(currTime);
     mV.compute(currTime);
     mF.compute(currTime);
@@ -334,25 +353,24 @@ public class DistortedEffects
 
     GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
 
-    mMainProgram.useProgram();
-
-    mM.send(surface,halfW,halfH,halfZ);
-    mV.send(halfW,halfH,halfZ);
+    mFeedbackProgram.useProgram();
+    surface.setAsOutput(currTime);
+    mM.send(FEED_PROGRAM,surface,halfW,halfH,halfZ);
+    mV.send(FEED_PROGRAM,halfW,halfH,halfZ);
 
     GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mPosVBO[0]);
-    GLES30.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshObject.POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, 0);
+    GLES30.glVertexAttribPointer(mFeedbackProgram.mAttribute[0], MeshObject.POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, 0);
     GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mNorVBO[0]);
-    GLES30.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshObject.NORMAL_DATA_SIZE  , GLES30.GL_FLOAT, false, 0, 0);
+    GLES30.glVertexAttribPointer(mFeedbackProgram.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.glVertexAttribPointer(mFeedbackProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, 0);
 
     GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, mesh.mPosTBO[0]);
-    GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 1, mesh.mNorTBO[0]);
     GLES30.glEnable(GLES30.GL_RASTERIZER_DISCARD);
     GLES30.glBeginTransformFeedback(GLES30.GL_POINTS);
     GLES30.glDrawArrays(GLES30.GL_POINTS, 0, mesh.dataLength);
 
-    error = GLES30.glGetError();
+    int error = GLES30.glGetError();
     if (error != GLES30.GL_NO_ERROR)
       {
       throw new RuntimeException("2 glError 0x" + Integer.toHexString(error));
@@ -366,12 +384,12 @@ int len = mesh.dataLength*MeshObject.BYTES_PER_FLOAT*MeshObject.POSITION_DATA_SI
 
 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.mMeshNormals;
+FloatBuffer bb = mesh.mMeshPositions;
 
 String msgB = "";
 for(int d=0; d<mesh.dataLength; d++)
   {
-  msgB+="("+(2*halfW*bb.get(3*d+0))+","+(2*halfH*bb.get(3*d+1))+","+(bb.get(3*d+2))+")";
+  msgB+="("+(2*halfW*bb.get(3*d+0))+","+(2*halfH*bb.get(3*d+1))+","+(2*halfZ*bb.get(3*d+2))+")";
   }
 android.util.Log.d( "Feedback", msgB);
 
@@ -392,12 +410,14 @@ GLES30.glUnmapBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER);
     /// END DEBUG ///////
 
 GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
-GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 1, 0);
 
-    surface.setAsOutput(currTime);
+
+
+
+    mMainProgram.useProgram();
     GLES30.glUniform1i(mMainTextureH, 0);
-    mM.sendZero();
-    mV.sendZero();
+    mM.sendFeedback(MAIN_PROGRAM,surface,halfW,halfH,halfZ);
+    mV.sendZero(MAIN_PROGRAM);
     mF.send(halfW,halfH);
 
     GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mPosTBO[0]);
diff --git a/src/main/java/org/distorted/library/EffectQueueMatrix.java b/src/main/java/org/distorted/library/EffectQueueMatrix.java
index 8842aa7..7263502 100644
--- a/src/main/java/org/distorted/library/EffectQueueMatrix.java
+++ b/src/main/java/org/distorted/library/EffectQueueMatrix.java
@@ -46,9 +46,9 @@ class EffectQueueMatrix extends EffectQueue
   private static float[] mTmpMatrix = new float[16];
   private static float[] mViewMatrix= new float[16];
 
-  private static int mObjDH;
-  private static int mMVPMatrixH;
-  private static int mMVMatrixH;
+  private static int[] mObjDH       = new int[DistortedEffects.NUM_PROGRAMS];
+  private static int[] mMVPMatrixH  = new int[DistortedEffects.NUM_PROGRAMS];
+  private static int[] mMVMatrixH   = new int[DistortedEffects.NUM_PROGRAMS];
   
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
@@ -191,11 +191,11 @@ class EffectQueueMatrix extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static void getUniforms(int mProgramH)
+  static void getUniforms(int index,int mProgramH)
     {
-    mObjDH     = GLES30.glGetUniformLocation(mProgramH, "u_objD");
-    mMVPMatrixH= GLES30.glGetUniformLocation(mProgramH, "u_MVPMatrix");
-    mMVMatrixH = GLES30.glGetUniformLocation(mProgramH, "u_MVMatrix");
+    mObjDH[index]     = GLES30.glGetUniformLocation(mProgramH, "u_objD");
+    mMVPMatrixH[index]= GLES30.glGetUniformLocation(mProgramH, "u_MVPMatrix");
+    mMVMatrixH[index] = GLES30.glGetUniformLocation(mProgramH, "u_MVMatrix");
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -259,23 +259,24 @@ class EffectQueueMatrix extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  synchronized void send(DistortedOutputSurface projection, float halfX, float halfY, float halfZ)
+  synchronized void send(int index,DistortedOutputSurface projection, float halfX, float halfY, float halfZ)
     {
     constructMatrices(projection,halfX,halfY,halfZ);
 
-    GLES30.glUniform3f( mObjDH , halfX, halfY, halfZ);
-    GLES30.glUniformMatrix4fv(mMVMatrixH , 1, false, mViewMatrix, 0);
-    GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
+    GLES30.glUniform3f( mObjDH[index] , halfX, halfY, halfZ);
+    GLES30.glUniformMatrix4fv(mMVMatrixH[index] , 1, false, mViewMatrix, 0);
+    GLES30.glUniformMatrix4fv(mMVPMatrixH[index], 1, false, mMVPMatrix , 0);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  synchronized void sendZero()
+  synchronized void sendFeedback(int index,DistortedOutputSurface projection, float halfX, float halfY, float halfZ)
     {
-    Matrix.setIdentityM(mTmpMatrix, 0);
-    GLES30.glUniform3f( mObjDH , 0.5f, 0.5f, 0.5f);
-    GLES30.glUniformMatrix4fv(mMVMatrixH , 1, false, mTmpMatrix , 0);
-    GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
+    constructMatrices(projection,halfX,halfY,halfZ);
+
+    GLES30.glUniform3f( mObjDH[index] , 0.5f, 0.5f, 0.5f);
+    GLES30.glUniformMatrix4fv(mMVMatrixH[index] , 1, false, mViewMatrix, 0);
+    GLES30.glUniformMatrix4fv(mMVPMatrixH[index], 1, false, mMVPMatrix , 0);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/EffectQueueVertex.java b/src/main/java/org/distorted/library/EffectQueueVertex.java
index f8d530e..9f2f8b9 100644
--- a/src/main/java/org/distorted/library/EffectQueueVertex.java
+++ b/src/main/java/org/distorted/library/EffectQueueVertex.java
@@ -45,9 +45,9 @@ class EffectQueueVertex extends EffectQueue
   private static final int NUM_UNIFORMS = 12;
   private static final int NUM_CACHE    =  3;
   private static final int INDEX = EffectTypes.VERTEX.ordinal();
-  private static int mNumEffectsH;
-  private static int mTypeH;
-  private static int mUniformsH;
+  private static int[] mNumEffectsH = new int[DistortedEffects.NUM_PROGRAMS];
+  private static int[] mTypeH       = new int[DistortedEffects.NUM_PROGRAMS];
+  private static int[] mUniformsH   = new int[DistortedEffects.NUM_PROGRAMS];
   
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
@@ -58,11 +58,11 @@ class EffectQueueVertex extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static void getUniforms(int mProgramH)
+  static void getUniforms(int index, int mProgramH)
     {
-    mNumEffectsH= GLES30.glGetUniformLocation( mProgramH, "vNumEffects");
-    mTypeH      = GLES30.glGetUniformLocation( mProgramH, "vType");
-    mUniformsH  = GLES30.glGetUniformLocation( mProgramH, "vUniforms");
+    mNumEffectsH[index]= GLES30.glGetUniformLocation( mProgramH, "vNumEffects");
+    mTypeH[index]      = GLES30.glGetUniformLocation( mProgramH, "vType");
+    mUniformsH[index]  = GLES30.glGetUniformLocation( mProgramH, "vUniforms");
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -133,9 +133,9 @@ class EffectQueueVertex extends EffectQueue
    
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  synchronized void send(float halfX, float halfY, float halfZ)
+  synchronized void send(int index, float halfX, float halfY, float halfZ)
     {
-    GLES30.glUniform1i( mNumEffectsH, mNumEffects);
+    GLES30.glUniform1i( mNumEffectsH[index], mNumEffects);
       
     if( mNumEffects>0 )
       {
@@ -146,16 +146,16 @@ class EffectQueueVertex extends EffectQueue
         mUniforms[NUM_UNIFORMS*i+7] = mCache[NUM_CACHE*i+2]-halfZ;
         }
 
-      GLES30.glUniform1iv( mTypeH    ,                 mNumEffects, mName    ,0);
-      GLES30.glUniform4fv( mUniformsH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
+      GLES30.glUniform1iv( mTypeH[index]    ,                 mNumEffects, mName    ,0);
+      GLES30.glUniform4fv( mUniformsH[index],(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
       }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  synchronized void sendZero()
+  synchronized void sendZero(int index)
     {
-    GLES30.glUniform1i( mNumEffectsH, 0);
+    GLES30.glUniform1i( mNumEffectsH[index], 0);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/MeshObject.java b/src/main/java/org/distorted/library/MeshObject.java
index 4ad372b..397f009 100644
--- a/src/main/java/org/distorted/library/MeshObject.java
+++ b/src/main/java/org/distorted/library/MeshObject.java
@@ -45,7 +45,6 @@ public abstract class MeshObject extends DistortedObject
    int[] mTexVBO = new int[1];
 
    int[] mPosTBO = new int[1]; // Transform Feedback
-   int[] mNorTBO = 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,7 +83,7 @@ public abstract class MeshObject extends DistortedObject
        {
        GLES30.glGenBuffers(1, mTexVBO, 0);
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mTexVBO[0]);
-       GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, dataLength*     TEX_DATA_SIZE*BYTES_PER_FLOAT, mMeshTexture  , GLES30.GL_STATIC_DRAW);
+       GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, dataLength*    TEX_DATA_SIZE*BYTES_PER_FLOAT, mMeshTexture  , GLES30.GL_STATIC_DRAW);
        }
 
      if( mPosTBO[0]<0 )
@@ -93,12 +92,6 @@ public abstract class MeshObject extends DistortedObject
        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);
        }
-     if( mNorTBO[0]<0 )
-       {
-       GLES30.glBindBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, mNorTBO[0]);
-       GLES30.glBufferData(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, dataLength*  NORMAL_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);
      }
@@ -128,11 +121,6 @@ public abstract class MeshObject extends DistortedObject
        GLES30.glDeleteBuffers(1, mPosTBO, 0);
        mPosTBO[0] = -1;
        }
-     if( mNorTBO[0]>=0 )
-       {
-       GLES30.glDeleteBuffers(1, mNorTBO, 0);
-       mNorTBO[0] = -1;
-       }
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -143,7 +131,6 @@ public abstract class MeshObject extends DistortedObject
      mNorVBO[0] = -1;
      mTexVBO[0] = -1;
      mPosTBO[0] = -1;
-     mNorTBO[0] = -1;
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/program/DistortedProgram.java b/src/main/java/org/distorted/library/program/DistortedProgram.java
index 8bc8dff..76d16a9 100644
--- a/src/main/java/org/distorted/library/program/DistortedProgram.java
+++ b/src/main/java/org/distorted/library/program/DistortedProgram.java
@@ -58,7 +58,7 @@ public class DistortedProgram
 
       if( feedbackVaryings!=null )
         {
-        GLES30.glTransformFeedbackVaryings(programHandle, feedbackVaryings, GLES30.GL_SEPARATE_ATTRIBS);
+        GLES30.glTransformFeedbackVaryings(programHandle, feedbackVaryings, GLES30.GL_INTERLEAVED_ATTRIBS);
         }
 
       if (attributes != null)
diff --git a/src/main/res/raw/main_vertex_shader.glsl b/src/main/res/raw/main_vertex_shader.glsl
index 6c38222..1b53e0b 100644
--- a/src/main/res/raw/main_vertex_shader.glsl
+++ b/src/main/res/raw/main_vertex_shader.glsl
@@ -554,9 +554,9 @@ void main()
     j+=3;
     }
 #endif
-
-  v_Normal        = normalize(vec3(u_MVMatrix*vec4(n,0.0)));
+   
   v_Position      = v;
   v_TexCoordinate = a_TexCoordinate;
+  v_Normal        = normalize(vec3(u_MVMatrix*vec4(n,0.0)));
   gl_Position     = u_MVPMatrix*vec4(v,1.0);
   }                               
