commit 96e3b88a76222e7cb9d758e7288f4d91a3b644a5
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Aug 21 00:29:19 2020 +0100

    Introducing UBO to Effect Queues: step 1.

diff --git a/src/main/java/org/distorted/library/effect/Effect.java b/src/main/java/org/distorted/library/effect/Effect.java
index f1e1642..b8b0487 100644
--- a/src/main/java/org/distorted/library/effect/Effect.java
+++ b/src/main/java/org/distorted/library/effect/Effect.java
@@ -142,20 +142,10 @@ public abstract class Effect
  *
  * @y.exclude
  */
-  public int getAndAssociation()
+  public void writeAssociations(int[] intUniforms, int index1, int index2)
     {
-    return mAndAssociation;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Only for use by the library itself.
- *
- * @y.exclude
- */
-  public int getEquAssociation()
-    {
-    return mEquAssociation;
+    intUniforms[index1] = mAndAssociation;
+    intUniforms[index2] = mEquAssociation;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/effect/FragmentEffect.java b/src/main/java/org/distorted/library/effect/FragmentEffect.java
index ae50218..44f1950 100644
--- a/src/main/java/org/distorted/library/effect/FragmentEffect.java
+++ b/src/main/java/org/distorted/library/effect/FragmentEffect.java
@@ -27,10 +27,15 @@ import org.distorted.library.type.Static3D;
  */
 public abstract class FragmentEffect extends Effect
   {
-/**
- * 12: 4-per effect interpolated values, 3 dimensional Center (+padding), 3 dimensional Region (+padding).
- */
-  public static final int NUM_UNIFORMS = 12;
+  /**
+   * 12: 4-per effect interpolated values, 3 dimensional Center (+padding), 3 dimensional Region (+padding).
+   */
+  public static final int NUM_FLOAT_UNIFORMS = 12;
+  /**
+   * 1: the name
+   */
+  public static final int NUM_INT_UNIFORMS = 1;
+
   static final int VALUES_OFFSET = 0;
   static final int CENTER_OFFSET = 5;
   static final int REGION_OFFSET = 8;
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffect.java b/src/main/java/org/distorted/library/effect/MatrixEffect.java
index e556494..a2289c0 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffect.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffect.java
@@ -25,10 +25,15 @@ package org.distorted.library.effect;
  */
 public abstract class MatrixEffect extends Effect
   {
-/**
- * 7: 4 per-effect interpolated values + 3 dimensional center.
- */
-  public static final int NUM_UNIFORMS = 7;
+  /**
+   * 7: 4 per-effect interpolated values + 3 dimensional center.
+   */
+  public static final int NUM_FLOAT_UNIFORMS = 7;
+  /**
+   * 0: nothing
+   */
+  public static final int NUM_INT_UNIFORMS = 1;
+
   static final int CENTER_OFFSET = 4;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectMove.java b/src/main/java/org/distorted/library/effect/MatrixEffectMove.java
index e153ab9..a3da6c4 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectMove.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectMove.java
@@ -50,9 +50,9 @@ public class MatrixEffectMove extends MatrixEffect
  */
   public void apply(float[] matrixP, float[] matrixV, float[] uniforms, int index)
     {
-    float sx = uniforms[NUM_UNIFORMS*index  ];
-    float sy = uniforms[NUM_UNIFORMS*index+1];
-    float sz = uniforms[NUM_UNIFORMS*index+2];
+    float sx = uniforms[NUM_FLOAT_UNIFORMS*index  ];
+    float sy = uniforms[NUM_FLOAT_UNIFORMS*index+1];
+    float sz = uniforms[NUM_FLOAT_UNIFORMS*index+2];
 
     Matrix.translateM(matrixP, 0, sx, sy, sz);
     Matrix.translateM(matrixV, 0, sx, sy, sz);
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectQuaternion.java b/src/main/java/org/distorted/library/effect/MatrixEffectQuaternion.java
index 37fdb06..1b1da41 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectQuaternion.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectQuaternion.java
@@ -56,14 +56,14 @@ public class MatrixEffectQuaternion extends MatrixEffect
  */
   public void apply(float[] matrixP, float[] matrixV, float[] uniforms, int index)
     {
-    float qX = uniforms[NUM_UNIFORMS*index  ];
-    float qY = uniforms[NUM_UNIFORMS*index+1];
-    float qZ = uniforms[NUM_UNIFORMS*index+2];
-    float qW = uniforms[NUM_UNIFORMS*index+3];
-
-    float x = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET  ];
-    float y = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+1];
-    float z = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+2];
+    float qX = uniforms[NUM_FLOAT_UNIFORMS*index  ];
+    float qY = uniforms[NUM_FLOAT_UNIFORMS*index+1];
+    float qZ = uniforms[NUM_FLOAT_UNIFORMS*index+2];
+    float qW = uniforms[NUM_FLOAT_UNIFORMS*index+3];
+
+    float x = uniforms[NUM_FLOAT_UNIFORMS*index+CENTER_OFFSET  ];
+    float y = uniforms[NUM_FLOAT_UNIFORMS*index+CENTER_OFFSET+1];
+    float z = uniforms[NUM_FLOAT_UNIFORMS*index+CENTER_OFFSET+2];
 
     Matrix.translateM(matrixP, 0, x, y, z);
     multiplyByQuat   (matrixP, qX, qY, qZ, qW);
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java b/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java
index a2c1694..2c8d4ab 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java
@@ -54,14 +54,14 @@ public class MatrixEffectRotate extends MatrixEffect
  */
   public void apply(float[] matrixP, float[] matrixV, float[] uniforms, int index)
     {
-    float angle = uniforms[NUM_UNIFORMS*index  ];
-    float axisX = uniforms[NUM_UNIFORMS*index+1];
-    float axisY = uniforms[NUM_UNIFORMS*index+2];
-    float axisZ = uniforms[NUM_UNIFORMS*index+3];
+    float angle = uniforms[NUM_FLOAT_UNIFORMS*index  ];
+    float axisX = uniforms[NUM_FLOAT_UNIFORMS*index+1];
+    float axisY = uniforms[NUM_FLOAT_UNIFORMS*index+2];
+    float axisZ = uniforms[NUM_FLOAT_UNIFORMS*index+3];
 
-    float x = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET  ];
-    float y = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+1];
-    float z = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+2];
+    float x = uniforms[NUM_FLOAT_UNIFORMS*index+CENTER_OFFSET  ];
+    float y = uniforms[NUM_FLOAT_UNIFORMS*index+CENTER_OFFSET+1];
+    float z = uniforms[NUM_FLOAT_UNIFORMS*index+CENTER_OFFSET+2];
 
     Matrix.translateM(matrixP, 0, x, y, z);
     Matrix.rotateM   (matrixP, 0, angle, axisX, axisY, axisZ);
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectScale.java b/src/main/java/org/distorted/library/effect/MatrixEffectScale.java
index 9019063..a4c5a3d 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectScale.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectScale.java
@@ -57,9 +57,9 @@ public class MatrixEffectScale extends MatrixEffect
  */
   public void apply(float[] matrixP, float[] matrixV, float[] uniforms, int index)
     {
-    float sx = uniforms[NUM_UNIFORMS*index  ];
-    float sy = uniforms[NUM_UNIFORMS*index+1];
-    float sz = uniforms[NUM_UNIFORMS*index+2];
+    float sx = uniforms[NUM_FLOAT_UNIFORMS*index  ];
+    float sy = uniforms[NUM_FLOAT_UNIFORMS*index+1];
+    float sz = uniforms[NUM_FLOAT_UNIFORMS*index+2];
 
     Matrix.scaleM(matrixP, 0, sx, sy, sz);
     Matrix.scaleM(matrixV, 0, sy*sz, sx*sz, sx*sy);
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectShear.java b/src/main/java/org/distorted/library/effect/MatrixEffectShear.java
index b5c5a09..d18c5ff 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectShear.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectShear.java
@@ -54,13 +54,13 @@ public class MatrixEffectShear extends MatrixEffect
  */
   public void apply(float[] matrixP, float[] matrixV, float[] uniforms, int index)
     {
-    float sx = uniforms[NUM_UNIFORMS*index  ];
-    float sy = uniforms[NUM_UNIFORMS*index+1];
-    float sz = uniforms[NUM_UNIFORMS*index+2];
+    float sx = uniforms[NUM_FLOAT_UNIFORMS*index  ];
+    float sy = uniforms[NUM_FLOAT_UNIFORMS*index+1];
+    float sz = uniforms[NUM_FLOAT_UNIFORMS*index+2];
 
-    float x  = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET  ];
-    float y  = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+1];
-    float z  = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+2];
+    float x  = uniforms[NUM_FLOAT_UNIFORMS*index+CENTER_OFFSET  ];
+    float y  = uniforms[NUM_FLOAT_UNIFORMS*index+CENTER_OFFSET+1];
+    float z  = uniforms[NUM_FLOAT_UNIFORMS*index+CENTER_OFFSET+2];
 
     Matrix.translateM(matrixP, 0, x, y, z);
 
diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffect.java b/src/main/java/org/distorted/library/effect/PostprocessEffect.java
index f60426a..f75c792 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffect.java
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffect.java
@@ -36,10 +36,14 @@ import java.util.ArrayList;
 public abstract class PostprocessEffect extends Effect implements InternalMaster.Slave
   {
   private static final int MIPMAP = 0;
-/**
- * 5: 5 per-effect interpolated values.
- */
-  public static final int NUM_UNIFORMS = 6;
+  /**
+   * 5 per-effect interpolated values.
+   */
+  public static final int NUM_FLOAT_UNIFORMS = 6;
+  /**
+   * 1: the name of the effect
+   */
+  public static final int NUM_INT_UNIFORMS = 1;
 
   static final int POS_DATA_SIZE= 2;
   static final int TEX_DATA_SIZE= 2;
diff --git a/src/main/java/org/distorted/library/effect/VertexEffect.java b/src/main/java/org/distorted/library/effect/VertexEffect.java
index 363c577..e43a864 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffect.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffect.java
@@ -29,10 +29,15 @@ import java.lang.reflect.Method;
  */
 public abstract class VertexEffect extends Effect
   {
-/**
- * 12: 5 per-effect interpolated values, 3-dimensional center, 4-dimensional Region
- */
-  public static final int NUM_UNIFORMS = 12;
+  /**
+   * 12: 5 per-effect interpolated values, 3-dimensional center, 4-dimensional Region
+   */
+  public static final int NUM_FLOAT_UNIFORMS = 12;
+  /**
+   * 3: name, AND association, equ Association
+   */
+  public static final int NUM_INT_UNIFORMS = 3;
+
   static final int VALUES_OFFSET = 0;
   static final int CENTER_OFFSET = 5;
   static final int REGION_OFFSET = 8;
diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueue.java b/src/main/java/org/distorted/library/effectqueue/EffectQueue.java
index 493ccf3..fae1679 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueue.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueue.java
@@ -24,7 +24,6 @@ import org.distorted.library.effect.EffectName;
 import org.distorted.library.effect.EffectType;
 import org.distorted.library.main.DistortedLibrary;
 import org.distorted.library.main.InternalMaster;
-import org.distorted.library.mesh.MeshBase;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -44,17 +43,16 @@ public abstract class EffectQueue implements InternalMaster.Slave
   private static final int DETACH = 2;
   private static final int DETALL = 3;
 
+  long mTime;
   int mNumEffects;              // 'ToBe' will be more than mNumEffects if doWork() hasn't
   private int mNumEffectsToBe;  // added them yet (or less if it hasn't removed some yet)
-  float[] mUniforms;
-  private int mNumUniforms;
+  private int mNumFloatUniforms, mNumIntUniforms;
   Effect[] mEffects;
-  int[] mName;
-  int[] mAndAssociation;
-  int[] mEquAssociation;
-  long mTime;
 
-  private static int[] mMax = new int[EffectType.LENGTH];
+  float[] mFloatUniforms;
+  int[] mIntUniforms;
+
+  static int[] mMax = new int[EffectType.LENGTH];
   private static long mNextID;
   private static HashMap<ArrayList<Long>,Long> mMapID = new HashMap<>(); // maps lists of Effect IDs (longs) to a
                                                                          // single long - the queue ID.
@@ -65,14 +63,15 @@ public abstract class EffectQueue implements InternalMaster.Slave
   private static class Job
     {
     int type;
-    int num;
+    int num1, num2;
     boolean notify;
     Effect effect;
 
-    Job(int t, int m, boolean n, Effect e)
+    Job(int t, int m1, int m2, boolean n, Effect e)
       {
       type  = t;
-      num   = m;
+      num1  = m1;
+      num2  = m2;
       notify= n;
       effect= e;
       }
@@ -87,18 +86,19 @@ public abstract class EffectQueue implements InternalMaster.Slave
   
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-  EffectQueue(int numUniforms, int index)
+  EffectQueue(int numFloatUniforms, int numIntUniforms, int index)
     {
-    mCreated            = false;
-    mTime               = 0;
-    mID                 = 0;
-    mNumEffects         = 0;
-    mNumEffectsToBe     = 0;
-    mIndex              = index;
-    mNumUniforms        = numUniforms;
-
-    mJobs.add(new Job(CREATE,numUniforms,false,null)); // create the stuff that depends on max number
-    InternalMaster.newSlave(this);                     // of uniforms later, on first render.
+    mCreated          = false;
+    mTime             = 0;
+    mID               = 0;
+    mNumEffects       = 0;
+    mNumEffectsToBe   = 0;
+    mIndex            = index;
+    mNumFloatUniforms = numFloatUniforms;
+    mNumIntUniforms   = numIntUniforms;
+
+    mJobs.add(new Job(CREATE,numFloatUniforms,numIntUniforms, false,null)); // create the stuff that depends on max number
+    InternalMaster.newSlave(this);                                          // of uniforms later, on first render.
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -108,13 +108,14 @@ public abstract class EffectQueue implements InternalMaster.Slave
     {
     if( !source.mCreated )
       {
-      mCreated            = false;
-      mTime               = 0;
-      mID                 = 0;
-      mNumEffects         = 0;
-      mNumEffectsToBe     = 0;
-      mIndex              = source.mIndex;
-      mNumUniforms        = source.mNumUniforms;
+      mCreated          = false;
+      mTime             = 0;
+      mID               = 0;
+      mNumEffects       = 0;
+      mNumEffectsToBe   = 0;
+      mIndex            = source.mIndex;
+      mNumFloatUniforms = source.mNumFloatUniforms;
+      mNumIntUniforms   = source.mNumIntUniforms;
 
       int numJobs = source.mJobs.size();
 
@@ -128,30 +129,32 @@ public abstract class EffectQueue implements InternalMaster.Slave
       }
     else
       {
-      mCreated            = true;
-      mTime               = source.mTime;
-      mID                 = source.mID;
-      mNumEffects         = source.mNumEffects;
-      mNumEffectsToBe     = source.mNumEffectsToBe;
-      mIndex              = source.mIndex;
-      mNumUniforms        = source.mNumUniforms;
+      mCreated          = true;
+      mTime             = source.mTime;
+      mID               = source.mID;
+      mNumEffects       = source.mNumEffects;
+      mNumEffectsToBe   = source.mNumEffectsToBe;
+      mIndex            = source.mIndex;
+      mNumFloatUniforms = source.mNumFloatUniforms;
+      mNumIntUniforms   = source.mNumIntUniforms;
 
       int max = mMax[mIndex];
-      if( max>0 )
-        {
-        mUniforms        = new float[max*source.mNumUniforms];
-        mEffects         = new Effect[max];
-        mName            = new int[max];
-        mAndAssociation  = new int[max];
-        mEquAssociation  = new int[max];
-        }
 
-      for(int i=0; i<mNumEffects; i++ )
+      if( max>0 )
         {
-        mEffects[i]         = source.mEffects[i];
-        mName[i]            = source.mName[i];
-        mAndAssociation[i]  = source.mAndAssociation[i];
-        mEquAssociation[i]  = source.mEquAssociation[i];
+        mEffects       = new Effect[max];
+        mFloatUniforms = new float[max*source.mNumFloatUniforms];
+        mIntUniforms   = new int[max*source.mNumIntUniforms];
+
+        if( mNumEffects>=0 )
+          {
+          System.arraycopy(source.mEffects, 0, mEffects, 0, mNumEffects);
+          }
+
+        if( mNumIntUniforms*mNumEffects>=0 )
+          {
+          System.arraycopy(source.mIntUniforms, 0, mIntUniforms, 0, mNumIntUniforms*mNumEffects);
+          }
         }
       }
     }
@@ -268,12 +271,16 @@ public abstract class EffectQueue implements InternalMaster.Slave
     {
     mNumEffects--;
 
-    for(int j=effect; j<mNumEffects; j++ )
+    int max = mMax[mIndex];
+
+    for(int i=effect; i<mNumEffects; i++ )
       {
-      mEffects[j]         = mEffects[j+1];
-      mName[j]            = mName[j+1];
-      mAndAssociation[j]  = mAndAssociation[j+1];
-      mEquAssociation[j]  = mEquAssociation[j+1];
+      mEffects[i]= mEffects[i+1];
+
+      for(int j=0; j<mNumIntUniforms; j++)
+        {
+        mIntUniforms[j*max + i] = mIntUniforms[j*max + i+1];
+        }
       }
 
     mEffects[mNumEffects] = null;
@@ -289,7 +296,7 @@ public abstract class EffectQueue implements InternalMaster.Slave
       {
       if( mEffects[i].getName() == name )
         {
-        mJobs.add(new Job(DETACH,0,true,mEffects[i]));
+        mJobs.add(new Job(DETACH,0,0,true,mEffects[i]));
         ret++;
         }
       }
@@ -311,7 +318,7 @@ public abstract class EffectQueue implements InternalMaster.Slave
       {
       if( mEffects[i].getID() == id )
         {
-        mJobs.add(new Job(DETACH,0,true,mEffects[i]));
+        mJobs.add(new Job(DETACH,0,0,true,mEffects[i]));
         InternalMaster.newSlave(this);
         mNumEffectsToBe--;
         return 1;
@@ -329,7 +336,7 @@ public abstract class EffectQueue implements InternalMaster.Slave
       {
       if( mEffects[i]==effect )
         {
-        mJobs.add(new Job(DETACH,0,true,mEffects[i]));
+        mJobs.add(new Job(DETACH,0,0,true,mEffects[i]));
         InternalMaster.newSlave(this);
         mNumEffectsToBe--;
         return 1;
@@ -345,7 +352,7 @@ public abstract class EffectQueue implements InternalMaster.Slave
 
   public synchronized int removeAll(boolean notify)
     {
-    mJobs.add(new Job(DETALL,0,notify,null));
+    mJobs.add(new Job(DETALL,0,0,notify,null));
     InternalMaster.newSlave(this);
     mNumEffectsToBe = 0;
     return mNumEffects;
@@ -357,7 +364,7 @@ public abstract class EffectQueue implements InternalMaster.Slave
     {
     if( mMax[mIndex]>mNumEffectsToBe || !mCreated )
       {
-      mJobs.add(new Job(ATTACH,-1,false,effect));
+      mJobs.add(new Job(ATTACH,-1,0,false,effect));
       InternalMaster.newSlave(this);
       mNumEffectsToBe++;
       return true;
@@ -372,7 +379,7 @@ public abstract class EffectQueue implements InternalMaster.Slave
     {
     if( mMax[mIndex]>mNumEffectsToBe || !mCreated )
       {
-      mJobs.add(new Job(ATTACH,position,false,effect));
+      mJobs.add(new Job(ATTACH,position,0,false,effect));
       InternalMaster.newSlave(this);
       mNumEffectsToBe++;
       return true;
@@ -427,25 +434,21 @@ public abstract class EffectQueue implements InternalMaster.Slave
         case CREATE: int max = mMax[mIndex];
                      if( max>0 )
                        {
-                       mUniforms        = new float[max*job.num];
-                       mEffects         = new Effect[max];
-                       mName            = new int[max];
-                       mAndAssociation  = new int[max];
-                       mEquAssociation  = new int[max];
+                       mEffects       = new Effect[max];
+                       mFloatUniforms = new float[max*job.num1];
+                       mIntUniforms   = new int[max*job.num2];
                        }
                      mCreated = true;
 
                      break;
         case ATTACH: if( mMax[mIndex]>mNumEffects ) // it is possible that we have first
                        {                            // added effects and then lowered mMax
-                       int position = job.num;
+                       int position = job.num1;
 
                        if( position==-1 )
                          {
-                         mEffects[mNumEffects]        = job.effect;
-                         mName[mNumEffects]           = job.effect.getName().ordinal();
-                         mAndAssociation[mNumEffects] = job.effect.getAndAssociation();
-                         mEquAssociation[mNumEffects] = job.effect.getEquAssociation();
+                         mEffects[mNumEffects]     = job.effect;
+                         mIntUniforms[mNumEffects] = job.effect.getName().ordinal();
 
                          mNumEffects++;
                          changed = true;
@@ -454,16 +457,12 @@ public abstract class EffectQueue implements InternalMaster.Slave
                          {
                          for(int j=mNumEffects; j>position; j--)
                            {
-                           mEffects[j]         = mEffects[j-1];
-                           mName[j]            = mName[j-1];
-                           mAndAssociation[j]  = mAndAssociation[j-1];
-                           mEquAssociation[j]  = mEquAssociation[j-1];
+                           mEffects[j]     = mEffects[j-1];
+                           mIntUniforms[j] = mIntUniforms[j-1];
                            }
 
-                         mEffects[position]        = job.effect;
-                         mName[position]           = job.effect.getName().ordinal();
-                         mAndAssociation[position] = job.effect.getAndAssociation();
-                         mEquAssociation[position] = job.effect.getEquAssociation();
+                         mEffects[position]     = job.effect;
+                         mIntUniforms[position] = job.effect.getName().ordinal();
 
                          mNumEffects++;
                          changed = true;
diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.java b/src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.java
index d6d66f3..46ac6d6 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.java
@@ -29,7 +29,9 @@ import org.distorted.library.message.EffectMessageSender;
 
 class EffectQueueFragment extends EffectQueue
   {
-  private static final int NUM_UNIFORMS = FragmentEffect.NUM_UNIFORMS;
+  private static final int NUM_FLOAT_UNIFORMS = FragmentEffect.NUM_FLOAT_UNIFORMS;
+  private static final int NUM_INT_UNIFORMS   = FragmentEffect.NUM_INT_UNIFORMS;
+
   private static final int INDEX = EffectType.FRAGMENT.ordinal();
 
   private static int[] mNumEffectsH = new int[MAIN_VARIANTS];
@@ -40,7 +42,7 @@ class EffectQueueFragment extends EffectQueue
    
   EffectQueueFragment()
     { 
-    super(NUM_UNIFORMS,INDEX);
+    super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, INDEX);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -69,7 +71,7 @@ class EffectQueueFragment extends EffectQueue
 
     for(int i=0; i<mNumEffects; i++)
       {
-      if( mEffects[i].compute(mUniforms, NUM_UNIFORMS*i, currTime, step) )
+      if( mEffects[i].compute(mFloatUniforms, NUM_FLOAT_UNIFORMS*i, currTime, step) )
         {
         EffectMessageSender.newMessage(mEffects[i]);
         }
@@ -86,8 +88,27 @@ class EffectQueueFragment extends EffectQueue
 
     if( mNumEffects>0 )
       {
-      GLES30.glUniform1iv( mNameH[variant]    ,                 mNumEffects, mName    ,0);
-      GLES30.glUniform4fv( mUniformsH[variant],(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
+for(int i=0; i<mNumEffects; i++)
+  {
+  String f =
+  mFloatUniforms[12*i]+" "+
+  mFloatUniforms[12*i+1]+" "+
+  mFloatUniforms[12*i+2]+" "+
+  mFloatUniforms[12*i+3]+" "+
+  mFloatUniforms[12*i+4]+" "+
+  mFloatUniforms[12*i+5]+" "+
+  mFloatUniforms[12*i+6]+" "+
+  mFloatUniforms[12*i+7]+" "+
+  mFloatUniforms[12*i+8]+" "+
+  mFloatUniforms[12*i+9]+" "+
+  mFloatUniforms[12*i+10]+" "+
+  mFloatUniforms[12*i+11];
+
+  android.util.Log.e("frag", i+" name: "+mIntUniforms[i]+" float: "+f);
+  }
+
+      GLES30.glUniform1iv( mNameH[variant]    ,                       mNumEffects, mIntUniforms  , 0);
+      GLES30.glUniform4fv( mUniformsH[variant],(NUM_FLOAT_UNIFORMS/4)*mNumEffects, mFloatUniforms, 0);
       }  
     }
   }
diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java b/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java
index 111002a..94ce63e 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java
@@ -29,8 +29,10 @@ import org.distorted.library.message.EffectMessageSender;
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class EffectQueueMatrix extends EffectQueue
-  {   
-  private static final int NUM_UNIFORMS = MatrixEffect.NUM_UNIFORMS;
+  {
+  private static final int NUM_FLOAT_UNIFORMS = MatrixEffect.NUM_FLOAT_UNIFORMS;
+  private static final int NUM_INT_UNIFORMS   = MatrixEffect.NUM_INT_UNIFORMS;
+
   private static final int INDEX = EffectType.MATRIX.ordinal();
 
   private static float[] mMVPMatrix       = new float[16];
@@ -45,7 +47,7 @@ class EffectQueueMatrix extends EffectQueue
    
   EffectQueueMatrix()
     { 
-    super(NUM_UNIFORMS,INDEX );
+    super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, INDEX);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -74,7 +76,7 @@ class EffectQueueMatrix extends EffectQueue
 
     for(int i=0; i<mNumEffects; i++)
       {
-      if( mEffects[i].compute(mUniforms, NUM_UNIFORMS*i, currTime, step) )
+      if( mEffects[i].compute(mFloatUniforms, NUM_FLOAT_UNIFORMS*i, currTime, step) )
         {
         EffectMessageSender.newMessage(mEffects[i]);
         }
@@ -115,7 +117,7 @@ class EffectQueueMatrix extends EffectQueue
     // the 'Model' part of the MV matrix
     for(int i=mNumEffects-1; i>=0; i--)
       {
-      ((MatrixEffect)mEffects[i]).apply(mModelViewMatrixP,mModelViewMatrixV,mUniforms,i);
+      ((MatrixEffect)mEffects[i]).apply(mModelViewMatrixP,mModelViewMatrixV,mFloatUniforms,i);
       }
 
     // combined Model-View-Projection matrix
diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java
index 4ccf422..68953a7 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java
@@ -47,7 +47,9 @@ import java.io.InputStream;
  */
 public class EffectQueuePostprocess extends EffectQueue
   {
-  private static final int NUM_UNIFORMS = PostprocessEffect.NUM_UNIFORMS;
+  private static final int NUM_FLOAT_UNIFORMS = PostprocessEffect.NUM_FLOAT_UNIFORMS;
+  private static final int NUM_INT_UNIFORMS   = PostprocessEffect.NUM_INT_UNIFORMS;
+
   private static final int INDEX = EffectType.POSTPROCESS.ordinal();
 
   private int mHalo;
@@ -62,7 +64,7 @@ public class EffectQueuePostprocess extends EffectQueue
 
   EffectQueuePostprocess()
     { 
-    super(NUM_UNIFORMS,INDEX );
+    super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, INDEX );
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -89,24 +91,24 @@ public class EffectQueuePostprocess extends EffectQueue
       // first zero out the 'alpha' because BLUR effect will not overwrite this (it is a 1D effect)
       // and if previously there was a GLOW effect here then mA would be non-zero and we don't want
       // that (see preprocess())
-      mUniforms[NUM_UNIFORMS*i+5]=0.0f;
+      mFloatUniforms[NUM_FLOAT_UNIFORMS*i+5]=0.0f;
 
-      if( mEffects[i].compute(mUniforms, NUM_UNIFORMS*i, currTime, step) )
+      if( mEffects[i].compute(mFloatUniforms, NUM_FLOAT_UNIFORMS*i, currTime, step) )
         {
         EffectMessageSender.newMessage(mEffects[i]);
         }
 
-      halo = (int)mUniforms[NUM_UNIFORMS*i];
+      halo = (int)mFloatUniforms[NUM_FLOAT_UNIFORMS*i];
       if( halo>mHalo ) mHalo = halo;
       }
 
     // TODO  (now only really works in case of 1 effect!)
     if( mNumEffects>0 )
       {
-      mR = mUniforms[2];
-      mG = mUniforms[3];
-      mB = mUniforms[4];
-      mA = mUniforms[5];
+      mR = mFloatUniforms[2];
+      mG = mFloatUniforms[3];
+      mB = mFloatUniforms[4];
+      mA = mFloatUniforms[5];
       }
 
     mTime = currTime;
@@ -214,7 +216,7 @@ public class EffectQueuePostprocess extends EffectQueue
 
     for(int i=0; i<mNumEffects; i++)
       {
-      numRenders += ((PostprocessEffect)mEffects[i]).apply(mUniforms,NUM_UNIFORMS*i, buffer);
+      numRenders += ((PostprocessEffect)mEffects[i]).apply(mFloatUniforms,NUM_FLOAT_UNIFORMS*i, buffer);
       }
 
     GLES30.glEnable(GLES30.GL_BLEND);
diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.java b/src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.java
index 07ba3f1..be142ac 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.java
@@ -32,8 +32,10 @@ import org.distorted.library.message.EffectMessageSender;
  * @y.exclude
  */
 public class EffectQueueVertex extends EffectQueue
-  { 
-  private static final int NUM_UNIFORMS = VertexEffect.NUM_UNIFORMS;
+  {
+  private static final int NUM_FLOAT_UNIFORMS = VertexEffect.NUM_FLOAT_UNIFORMS;
+  private static final int NUM_INT_UNIFORMS   = VertexEffect.NUM_INT_UNIFORMS;
+
   private static final int INDEX = EffectType.VERTEX.ordinal();
 
   private static int[] mNumEffectsH    = new int[MAIN_VARIANTS];
@@ -47,7 +49,7 @@ public class EffectQueueVertex extends EffectQueue
    
   public EffectQueueVertex()
     { 
-    super(NUM_UNIFORMS,INDEX);
+    super(NUM_FLOAT_UNIFORMS, NUM_INT_UNIFORMS, INDEX);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -83,10 +85,9 @@ public class EffectQueueVertex extends EffectQueue
 
     for(int i=0; i<mNumEffects; i++)
       {
-      mAndAssociation[i] = mEffects[i].getAndAssociation();
-      mEquAssociation[i] = mEffects[i].getEquAssociation();
+      mEffects[i].writeAssociations(mIntUniforms, mMax[INDEX]+i, 2*mMax[INDEX]+i);
 
-      if( mEffects[i].compute(mUniforms, NUM_UNIFORMS*i, currTime, step) )
+      if( mEffects[i].compute(mFloatUniforms, NUM_FLOAT_UNIFORMS*i, currTime, step) )
         {
         EffectMessageSender.newMessage(mEffects[i]);
         }
@@ -108,10 +109,10 @@ public class EffectQueueVertex extends EffectQueue
 
     if( mNumEffects>0 )
       {
-      GLES30.glUniform1iv( mNameH[variant]          ,                 mNumEffects, mName          , 0);
-      GLES30.glUniform1iv( mAndAssociationH[variant],                 mNumEffects, mAndAssociation, 0);
-      GLES30.glUniform1iv( mEquAssociationH[variant],                 mNumEffects, mEquAssociation, 0);
-      GLES30.glUniform4fv( mUniformsH[variant]      ,(NUM_UNIFORMS/4)*mNumEffects, mUniforms      , 0);
+      GLES30.glUniform1iv( mNameH[variant]          ,                       mNumEffects, mIntUniforms   , 0            );
+      GLES30.glUniform1iv( mAndAssociationH[variant],                       mNumEffects, mIntUniforms   ,   mMax[INDEX]);
+      GLES30.glUniform1iv( mEquAssociationH[variant],                       mNumEffects, mIntUniforms   , 2*mMax[INDEX]);
+      GLES30.glUniform4fv( mUniformsH[variant]      ,(NUM_FLOAT_UNIFORMS/4)*mNumEffects, mFloatUniforms , 0            );
       }
     }
   }
diff --git a/src/main/java/org/distorted/library/mesh/AssociationUniformBlock.java b/src/main/java/org/distorted/library/mesh/AssociationUniformBlock.java
index d9e017f..b5eb5b8 100644
--- a/src/main/java/org/distorted/library/mesh/AssociationUniformBlock.java
+++ b/src/main/java/org/distorted/library/mesh/AssociationUniformBlock.java
@@ -79,7 +79,12 @@ public class AssociationUniformBlock
  */
    public static void setAssociationSize(int size)
      {
-     mAssociationSize = size;
+     if( size>0 ) mAssociationSize = size;  // if we are not using any VertexEffects, there
+                                            // will be no 'meshAssociation' UBO in the shader,
+                                            // and thus its detected size will be 0. Do not change
+                                            // the initial guess then - we still might need the
+                                            // associations for applying the MatrixEffects to a
+                                            // mesh, for one.
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -136,6 +141,8 @@ public class AssociationUniformBlock
 
      if( mAssociationSize != 4*oldLen )
        {
+       android.util.Log.e("ass", "assSize="+mAssociationSize+" oldLen="+oldLen);
+
        int[] tmp = new int[oldLen];
        System.arraycopy(mAssociations, 0, tmp, 0, oldLen);
 
diff --git a/src/main/res/raw/main_fragment_shader.glsl b/src/main/res/raw/main_fragment_shader.glsl
index 4809b6e..d4a1b48 100644
--- a/src/main/res/raw/main_fragment_shader.glsl
+++ b/src/main/res/raw/main_fragment_shader.glsl
@@ -120,6 +120,8 @@ void main()
     diff   = (v_Position - fUniforms[effect+1].yzw)/fUniforms[effect+2].xyz;
     degree = max(0.0,1.0-dot(diff,diff));
 
+    color.a *= (degree*(fUniforms[effect].x-1.0)+1.0);
+
     // ENABLED EFFECTS WILL BE INSERTED HERE
 
     effect+=3;
diff --git a/src/main/res/raw/main_vertex_shader.glsl b/src/main/res/raw/main_vertex_shader.glsl
index 86fe3b8..816763c 100644
--- a/src/main/res/raw/main_vertex_shader.glsl
+++ b/src/main/res/raw/main_vertex_shader.glsl
@@ -49,13 +49,14 @@ uniform int u_TransformFeedback;     // are we doing the transform feedback now?
 #if NUM_VERTEX>0
 uniform int vNumEffects;             // total number of vertex effects
 uniform int vName[NUM_VERTEX];       // their names.
+uniform int vEffAndAssoc[NUM_VERTEX];// Associations of the vertex effects. Those are used to connect an effect to a Mesh component.
+uniform int vEffEquAssoc[NUM_VERTEX];// Components the vertex effects work on. Likewise used to connect an effect to a Mesh component.
+
 uniform vec4 vUniforms[3*NUM_VERTEX];// i-th effect is 3 consecutive vec4's: [3*i], [3*i+1], [3*i+2].
                                      // The first vec4 is the Interpolated values,
                                      // second vec4: first float - cache, next 3: Center, the third -  the Region.
-uniform int vEffAndAssoc[NUM_VERTEX];// Associations of the vertex effects. Those are used to connect an effect to a Mesh component.
-uniform int vEffEquAssoc[NUM_VERTEX];// Components the vertex effects work on. Likewise used to connect an effect to a Mesh component.
 
-layout (std140, binding=1) uniform meshAssociation
+layout (shared, binding=1) uniform meshAssociation
   {
   int vComAndAssoc[MAX_COMPON]; // 'logical AND' association of the component.
   int vComEquAssoc[MAX_COMPON]; // 'equal' association of the component.
