commit 9f9924f8c43e68812a30060b77e032f101364788
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Aug 26 16:36:41 2020 +0100

    Remove the 'binding' parameter from the UBO in the vertex shader - this is not part of OpenGL ES 3.0, only introduced in 3.1, and we want to be compatible with 3.0.
    Now we need to dynamically detect the UBO index and form a BlockBinding ourselves.

diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java
index 68953a7..cefe292 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java
@@ -143,8 +143,8 @@ public class EffectQueuePostprocess extends EffectQueue
       }
 
     mPreProgramH = mPreProgram.getProgramHandle();
-    EffectQueueVertex.getUniforms( mPreProgramH,2 );
-    EffectQueueMatrix.getUniforms( mPreProgramH,2 );
+    EffectQueue.getUniforms( mPreProgramH,2 );
+    MeshBase.getUniforms( mPreProgramH,2 );
     mPreColorH  = GLES30.glGetUniformLocation( mPreProgramH, "u_Color"  );
     mPreTextureH= GLES30.glGetUniformLocation( mPreProgramH, "u_Texture");
     }
@@ -183,7 +183,7 @@ public class EffectQueuePostprocess extends EffectQueue
     mPreProgram.useProgram();
 
     mesh.bindVertexAttribs(mPreProgram);
-    mesh.send(mPreProgramH);
+    mesh.send(mPreProgramH,2);
 
     EffectQueue[] queues = effects.getQueues();
     EffectQueueMatrix matrix = (EffectQueueMatrix)queues[0];
diff --git a/src/main/java/org/distorted/library/main/DistortedLibrary.java b/src/main/java/org/distorted/library/main/DistortedLibrary.java
index 338408c..199d6c5 100644
--- a/src/main/java/org/distorted/library/main/DistortedLibrary.java
+++ b/src/main/java/org/distorted/library/main/DistortedLibrary.java
@@ -264,6 +264,7 @@ public class DistortedLibrary
 
     mMainProgramH = mMainProgram.getProgramHandle();
     EffectQueue.getUniforms(mMainProgramH,0);
+    MeshBase.getUniforms(mMainProgramH,0);
     mMainTextureH= GLES30.glGetUniformLocation( mMainProgramH, "u_Texture");
     mTransformFeedbackH= GLES30.glGetUniformLocation( mMainProgramH, "u_TransformFeedback");
 
@@ -362,6 +363,7 @@ public class DistortedLibrary
 
     mFullProgramH = mFullProgram.getProgramHandle();
     EffectQueue.getUniforms(mFullProgramH,3);
+    MeshBase.getUniforms(mFullProgramH,3);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -396,6 +398,7 @@ public class DistortedLibrary
 
     mMainOITProgramH = mMainOITProgram.getProgramHandle();
     EffectQueue.getUniforms(mMainOITProgramH,1);
+    MeshBase.getUniforms(mMainOITProgramH,1);
     mMainOITTextureH    = GLES30.glGetUniformLocation( mMainOITProgramH, "u_Texture");
     mMainOITSizeH       = GLES30.glGetUniformLocation( mMainOITProgramH, "u_Size");
     mMainOITNumRecordsH = GLES30.glGetUniformLocation( mMainOITProgramH, "u_numRecords");
@@ -545,7 +548,7 @@ public class DistortedLibrary
     mesh.bindVertexAttribs(mFullProgram);
     queue.compute(1);
     queue.send(0.0f,3);
-    mesh.send(mFullProgramH);
+    mesh.send(mFullProgramH,3);
 
     GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo );
     GLES30.glBeginTransformFeedback( GLES30.GL_POINTS);
@@ -573,7 +576,7 @@ public class DistortedLibrary
       GLES30.glUniform2ui(mMainOITSizeH, surface.mWidth, surface.mHeight);
       GLES30.glUniform1ui(mMainOITNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) );
       mesh.bindVertexAttribs(mMainOITProgram);
-      mesh.send(mMainOITProgramH);
+      mesh.send(mMainOITProgramH,1);
 
       float inflate     = mesh.getInflate();
       float distance    = surface.mDistance;
@@ -586,7 +589,7 @@ public class DistortedLibrary
       if( mesh.getShowNormals() )
         {
         mMainProgram.useProgram();
-        mesh.send(mMainProgramH);
+        mesh.send(mMainProgramH,0);
         EffectQueue.send(queues, distance, mipmap, projection, inflate, 0 );
         displayNormals(projection,mesh);
         }
@@ -607,7 +610,7 @@ public class DistortedLibrary
       mMainProgram.useProgram();
       GLES30.glUniform1i(DistortedLibrary.mMainTextureH, 0);
       mesh.bindVertexAttribs(DistortedLibrary.mMainProgram);
-      mesh.send(mMainProgramH);
+      mesh.send(mMainProgramH,0);
 
       float inflate     = mesh.getInflate();
       float distance    = surface.mDistance;
diff --git a/src/main/java/org/distorted/library/mesh/MeshBase.java b/src/main/java/org/distorted/library/mesh/MeshBase.java
index 7572abc..55488f7 100644
--- a/src/main/java/org/distorted/library/mesh/MeshBase.java
+++ b/src/main/java/org/distorted/library/mesh/MeshBase.java
@@ -25,6 +25,7 @@ import android.util.Log;
 
 import org.distorted.library.effect.MatrixEffect;
 import org.distorted.library.effect.VertexEffect;
+import org.distorted.library.effectqueue.EffectQueue;
 import org.distorted.library.main.InternalBuffer;
 import org.distorted.library.program.DistortedProgram;
 import org.distorted.library.type.Static4D;
@@ -87,6 +88,9 @@ public abstract class MeshBase
 
    DeferredJobs.JobNode[] mJobNode;
 
+   private static int[] mCenterBlockIndex = new int[EffectQueue.MAIN_VARIANTS];
+   private static int[] mAssocBlockIndex  = new int[EffectQueue.MAIN_VARIANTS];
+
    private static final int TEX_COMP_SIZE = 5; // 5 four-byte entities inside the component
 
    private static class TexComponent
@@ -531,6 +535,14 @@ public abstract class MeshBase
      return MAX_EFFECT_COMPONENTS;
      }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public static void getUniforms(int programH, int variant)
+     {
+     mCenterBlockIndex[variant]= GLES30.glGetUniformBlockIndex(programH, "componentCenter");
+     mAssocBlockIndex[variant] = GLES30.glGetUniformBlockIndex(programH, "componentAssociation");
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Not part of public API, do not document (public only because has to be used from the main package)
@@ -676,15 +688,15 @@ public abstract class MeshBase
  *
  * @y.exclude
  */
-   public void send(int programH)
+   public void send(int programH, int variant)
      {
      int indexA = mUBA.getIndex();
      GLES30.glBindBufferBase(GLES30.GL_UNIFORM_BUFFER, ASSOC_UBO_BINDING, indexA);
-     GLES30.glUniformBlockBinding(programH, ASSOC_UBO_BINDING, indexA);
+     GLES30.glUniformBlockBinding(programH, mAssocBlockIndex[variant], ASSOC_UBO_BINDING);
 
      int indexC = mUBC.getIndex();
      GLES30.glBindBufferBase(GLES30.GL_UNIFORM_BUFFER, CENTER_UBO_BINDING, indexC);
-     GLES30.glUniformBlockBinding(programH, CENTER_UBO_BINDING, indexC);
+     GLES30.glUniformBlockBinding(programH, mCenterBlockIndex[variant], CENTER_UBO_BINDING);
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/res/raw/main_vertex_shader.glsl b/src/main/res/raw/main_vertex_shader.glsl
index 6ee4f1e..9e04bd7 100644
--- a/src/main/res/raw/main_vertex_shader.glsl
+++ b/src/main/res/raw/main_vertex_shader.glsl
@@ -39,7 +39,7 @@ uniform mat4 u_MVMatrixV;             // the combined model/view matrix. (for ve
 uniform float u_Inflate;              // how much should we inflate (>0.0) or deflate (<0.0) the mesh.
 uniform int u_TransformFeedback;      // are we doing the transform feedback now?
 
-layout (std140, binding=4) uniform componentCenter
+layout (std140) uniform componentCenter
   {
   vec4 vComCenter[MAX_COMPON];        // centers of mesh components. 4 floats: (x,y,z,unused)
   };
@@ -56,7 +56,7 @@ uniform vec4 vUniforms[3*NUM_VERTEX]; // i-th effect is 3 consecutive vec4's: [3
                                       // The first vec4 is the Interpolated values,
                                       // second vec4: first float - cache, next 3: Center, the third -  the Region.
 
-layout (std140, binding=3) uniform componentAssociation
+layout (std140) uniform componentAssociation
   {
   ivec4 vComAssoc[MAX_COMPON];        // component Associations, 4 ints:
                                       // 1: component's AND association
