commit 7266d8ef25cccbe3b43fc86f2a92933c9a39e593
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Fri Jun 30 15:35:28 2017 +0100

    Fix quality levels in Glow.

diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffect.java b/src/main/java/org/distorted/library/effect/PostprocessEffect.java
index bfcda78..214b2f0 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffect.java
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffect.java
@@ -149,6 +149,17 @@ public abstract class PostprocessEffect extends Effect implements DistortedMaste
  */
   public abstract int getQuality();
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Only for use by the library itself.
+ *
+ * @y.exclude
+ */
+  public int getInternalQuality()
+    {
+    return mQualityLevel;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * This is not really part of the public API. Has to be public only because it is a part of the
diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java b/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java
index b161541..ac335dd 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java
@@ -22,6 +22,7 @@ package org.distorted.library.effect;
 import android.opengl.GLES30;
 
 import org.distorted.library.main.DistortedFramebuffer;
+import org.distorted.library.main.DistortedRenderState;
 import org.distorted.library.program.DistortedProgram;
 import org.distorted.library.type.Data1D;
 
@@ -146,6 +147,8 @@ public class PostprocessEffectBlur extends PostprocessEffect
       mProgram2 = mPrograms.get(mIndex2);
       }
 
+    DistortedRenderState.useStencilMark();
+
     DistortedFramebuffer buffer = buffers[mQualityLevel];
 
     buffer.setAsOutput();
@@ -198,6 +201,8 @@ public class PostprocessEffectBlur extends PostprocessEffect
     GLES30.glVertexAttribPointer(mProgram2.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
     GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
 
+    DistortedRenderState.unuseStencilMark();
+
     return 2;
     }
 
diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java b/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java
index 41a99f4..48459c0 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java
@@ -21,7 +21,9 @@ package org.distorted.library.effect;
 
 import android.opengl.GLES30;
 
+import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedFramebuffer;
+import org.distorted.library.main.DistortedRenderState;
 import org.distorted.library.program.DistortedProgram;
 import org.distorted.library.type.Data1D;
 import org.distorted.library.type.Data4D;
@@ -149,8 +151,10 @@ public class PostprocessEffectGlow extends PostprocessEffect
       mProgram2 = mPrograms.get(mIndex2);
       }
 
+    DistortedRenderState.useStencilMark();
+
     DistortedFramebuffer  inBuffer = buffers[0];
-    DistortedFramebuffer outBuffer = buffers[1];
+    DistortedFramebuffer outBuffer = buffers[mQualityLevel];
 
     float w1  = outBuffer.getWidth();
     float h1  = outBuffer.getHeight();
@@ -165,14 +169,14 @@ public class PostprocessEffectGlow extends PostprocessEffect
     int offset = radius + radius*radius/4;
     radius = (radius+1)/2;
 
+    outBuffer.setAsOutput();
     GLES30.glViewport(0, 0, (int)w1, (int)h1);
 
     // horizontal glow
     for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/w1;
 
     mProgram1.useProgram();
-    outBuffer.setAsOutput();
-    outBuffer.bindForOutput(0);
+    outBuffer.bindForOutput(1);
     inBuffer.setAsInput(0);
 
     GLES30.glUniform1f ( mProgram1.mUniform[0] , near);
@@ -184,15 +188,12 @@ public class PostprocessEffectGlow extends PostprocessEffect
     GLES30.glVertexAttribPointer(mProgram1.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
     GLES30.glVertexAttribPointer(mProgram1.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
     GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
-/*
-    GLES30.glViewport(0, 0, (int)w2, (int)h2);
 
     // vertical glow
     for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/h1;
 
     mProgram2.useProgram();
-    inBuffer.setAsOutput();
-    inBuffer.bindForOutput(0);
+    outBuffer.bindForOutput(0);
     outBuffer.setAsInput(1);
 
     GLES30.glUniform1f ( mProgram2.mUniform[0] , near);
@@ -204,7 +205,18 @@ public class PostprocessEffectGlow extends PostprocessEffect
     GLES30.glVertexAttribPointer(mProgram2.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
     GLES30.glVertexAttribPointer(mProgram2.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
     GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
-*/
+
+    DistortedRenderState.unuseStencilMark();
+
+    // blit back to inBuffer if we have to
+    if( mQualityLevel>0 )
+      {
+      inBuffer.setAsOutput();
+      outBuffer.setAsInput(0);
+      DistortedEffects.blitPriv(inBuffer);
+      return 3;
+      }
+
     return 2;
     }
 
diff --git a/src/main/java/org/distorted/library/main/DistortedEffects.java b/src/main/java/org/distorted/library/main/DistortedEffects.java
index 0a60dc6..167e6c9 100644
--- a/src/main/java/org/distorted/library/main/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/main/DistortedEffects.java
@@ -250,6 +250,13 @@ public class DistortedEffects
     return mP.getQuality();
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getInternalQuality()
+    {
+    return mP.getInternalQuality();
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getHalo()
@@ -332,8 +339,12 @@ public class DistortedEffects
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-   
-  static void blitPriv(DistortedOutputSurface surface)
+/**
+ * Only for use by the library itself.
+ *
+ * @y.exclude
+ */
+  public static void blitPriv(DistortedOutputSurface surface)
     {
     mBlitProgram.useProgram();
 
diff --git a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
index 0469a79..3435e61 100644
--- a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
+++ b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
@@ -251,7 +251,7 @@ private String sLast="", sCurr="";
 
   int renderChildren(long time, int numChildren, ArrayList<DistortedNode> children)
     {
-    int quality=0, numRenders = 0, bucketChange = 0;
+    int quality=0, internalQuality = 0, numRenders = 0, bucketChange = 0;
     DistortedNode child1, child2;
     DistortedEffects lastEffects=null, currEffects;
     long lastBucket=0, currBucket;
@@ -278,13 +278,14 @@ sCurr += (" "+currBucket);
             for(int j=bucketChange; j<i; j++)
               {
               child2 = children.get(j);
-              numRenders += child2.markStencilAndDepth(time,mBuffer[quality],lastEffects);
+              numRenders += child2.markStencilAndDepth(time,mBuffer[internalQuality],lastEffects);
               }
 
             numRenders += lastEffects.postprocess(this);
             numRenders += blitWithDepth(time, mBuffer[quality]);
             }
 
+          internalQuality = currEffects.getInternalQuality();
           quality = currEffects.getQuality();
           bucketChange = i;
           }
@@ -296,11 +297,11 @@ sCurr += (" "+currBucket);
           for(int j=bucketChange; j<numChildren; j++)
             {
             child2 = children.get(j);
-            numRenders += child2.markStencilAndDepth(time,mBuffer[quality],currEffects);
+            numRenders += child2.markStencilAndDepth(time,mBuffer[internalQuality],currEffects);
             }
 
           numRenders += currEffects.postprocess(this);
-          numRenders += blitWithDepth(time, mBuffer[1]);
+          numRenders += blitWithDepth(time, mBuffer[quality]);
           }
         }
 
diff --git a/src/main/java/org/distorted/library/main/DistortedRenderState.java b/src/main/java/org/distorted/library/main/DistortedRenderState.java
index b611dec..5e8ce76 100644
--- a/src/main/java/org/distorted/library/main/DistortedRenderState.java
+++ b/src/main/java/org/distorted/library/main/DistortedRenderState.java
@@ -27,8 +27,12 @@ import android.opengl.GLES30;
  * <p>
  * This is a member of DistortedNode. Remembers the OpenGL state we want to set just before rendering
  * the Node.
+ * <p>
+ * Only for use by the library itself.
+ *
+ * @y.exclude
  */
-class DistortedRenderState
+public class DistortedRenderState
 {
   // TODO: figure this out dynamically; this assumes 8 bit stencil buffer.
   private static final int STENCIL_MASK = (1<<8)-1;
@@ -258,8 +262,12 @@ class DistortedRenderState
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  static void useStencilMark()
+/**
+ * Only for use by the library itself.
+ *
+ * @y.exclude
+ */
+  public static void useStencilMark()
     {
     if( cState.stencilTest!=1 )
       {
@@ -298,8 +306,12 @@ class DistortedRenderState
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  static void unuseStencilMark()
+/**
+ * Only for use by the library itself.
+ *
+ * @y.exclude
+ */
+  public static void unuseStencilMark()
     {
     if( sState.stencilTest!=cState.stencilTest )
       {
diff --git a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
index e9a4c06..d0c57d7 100644
--- a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
@@ -90,21 +90,24 @@ class EffectQueuePostprocess extends EffectQueue
     return mNumEffects>0 ? ((PostprocessEffect)mEffects[0]).getQuality() : 0;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getInternalQuality()
+    {
+    return mNumEffects>0 ? ((PostprocessEffect)mEffects[0]).getInternalQuality() : 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int postprocess(DistortedOutputSurface surface)
     {
     int numRenders = 0;
 
-    DistortedRenderState.useStencilMark();
-
     for(int i=0; i<mNumEffects; i++)
       {
       numRenders += ((PostprocessEffect)mEffects[i]).apply(mUniforms,NUM_UNIFORMS*i, surface.mBuffer);
       }
 
-    DistortedRenderState.unuseStencilMark();
-
     return numRenders;
     }
   }
