commit e457779102a8c977d1f6443aaf9e09983fa43b28
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Jan 9 13:41:56 2023 +0100

    fix detection of not used attributes.

diff --git a/src/main/java/org/distorted/library/mesh/MeshBase.java b/src/main/java/org/distorted/library/mesh/MeshBase.java
index 30500c5..7a80acd 100644
--- a/src/main/java/org/distorted/library/mesh/MeshBase.java
+++ b/src/main/java/org/distorted/library/mesh/MeshBase.java
@@ -813,17 +813,31 @@ public abstract class MeshBase
      int index2 = mVBO2.createImmediatelyFloat(mNumVertices*VERT2_SIZE, mVertAttribs2);
      int[] attr = program.mAttribute;
 
-     GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, index1 );
-     GLES30.glVertexAttribPointer(attr[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, VERT1_SIZE, OFFSET_POS);
-     GLES30.glVertexAttribPointer(attr[1], NOR_DATA_SIZE, GLES30.GL_FLOAT, false, VERT1_SIZE, OFFSET_NOR);
-     GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, index2 );
-     GLES30.glVertexAttribPointer(attr[2], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, VERT2_SIZE, OFFSET_TEX);
-
-     // if we are not using component centers and there are no vertex effects enabled,
-     // then this attribute does not exist in the Vertex Shader
-     if( attr.length>=4 )
+     switch( attr.length )
        {
-       GLES30.glVertexAttribPointer(attr[3], COM_DATA_SIZE, GLES30.GL_FLOAT, false, VERT2_SIZE, OFFSET_COM);
+       // 'normal' case
+       case 4: GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, index1 );
+               GLES30.glVertexAttribPointer(attr[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, VERT1_SIZE, OFFSET_POS);
+               GLES30.glVertexAttribPointer(attr[1], NOR_DATA_SIZE, GLES30.GL_FLOAT, false, VERT1_SIZE, OFFSET_NOR);
+               GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, index2 );
+               GLES30.glVertexAttribPointer(attr[2], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, VERT2_SIZE, OFFSET_TEX);
+               GLES30.glVertexAttribPointer(attr[3], COM_DATA_SIZE, GLES30.GL_FLOAT, false, VERT2_SIZE, OFFSET_COM);
+               break;
+       // if we are not using component centers and there are no vertex effects enabled,
+       // then component attribute does not exist in the Vertex Shader
+       case 3: GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, index1 );
+               GLES30.glVertexAttribPointer(attr[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, VERT1_SIZE, OFFSET_POS);
+               GLES30.glVertexAttribPointer(attr[1], NOR_DATA_SIZE, GLES30.GL_FLOAT, false, VERT1_SIZE, OFFSET_NOR);
+               GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, index2 );
+               GLES30.glVertexAttribPointer(attr[2], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, VERT2_SIZE, OFFSET_TEX);
+               break;
+       // pre program used in EffectQueuePostprocessing does not have v_Normal attribute
+       // (it is not used in the fragment shader)
+       case 2: GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, index1 );
+               GLES30.glVertexAttribPointer(attr[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, VERT1_SIZE, OFFSET_POS);
+               GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, index2 );
+               GLES30.glVertexAttribPointer(attr[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, VERT2_SIZE, OFFSET_TEX);
+               break;
        }
 
      GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0);
diff --git a/src/main/java/org/distorted/library/program/DistortedProgram.java b/src/main/java/org/distorted/library/program/DistortedProgram.java
index b4d461b..fad1d04 100644
--- a/src/main/java/org/distorted/library/program/DistortedProgram.java
+++ b/src/main/java/org/distorted/library/program/DistortedProgram.java
@@ -349,13 +349,13 @@ public class DistortedProgram
 
     int emptyAttrs = 0;
 
-    for(int i=0; i<mNumAttributes; i++)
+    for(int i=0; i<mNumAttributes-emptyAttrs; i++)
       {
       if( att[i] < 0 )
         {
         emptyAttrs++;
 
-        for(int j=i; j<mNumAttributes-1; j++)
+        for(int j=i; j<mNumAttributes-emptyAttrs; j++)
           {
           att[j] = att[j+1];
           mAttributeName[j] = mAttributeName[j+1];
