commit 1418a5ebd8cd013b61b3cf23d8d0ed1b8506dc09
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun Jan 6 23:15:12 2019 +0000

    Relax requirements on when we can call DistortedEffects.setMax().
    
    Before this change one had to call it before creation of shaders and before any of the DistortedEffects classes got created.
    This commit removes the second requirement so now with setMax it's just like with enabling effects: it's best done in onSurfaceCreated.

diff --git a/src/main/java/org/distorted/library/main/EffectQueue.java b/src/main/java/org/distorted/library/main/EffectQueue.java
index 5a64171..1057259 100644
--- a/src/main/java/org/distorted/library/main/EffectQueue.java
+++ b/src/main/java/org/distorted/library/main/EffectQueue.java
@@ -33,9 +33,10 @@ import java.util.HashMap;
 
 abstract class EffectQueue implements DistortedMaster.Slave
   {
-  private static final int ATTACH = 0;
-  private static final int DETACH = 1;
-  private static final int DETALL = 2;
+  private static final int CREATE = 0;
+  private static final int ATTACH = 1;
+  private static final int DETACH = 2;
+  private static final int DETALL = 3;
 
   int mNumEffects;      // 'ToBe' will be more than mNumEffects if doWork() hasn't
   int mNumEffectsToBe;  // added them yet (or less if it hasn't removed some yet)
@@ -54,18 +55,19 @@ abstract class EffectQueue implements DistortedMaster.Slave
                                                                          // single long - the queue ID.
   private ArrayList<DistortedNode> mNodes = null;
   private long mID;
-  private static boolean mCreated;
   private int mIndex;
 
   private class Job
     {
     int type;
+    int num;
     boolean notify;
     Effect effect;
 
-    Job(int t, boolean n, Effect e)
+    Job(int t, int m, boolean n, Effect e)
       {
       type  = t;
+      num   = m;
       notify= n;
       effect= e;
       }
@@ -88,17 +90,8 @@ abstract class EffectQueue implements DistortedMaster.Slave
     mDistortedEffectsID = id;
     mIndex              = index;
 
-    int max = mMax[mIndex];
-
-    if( max>0 )
-      {
-      mUniforms        = new float[numUniforms*max];
-      mCurrentDuration = new long[max];
-      mEffects         = new Effect[max];
-      mName            = new int[max];
-      }
-   
-    mCreated = true;  
+    mJobs.add(new Job(CREATE,numUniforms,false,null));  // create the stuff that depends on max number
+    DistortedMaster.newSlave(this);                     // of uniforms later, on first render.
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -172,7 +165,7 @@ abstract class EffectQueue implements DistortedMaster.Slave
 
   static boolean setMax(int index, int m)
     {
-    if( (!mCreated && !Distorted.isInitialized()) || m<=mMax[index] )
+    if( !Distorted.isInitialized() || m<=mMax[index] )
       {
       mMax[index] = m<0 ? 0:m;
       return true;
@@ -218,7 +211,6 @@ abstract class EffectQueue implements DistortedMaster.Slave
     mNextID = 1;
     mMapID.clear();
     EffectType.reset(mMax);
-    mCreated = false;  
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -253,7 +245,7 @@ abstract class EffectQueue implements DistortedMaster.Slave
       {
       if( mEffects[i].getName() == name )
         {
-        mJobs.add(new Job(DETACH,true,mEffects[i]));
+        mJobs.add(new Job(DETACH,0,true,mEffects[i]));
         ret++;
         }
       }
@@ -275,7 +267,7 @@ abstract class EffectQueue implements DistortedMaster.Slave
       {
       if( mEffects[i].getID() == id )
         {
-        mJobs.add(new Job(DETACH,true,mEffects[i]));
+        mJobs.add(new Job(DETACH,0,true,mEffects[i]));
         DistortedMaster.newSlave(this);
         mNumEffectsToBe--;
         return 1;
@@ -293,7 +285,7 @@ abstract class EffectQueue implements DistortedMaster.Slave
       {
       if( mEffects[i]==effect )
         {
-        mJobs.add(new Job(DETACH,true,mEffects[i]));
+        mJobs.add(new Job(DETACH,0,true,mEffects[i]));
         DistortedMaster.newSlave(this);
         mNumEffectsToBe--;
         return 1;
@@ -309,7 +301,7 @@ abstract class EffectQueue implements DistortedMaster.Slave
 
   synchronized int abortAll(boolean notify)
     {
-    mJobs.add(new Job(DETALL,notify,null));
+    mJobs.add(new Job(DETALL,0,notify,null));
     DistortedMaster.newSlave(this);
     mNumEffectsToBe = 0;
     return mNumEffects;
@@ -324,7 +316,7 @@ abstract class EffectQueue implements DistortedMaster.Slave
       //android.util.Log.e("queue", "scheduling future add of "+effect.getName().name()+" to "+mNumEffectsToBe+" id="+effect.getID());
       //android.util.Log.e("queue", "queue id="+mDistortedEffectsID);
 
-      mJobs.add(new Job(ATTACH,false,effect));
+      mJobs.add(new Job(ATTACH,0,false,effect));
       DistortedMaster.newSlave(this);
       mNumEffectsToBe++;
       return true;
@@ -352,27 +344,33 @@ abstract class EffectQueue implements DistortedMaster.Slave
 
       switch(job.type)
         {
-        case ATTACH: //android.util.Log.e("queue", "DisEffects ID: "+mDistortedEffectsID+" bank:"+mNumEffects+
-                     //                   " attaching effectID="+job.effect.getID()+" ("+job.effect.getName().name()+")");
-
-                     mCurrentDuration[mNumEffects] = 0;
-                     mEffects[mNumEffects] = job.effect;
-                     mName[mNumEffects] = job.effect.getName().ordinal();
-                     mNumEffects++;
-                     //android.util.Log.d("queue", "DisEffects ID: "+mDistortedEffectsID+
-                     //        " success attaching, num to be:"+mNumEffectsToBe+" num:"+mNumEffects);
+        case CREATE: int max = mMax[mIndex];
 
+                     if( max>0 )
+                       {
+                       mUniforms        = new float[max*job.num];
+                       mCurrentDuration = new long[max];
+                       mEffects         = new Effect[max];
+                       mName            = new int[max];
+                       }
+                     break;
+        case ATTACH: if( mMax[mIndex]>mNumEffects ) // it is possible that we have first
+                       {                            // added effects and then lowered mMax
+                       mCurrentDuration[mNumEffects] = 0;
+                       mEffects[mNumEffects] = job.effect;
+                       mName[mNumEffects] = job.effect.getName().ordinal();
+                       mNumEffects++;
+                       }
+                     else
+                       {
+                       android.util.Log.e("queue", "failed to add effect "+job.effect.getName());
+                       }
                      break;
-        case DETACH: //android.util.Log.e("queue", "DisEffects ID: "+mDistortedEffectsID+" detaching effect "+
-                     //                             job.effect.getID());
-                     for(int j=0; j<mNumEffects; j++)
+        case DETACH: for(int j=0; j<mNumEffects; j++)
                        {
                        if (mEffects[j] == job.effect)
                          {
                          remove(j);
-                         //android.util.Log.d("queue", "DisEffects ID: "+mDistortedEffectsID+
-                         //    " success detaching, num to be:"+mNumEffectsToBe+" num:"+mNumEffects);
-
                          break;
                          }
                        }
