commit 1c67457ff3d3f2af9f288e2f218de51ddb17c9ac
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Tue Jan 24 15:27:46 2017 +0000

    Separable Box blur fully works now!

diff --git a/src/main/java/org/distorted/library/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/EffectQueuePostprocess.java
index a530df1..64107d6 100644
--- a/src/main/java/org/distorted/library/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/EffectQueuePostprocess.java
@@ -21,6 +21,7 @@ package org.distorted.library;
 
 import android.content.res.Resources;
 import android.opengl.GLES30;
+import android.opengl.Matrix;
 
 import org.distorted.library.message.EffectMessage;
 import org.distorted.library.program.DistortedProgram;
@@ -51,26 +52,28 @@ class EffectQueuePostprocess extends EffectQueue
   private static final int NUM_CACHE    = 0;
   private static final int INDEX = EffectTypes.POSTPROCESS.ordinal();
 
-  private static final FloatBuffer mQuadPositions, mQuadTexture1, mQuadTexture2;
+  private static final FloatBuffer mQuadPositions, mQuadTextureNor, mQuadTextureInv;
 
   static
     {
     int dataLength      = 4;
     int bytes_per_float = 4;
 
-    float[] positionData= { -0.5f, -0.5f,  -0.5f, 0.5f,  0.5f,-0.5f,  0.5f, 0.5f };
-    float[] textureData1= {  0.0f,  0.0f,   0.0f, 1.0f,  1.0f, 0.0f,  1.0f, 1.0f };
-    float[] textureData2= {  0.0f,  0.0f,   1.0f, 0.0f,  0.0f, 1.0f,  1.0f, 1.0f };
+    float[] position  = { -0.5f, -0.5f,  -0.5f, 0.5f,  0.5f,-0.5f,  0.5f, 0.5f };
+    float[] textureNor= {  0.0f,  0.0f,   0.0f, 1.0f,  1.0f, 0.0f,  1.0f, 1.0f };
+    float[] textureInv= {  0.0f,  0.0f,   1.0f, 0.0f,  0.0f, 1.0f,  1.0f, 1.0f };
 
     mQuadPositions = ByteBuffer.allocateDirect(POSITION_DATA_SIZE*dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
-    mQuadPositions.put(positionData).position(0);
-    mQuadTexture1  = ByteBuffer.allocateDirect(TEX_DATA_SIZE     *dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
-    mQuadTexture1.put(textureData1).position(0);
-    mQuadTexture2  = ByteBuffer.allocateDirect(TEX_DATA_SIZE     *dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
-    mQuadTexture2.put(textureData2).position(0);
+    mQuadPositions.put(position).position(0);
+    mQuadTextureNor  = ByteBuffer.allocateDirect(TEX_DATA_SIZE     *dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
+    mQuadTextureNor.put(textureNor).position(0);
+    mQuadTextureInv  = ByteBuffer.allocateDirect(TEX_DATA_SIZE     *dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
+    mQuadTextureInv.put(textureInv).position(0);
     }
 
   private static DistortedFramebuffer mBufferFBO = new DistortedFramebuffer(1,1);
+  private static float[] mMVPMatrix = new float[16];
+  private static float[] mTmpMatrix = new float[16];
 
   // BLUR effect
   private static DistortedProgram mBlurProgram;
@@ -151,7 +154,7 @@ class EffectQueuePostprocess extends EffectQueue
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// w,h - width and height of hte input texture. MVP - Model-View-Projection matrix to apply to the
+// w,h - width and height of the input texture. MVP - Model-View-Projection matrix to apply to the
 // texture; df - output FBO.
 
   synchronized void render(float w, float h, float[] mvp, DistortedFramebuffer df)
@@ -169,24 +172,31 @@ class EffectQueuePostprocess extends EffectQueue
     GLES30.glUniform1fv( mWeightsH, radius+1, mWeights,0);
     GLES30.glUniform1i( mRadiusH, radius);
     GLES30.glUniform2f( mObjDH , w, h );
-    GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mvp , 0);
 
-    mBufferFBO.resizeFast(df.mWidth, df.mHeight);
+    mBufferFBO.resizeFast( (int)w, (int)h);
     mBufferFBO.setAsOutput();
+    GLES30.glViewport(0, 0, (int)w, (int)h);
+
+    Matrix.setIdentityM(mTmpMatrix, 0);
+    Matrix.translateM(mTmpMatrix, 0, 0, 0, -mBufferFBO.mDistance);
+    Matrix.multiplyMM(mMVPMatrix, 0, mBufferFBO.mProjectionMatrix, 0, mTmpMatrix, 0);
 
     // horizontal blur
     GLES30.glUniform1f( mStepH , 1/h );
+    GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
     GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
-    GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, mQuadTexture2);
+    GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, mQuadTextureInv);
     GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
 
     mBufferFBO.setAsInput();
     df.setAsOutput();
+    GLES30.glViewport(0, 0, df.mWidth, df.mHeight);
 
     // vertical blur
     GLES30.glUniform1f( mStepH , 1/w );
+    GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mvp , 0);
     GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
-    GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, mQuadTexture2);
+    GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, mQuadTextureInv);
     GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
     }
 
