commit 1d6d261e183b19c186e51d306c78c8ae841ce3de
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Wed May 24 14:02:35 2017 +0100

    Move to a new way to detecting depth of postprocessing halos.
    This switches off stenciling (hopefully temporarily!)

diff --git a/src/main/java/org/distorted/library/DistortedNode.java b/src/main/java/org/distorted/library/DistortedNode.java
index 3393a96..dc1295c 100644
--- a/src/main/java/org/distorted/library/DistortedNode.java
+++ b/src/main/java/org/distorted/library/DistortedNode.java
@@ -272,14 +272,14 @@ public class DistortedNode implements DistortedSlave
       float h = mSurface.getHeight()/2.0f;
 
       // Actually draw our object.
-      buffer1.setAsOutput(currTime);
+      buffer1.setAsOutput();
       mState.apply();
       mEffects.drawPriv(w, h, mMesh, buffer1, currTime, 0);
 
       // Mark area of our object + marginInPixels pixels around with 1s in Stencil buffer
-      buffer2.setAsOutput(currTime);
+      //buffer2.setAsOutput();
       DistortedRenderState.setUpStencilMark();
-      mEffects.drawPriv(w, h, mMesh, buffer2, currTime, effects.getHalo()*buffer2.mMipmap);
+      mEffects.drawPriv(w, h, mMesh, buffer1, currTime, effects.getHalo()*buffer1.mMipmap);
       DistortedRenderState.unsetUpStencilMark();
 
       return 1;
diff --git a/src/main/java/org/distorted/library/DistortedOutputSurface.java b/src/main/java/org/distorted/library/DistortedOutputSurface.java
index 48d42b5..25f725d 100644
--- a/src/main/java/org/distorted/library/DistortedOutputSurface.java
+++ b/src/main/java/org/distorted/library/DistortedOutputSurface.java
@@ -156,6 +156,39 @@ abstract class DistortedOutputSurface extends DistortedSurface implements Distor
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void createBuffers()
+    {
+    float mipmap=1.0f;
+
+    for(int j=0; j<EffectQuality.LENGTH; j++)
+      {
+      mBuffer1[j] = new DistortedFramebuffer(1,BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
+      mBuffer2[j] = new DistortedFramebuffer(1,BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
+      mBuffer1[j].mMipmap = mipmap;
+      mBuffer2[j].mMipmap = mipmap;
+      mipmap *= EffectQuality.MULTIPLIER;
+      }
+
+    DistortedObject.toDo(); // create the FBOs immediately. This is safe as we must be holding the OpenGL context now.
+
+    GLES30.glStencilMask(0xff);
+    GLES30.glDepthMask(true);
+    GLES30.glColorMask(true,true,true,true);
+    GLES30.glClearColor(0.0f,0.0f,0.0f,0.0f);
+    GLES30.glClearDepthf(1.0f);
+    GLES30.glClearStencil(0);
+
+    for(int j=0; j<EffectQuality.LENGTH; j++)
+      {
+      mBuffer1[j].setAsOutput();
+      GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT|GLES30.GL_STENCIL_BUFFER_BIT);
+      mBuffer2[j].setAsOutput();
+      GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT|GLES30.GL_STENCIL_BUFFER_BIT);
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // Render all children, one by one. If there are no postprocessing effects, just render to THIS.
 // Otherwise, render to a buffer and on each change of Postprocessing Bucket, apply the postprocessing
@@ -174,38 +207,14 @@ abstract class DistortedOutputSurface extends DistortedSurface implements Distor
       currP = child.getEffectsPostprocess();
       currB = currP==null ? 0 : currP.getBucket();
 
-      if( lastB!=currB && lastB!=0 )
-        {
-        numRenders += lastP.postprocess(time,this);
-        }
+      if( lastB!=currB && lastB!=0 ) numRenders += lastP.postprocess(time,this);
 
-      if( currB==0 )
-        {
-        numRenders += child.draw(time,this);
-        }
+      if( currB==0 ) numRenders += child.draw(time,this);
       else
         {
-        if( mBuffer1[0]==null )
-          {
-          float mipmap=1.0f;
-
-          for(int j=0; j<EffectQuality.LENGTH; j++)
-            {
-            mBuffer1[j] = new DistortedFramebuffer(1,BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
-            mBuffer2[j] = new DistortedFramebuffer(1,BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
-            mBuffer1[j].mMipmap = mipmap;
-            mBuffer2[j].mMipmap = mipmap;
-            mipmap *= EffectQuality.MULTIPLIER;
-            }
-          DistortedObject.toDo(); // create the FBOs immediately. This is safe as we must be holding the OpenGL context now.
-          }
-
+        if( mBuffer1[0]==null ) createBuffers();
         numRenders += child.markStencilAndDraw(time,this,currP);
-
-        if( i==num-1 )
-          {
-          numRenders += currP.postprocess(time,this);
-          }
+        if( i==num-1 ) numRenders += currP.postprocess(time,this);
         }
 
       lastP = currP;
@@ -222,6 +231,13 @@ abstract class DistortedOutputSurface extends DistortedSurface implements Distor
     mJobs.add(new Job(t,n,d));
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void setAsOutput()
+    {
+    GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, mFBOH[0]);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/DistortedRenderState.java b/src/main/java/org/distorted/library/DistortedRenderState.java
index dc84d88..ede3a1e 100644
--- a/src/main/java/org/distorted/library/DistortedRenderState.java
+++ b/src/main/java/org/distorted/library/DistortedRenderState.java
@@ -143,6 +143,29 @@ class DistortedRenderState
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static void switchOffDepthWriting()
+    {
+    if( cState.depthMask!=0 )
+      {
+      sState.depthMask = cState.depthMask;
+      cState.depthMask = 0;
+      GLES30.glDepthMask(false);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static void restoreDepthWriting()
+    {
+    if( sState.depthMask!=cState.depthMask )
+      {
+      cState.depthMask = sState.depthMask;
+      GLES30.glDepthMask(cState.depthMask==1);
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   static void switchOffDrawing()
@@ -204,12 +227,12 @@ class DistortedRenderState
       //android.util.Log.d("State", "switch off color writing");
       GLES30.glColorMask(false,false,false,false);
       }
-    if( cState.depthMask!=0 )
+    if( cState.depthMask!=1 )
       {
       sState.depthMask = cState.depthMask;
-      cState.depthMask = 0;
-      //android.util.Log.d("State", "switch off depth writing");
-      GLES30.glDepthMask(false);
+      cState.depthMask = 1;
+      //android.util.Log.d("State", "switch on depth writing");
+      GLES30.glDepthMask(true);
       }
     if( cState.stencilMask!= STENCIL_MASK )
       {
diff --git a/src/main/java/org/distorted/library/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/EffectQueuePostprocess.java
index 3f74ec5..dcf2912 100644
--- a/src/main/java/org/distorted/library/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/EffectQueuePostprocess.java
@@ -291,7 +291,7 @@ class EffectQueuePostprocess extends EffectQueue
       GLES30.glViewport(0, 0, (int)w1, (int)h1);
       mBlur1Program.useProgram();
       buffer1.setAsInput();
-      buffer2.setAsOutput(time);
+      buffer2.setAsOutput();
 
       GLES30.glUniform1fv( mWeights1H, radius+1, weightsCache,offset);
       GLES30.glUniform1i( mRadius1H, radius);
@@ -302,9 +302,11 @@ class EffectQueuePostprocess extends EffectQueue
       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();
+      //DistortedRenderState.switchOffDepthWriting();
+      //DistortedRenderState.useStencilMark();
       GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
-      DistortedRenderState.unuseStencilMark();
+      //DistortedRenderState.unuseStencilMark();
+      //DistortedRenderState.restoreDepthWriting();
 
       // vertical blur
       GLES30.glViewport(0, 0, (int)w2, (int)h2);
@@ -324,11 +326,18 @@ class EffectQueuePostprocess extends EffectQueue
       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
-      buffer2.setAsOutput(time);
+      // after each postprocess, clear buffers
       GLES30.glStencilMask(0xff);
+      GLES30.glDepthMask(true);
+      GLES30.glColorMask(true,true,true,true);
+      GLES30.glClearColor(0.0f,0.0f,0.0f,0.0f);
+      GLES30.glClearDepthf(1.0f);
       GLES30.glClearStencil(0);
-      GLES30.glClear(GLES30.GL_STENCIL_BUFFER_BIT);
+
+      buffer1.setAsOutput();
+      GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT);//|GLES30.GL_STENCIL_BUFFER_BIT);
+      buffer2.setAsOutput();
+      GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
       }
 
     return mNumEffects;
diff --git a/src/main/res/raw/blur2_fragment_shader.glsl b/src/main/res/raw/blur2_fragment_shader.glsl
index 0717552..9138d6c 100644
--- a/src/main/res/raw/blur2_fragment_shader.glsl
+++ b/src/main/res/raw/blur2_fragment_shader.glsl
@@ -40,19 +40,7 @@ uniform int u_Radius;
 
 void main()
   {
-  float depth = TEXTURE(u_DepthTexture,v_TexCoordinate).r;
-
-  if( u_Radius>1 )
-    {
-    float offset = u_Offsets[u_Radius];
-
-    depth = min(depth, TEXTURE(u_DepthTexture,vec2(v_TexCoordinate.x,v_TexCoordinate.y+offset)).r);
-    depth = min(depth, TEXTURE(u_DepthTexture,vec2(v_TexCoordinate.x,v_TexCoordinate.y-offset)).r);
-    depth = min(depth, TEXTURE(u_DepthTexture,vec2(v_TexCoordinate.x+offset,v_TexCoordinate.y)).r);
-    depth = min(depth, TEXTURE(u_DepthTexture,vec2(v_TexCoordinate.x-offset,v_TexCoordinate.y)).r);
-    }
-
-  gl_FragDepth = depth;
+  gl_FragDepth = TEXTURE(u_DepthTexture,v_TexCoordinate).r;
 
   vec4 pixel= TEXTURE(u_ColorTexture,v_TexCoordinate) * u_Weights[0];
 
