commit b3120b1b1f9be3f17b4c78fdfcfe4897aee213bd
Author: leszek <leszek@koltunski.pl>
Date:   Sat May 20 22:43:13 2017 +0100

    Progress with Stencil in Postprocessing (doesn't work still)

diff --git a/src/main/java/org/distorted/library/DistortedEffects.java b/src/main/java/org/distorted/library/DistortedEffects.java
index fb43385..413a273 100644
--- a/src/main/java/org/distorted/library/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/DistortedEffects.java
@@ -256,7 +256,6 @@ public class DistortedEffects
     GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
 
     mMainProgram.useProgram();
-    surface.setAsOutput(currTime);
     GLES30.glUniform1i(mMainTextureH, 0);
 
     if( Distorted.GLSL >= 300 )
diff --git a/src/main/java/org/distorted/library/DistortedNode.java b/src/main/java/org/distorted/library/DistortedNode.java
index 38bdf11..0a71838 100644
--- a/src/main/java/org/distorted/library/DistortedNode.java
+++ b/src/main/java/org/distorted/library/DistortedNode.java
@@ -265,6 +265,8 @@ public class DistortedNode implements DistortedSlave
 
     if( input.setAsInput() )
       {
+      surface.setAsOutput(currTime);
+
       // Mark area of our object + marginInPixels pixels around with 1s in Stencil buffer
       DistortedRenderState.setUpStencilMark();
       mEffects.drawPriv(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime, marginInPixels);
@@ -286,6 +288,7 @@ public class DistortedNode implements DistortedSlave
 
     if( input.setAsInput() )
       {
+      surface.setAsOutput(currTime);
       mState.apply();
       mEffects.drawPriv(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime, 0);
       return 1;
diff --git a/src/main/java/org/distorted/library/DistortedOutputSurface.java b/src/main/java/org/distorted/library/DistortedOutputSurface.java
index 31f922c..bacfb35 100644
--- a/src/main/java/org/distorted/library/DistortedOutputSurface.java
+++ b/src/main/java/org/distorted/library/DistortedOutputSurface.java
@@ -194,13 +194,12 @@ abstract class DistortedOutputSurface extends DistortedSurface implements Distor
             mBuffer1[j] = new DistortedFramebuffer(mDepthStencil      ,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
             mBuffer2[j] = new DistortedFramebuffer(NO_DEPTH_NO_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
             mBuffer1[j].mMipmap = mipmap;
-            mBuffer1[j].glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT|GLES30.GL_STENCIL_BUFFER_BIT);
             mipmap *= EffectQuality.MULTIPLIER;
             }
           DistortedObject.toDo(); // create the FBOs immediately. This is safe as we must be holding the OpenGL context now.
           }
 
-        numRenders += child.markStencilAndDraw(time,mBuffer1[currP.getQuality()],20);
+        numRenders += child.markStencilAndDraw(time,mBuffer1[currP.getQuality()],50);
 
         if( i==num-1 )
           {
diff --git a/src/main/java/org/distorted/library/DistortedRenderState.java b/src/main/java/org/distorted/library/DistortedRenderState.java
index 37311ab..48e35ee 100644
--- a/src/main/java/org/distorted/library/DistortedRenderState.java
+++ b/src/main/java/org/distorted/library/DistortedRenderState.java
@@ -166,6 +166,7 @@ class DistortedRenderState
     if( sStencilTest!=1 )
       {
       sStencilTest = 1;
+      //android.util.Log.d("State", "stencil test on");
       GLES30.glEnable(GLES30.GL_STENCIL_TEST);
       }
     if( sStencilFuncFunc!=GLES30.GL_ALWAYS || sStencilFuncRef!=1 || sStencilFuncMask!=STENCIL_MASK )
@@ -173,6 +174,7 @@ class DistortedRenderState
       sStencilFuncFunc = GLES30.GL_ALWAYS;
       sStencilFuncRef  = 1;
       sStencilFuncMask = STENCIL_MASK;
+      //android.util.Log.d("State", "stencil func on");
       GLES30.glStencilFunc(sStencilFuncFunc,sStencilFuncRef,sStencilFuncMask);
       }
     if( sStencilOpSfail!=GLES30.GL_KEEP || sStencilOpDpfail!=GLES30.GL_KEEP || sStencilOpDppass!=GLES30.GL_REPLACE )
@@ -180,6 +182,7 @@ class DistortedRenderState
       sStencilOpSfail = GLES30.GL_KEEP;
       sStencilOpDpfail= GLES30.GL_KEEP;
       sStencilOpDppass= GLES30.GL_REPLACE;
+      //android.util.Log.d("State", "stencil op on");
       GLES30.glStencilOp(sStencilOpSfail,sStencilOpDpfail,sStencilOpDppass);
       }
     if( sColorMaskR!=0 || sColorMaskG!=0 || sColorMaskB!=0 || sColorMaskA!=0 )
@@ -188,16 +191,19 @@ class DistortedRenderState
       sColorMaskG = 0;
       sColorMaskB = 0;
       sColorMaskA = 0;
+      //android.util.Log.d("State", "switch off color writing");
       GLES30.glColorMask(false,false,false,false);
       }
     if( sDepthMask!=0 )
       {
       sDepthMask = 0;
+      //android.util.Log.d("State", "switch off depth writing");
       GLES30.glDepthMask(false);
       }
     if( sStencilMask!= STENCIL_MASK )
       {
       sStencilMask = STENCIL_MASK;
+      //android.util.Log.d("State", "stencil mask on");
       GLES30.glStencilMask(sStencilMask);
       }
     }
@@ -234,7 +240,7 @@ class DistortedRenderState
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static void restoreStencilMark()
+  static void unuseStencilMark()
     {
     if( rStencilTest!=sStencilTest )
       {
diff --git a/src/main/java/org/distorted/library/EffectQueueMatrix.java b/src/main/java/org/distorted/library/EffectQueueMatrix.java
index f6780d1..db0c0aa 100644
--- a/src/main/java/org/distorted/library/EffectQueueMatrix.java
+++ b/src/main/java/org/distorted/library/EffectQueueMatrix.java
@@ -197,7 +197,7 @@ class EffectQueueMatrix extends EffectQueue
 
     scale = 1.0f + marginInPixels/( xlen>ylen ? ylen:xlen );
 
-   // android.util.Log.d("scale", "scale= "+scale+" xlen="+xlen+" ylen="+ylen);
+    //android.util.Log.d("scale", ""+marginInPixels+" scale= "+scale+" xlen="+xlen+" ylen="+ylen);
 
     Matrix.scaleM(mViewMatrix, 0, scale, scale, scale);
     }
diff --git a/src/main/java/org/distorted/library/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/EffectQueuePostprocess.java
index 724fa4b..a508420 100644
--- a/src/main/java/org/distorted/library/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/EffectQueuePostprocess.java
@@ -294,7 +294,10 @@ class EffectQueuePostprocess extends EffectQueue
       GLES30.glUniform1fv( mOffsets1H ,radius+1, mOffsets,0);
       GLES30.glVertexAttribPointer(mBlur1Program.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
       GLES30.glVertexAttribPointer(mBlur1Program.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
+
+      DistortedRenderState.useStencilMark();
       GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+      DistortedRenderState.unuseStencilMark();
 
       // vertical blur
       GLES30.glViewport(0, 0, (int)w2, (int)h2);
@@ -313,6 +316,10 @@ class EffectQueuePostprocess extends EffectQueue
       GLES30.glVertexAttribPointer(mBlur2Program.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
       GLES30.glVertexAttribPointer(mBlur2Program.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
       GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
+
+      // after each postprocess, clear the STENCIL
+      buffer1.setAsOutput(time);
+      GLES30.glClear(GLES30.GL_STENCIL_BUFFER_BIT);
       }
 
     return mNumEffects;
