commit aa2f04869239d9bc26d9fa612926c7951b92b046
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Mon Jun 26 17:31:01 2017 +0100

    Now all PostprocessEffects are truly self-contained, including dynamic enable() and all shader sources.

diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffect.java b/src/main/java/org/distorted/library/effect/PostprocessEffect.java
index 0071f52..5a58cb4 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffect.java
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffect.java
@@ -20,10 +20,12 @@
 package org.distorted.library.effect;
 
 import org.distorted.library.main.DistortedFramebuffer;
+import org.distorted.library.program.DistortedProgram;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.FloatBuffer;
+import java.util.ArrayList;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // POSTPROCESSING EFFECTS.
@@ -54,6 +56,56 @@ public abstract class PostprocessEffect extends Effect
     mQuadTextureInv.put(textureInv).position(0);
     }
 
+  private static class Source
+    {
+    private String mName, mVertexShader, mFragmentShader;
+
+    public Source(String name, String vertex, String fragment)
+      {
+      mName           = name;
+      mVertexShader   = vertex;
+      mFragmentShader = fragment;
+      }
+    }
+
+  static ArrayList<DistortedProgram> mPrograms = new ArrayList<>();
+  private static ArrayList<Source> mSources = new ArrayList<>();
+  private static int mNumSources = 0;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static int register(final String name, final String vertexShader, final String fragmentShader)
+    {
+    mSources.add(new Source(name,vertexShader,fragmentShader));
+
+    return mNumSources++;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static void createPrograms()
+    {
+    Source source;
+    int len = mSources.size();
+
+    for(int i=0; i<len; i++)
+      {
+      source = mSources.remove(0);
+
+      //android.util.Log.d("postprocess", "compilaing: "+source.mName);
+
+      try
+        {
+        mPrograms.add (new DistortedProgram(source.mVertexShader,source.mFragmentShader));
+        }
+      catch(Exception e)
+        {
+        android.util.Log.e("Effects", "exception trying to compile "+source.mName+" program: "+e.getMessage());
+        throw new RuntimeException(e.getMessage());
+        }
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public abstract int apply(float[] uniforms, int index, float qualityScale, DistortedFramebuffer buffer);
diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java b/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java
index e5a2b99..ccaefa4 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java
@@ -56,11 +56,12 @@ public class PostprocessEffectBlur extends PostprocessEffect
   // We need room for MAX_BLUR of them, and sum(i=0...N, floor((i+3)/2)) = N + floor(N*N/4)
   private static float[] weightsCache = new float[MAX_HALO + MAX_HALO*MAX_HALO/4];
   private static float[] offsetsCache = new float[MAX_HALO + MAX_HALO*MAX_HALO/4];
-
-  private static DistortedProgram mBlur1Program, mBlur2Program;
   private static float[] mWeights = new float[MAX_HALO];
   private static float[] mOffsets = new float[MAX_HALO];
 
+  private static DistortedProgram mBlur1Program, mBlur2Program;
+  private static int mBlur1Index, mBlur2Index;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Blur the object.
@@ -85,6 +86,12 @@ public class PostprocessEffectBlur extends PostprocessEffect
 
   public int apply(float[] uniforms, int index, float qualityScale, DistortedFramebuffer buffer)
     {
+    if( mBlur1Program==null)
+      {
+      mBlur1Program = mPrograms.get(mBlur1Index);
+      mBlur2Program = mPrograms.get(mBlur2Index);
+      }
+
     buffer.setAsOutput();
 
     float w1  = buffer.getWidth();
@@ -149,12 +156,6 @@ public class PostprocessEffectBlur extends PostprocessEffect
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static void enable()
-    {
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static void createProgram()
     {
     final String blurVertex =
 
@@ -217,25 +218,8 @@ public class PostprocessEffectBlur extends PostprocessEffect
       "fragColor = pixel;                                                                                    \n"+
       "}";
 
-    try
-      {
-      mBlur1Program = new DistortedProgram(blurVertex,blurFragment1);
-      }
-    catch(Exception e)
-      {
-      android.util.Log.e("Effects", "exception trying to compile BLUR1 program: "+e.getMessage());
-      throw new RuntimeException(e.getMessage());
-      }
-
-    try
-      {
-      mBlur2Program = new DistortedProgram(blurVertex,blurFragment2);
-      }
-    catch(Exception e)
-      {
-      android.util.Log.e("Effects", "exception trying to compile BLUR2 program: "+e.getMessage());
-      throw new RuntimeException(e.getMessage());
-      }
+    mBlur1Index = PostprocessEffect.register("BLUR1", blurVertex,blurFragment1);
+    mBlur2Index = PostprocessEffect.register("BLUR2", blurVertex,blurFragment2);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/main/Distorted.java b/src/main/java/org/distorted/library/main/Distorted.java
index 51350d2..4f5908c 100644
--- a/src/main/java/org/distorted/library/main/Distorted.java
+++ b/src/main/java/org/distorted/library/main/Distorted.java
@@ -26,7 +26,7 @@ import android.content.res.Resources;
 
 import org.distorted.library.effect.Effect;
 import org.distorted.library.effect.FragmentEffect;
-import org.distorted.library.effect.PostprocessEffectBlur;
+import org.distorted.library.effect.PostprocessEffect;
 import org.distorted.library.effect.VertexEffect;
 import org.distorted.library.program.*;
 
@@ -124,7 +124,7 @@ public class Distorted
 
     final Resources resources = context.getResources();
     DistortedEffects.createProgram(resources);
-    PostprocessEffectBlur.createProgram();
+    PostprocessEffect.createPrograms();
     EffectMessageSender.startSending();
 
     mInitialized = true;
diff --git a/src/main/java/org/distorted/library/program/DistortedProgram.java b/src/main/java/org/distorted/library/program/DistortedProgram.java
index 0d0a1aa..0d401d4 100644
--- a/src/main/java/org/distorted/library/program/DistortedProgram.java
+++ b/src/main/java/org/distorted/library/program/DistortedProgram.java
@@ -224,7 +224,7 @@ public class DistortedProgram
 
       if( uniform!=null )
         {
-        android.util.Log.d("program", "new uniform: "+uniform);
+        //android.util.Log.d("program", "new uniform: "+uniform);
         if( mUniList.length()>0 ) mUniList+=" ";
         mUniList += uniform;
         }
