commit ae71f169e67998db82344b3f084f64243f10cd25
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Dec 22 00:57:09 2022 +0100

    Finally fix the reason foor 'incorrect vertex attribute' message spamming the Log of the Emulator.

diff --git a/src/main/java/org/distorted/library/mesh/MeshBase.java b/src/main/java/org/distorted/library/mesh/MeshBase.java
index f9178fe..30500c5 100644
--- a/src/main/java/org/distorted/library/mesh/MeshBase.java
+++ b/src/main/java/org/distorted/library/mesh/MeshBase.java
@@ -811,13 +811,21 @@ public abstract class MeshBase
 
      int index1 = mVBO1.createImmediatelyFloat(mNumVertices*VERT1_SIZE, mVertAttribs1);
      int index2 = mVBO2.createImmediatelyFloat(mNumVertices*VERT2_SIZE, mVertAttribs2);
+     int[] attr = program.mAttribute;
 
      GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, index1 );
-     GLES30.glVertexAttribPointer(program.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, VERT1_SIZE, OFFSET_POS);
-     GLES30.glVertexAttribPointer(program.mAttribute[1], NOR_DATA_SIZE, GLES30.GL_FLOAT, false, VERT1_SIZE, OFFSET_NOR);
+     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(program.mAttribute[2], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, VERT2_SIZE, OFFSET_TEX);
-     GLES30.glVertexAttribPointer(program.mAttribute[3], COM_DATA_SIZE, GLES30.GL_FLOAT, false, VERT2_SIZE, OFFSET_COM);
+     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 )
+       {
+       GLES30.glVertexAttribPointer(attr[3], COM_DATA_SIZE, GLES30.GL_FLOAT, false, VERT2_SIZE, OFFSET_COM);
+       }
+
      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 ea1e83b..b4d461b 100644
--- a/src/main/java/org/distorted/library/program/DistortedProgram.java
+++ b/src/main/java/org/distorted/library/program/DistortedProgram.java
@@ -191,7 +191,6 @@ public class DistortedProgram
 
           if( currChar==' ' || currChar=='\t' )
             {
-            mNumAttributes++;
             return subline.substring(nameBegin+1,subLen);
             }
           }
@@ -230,7 +229,11 @@ public class DistortedProgram
         }
       }
 
-    if( doAttributes ) mAttributeName = attrList.split(" ");
+    if( doAttributes )
+      {
+      mAttributeName = attrList.split(" ");
+      mNumAttributes = mAttributeName.length;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -268,7 +271,11 @@ public class DistortedProgram
       return null;
       }
 
-    if( doAttributes ) mAttributeName = attrList.split(" ");
+    if( doAttributes )
+      {
+      mAttributeName = attrList.split(" ");
+      mNumAttributes = mAttributeName.length;
+      }
 
     return body.toString();
     }
@@ -333,30 +340,39 @@ public class DistortedProgram
 
   private void setUpAttributes()
     {
-    mAttribute = new int[mNumAttributes];
+    int[] att = new int[mNumAttributes];
 
     for(int i=0; i<mNumAttributes; i++)
       {
-      mAttribute[i] = GLES30.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
+      att[i] = GLES30.glGetAttribLocation( mProgramHandle, mAttributeName[i]);
       }
 
     int emptyAttrs = 0;
 
     for(int i=0; i<mNumAttributes; i++)
       {
-      if( mAttribute[i] < 0 )
+      if( att[i] < 0 )
         {
         emptyAttrs++;
 
         for(int j=i; j<mNumAttributes-1; j++)
           {
-          mAttribute[j] = mAttribute[j+1];
+          att[j] = att[j+1];
           mAttributeName[j] = mAttributeName[j+1];
           }
         }
       }
 
-    mNumAttributes -= emptyAttrs;
+    if( emptyAttrs>0 )
+      {
+      mNumAttributes -= emptyAttrs;
+      mAttribute = new int[mNumAttributes];
+      System.arraycopy(att, 0, mAttribute, 0, mNumAttributes);
+      }
+    else
+      {
+      mAttribute = att;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
