commit 728a7820c6209f3af7c5b9a4d09493808501f46a
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Nov 25 10:19:54 2020 +0100

    Fix the fact that we would keep adding new InternalBuffers to the 'Done' list - split 'invalidate()' and 'recreate()' to two separate actions!

diff --git a/src/main/java/org/distorted/library/main/InternalBuffer.java b/src/main/java/org/distorted/library/main/InternalBuffer.java
index 2a6c5bc..1545b7f 100644
--- a/src/main/java/org/distorted/library/main/InternalBuffer.java
+++ b/src/main/java/org/distorted/library/main/InternalBuffer.java
@@ -38,6 +38,10 @@ import java.nio.IntBuffer;
  */
 public class InternalBuffer extends InternalObject
   {
+  private static final int RECREATE = 1;
+  private static final int UPDATE   = 2;
+
+  private int mStatus;
   private final int[] mIndex;
   private int mTarget, mSize, mUsage;
   private Buffer mBuffer;
@@ -62,7 +66,7 @@ public class InternalBuffer extends InternalObject
 
   public int createImmediatelyFloat(int size, float[] buffer)
     {
-    if( mIndex[0]<0 )
+    if( (mStatus & RECREATE) != 0 )
       {
       mSize= size;
 
@@ -84,6 +88,12 @@ public class InternalBuffer extends InternalObject
 
       markWasCreatedImmediately();
       }
+    else if( (mStatus & UPDATE) != 0 )
+      {
+      updateFloat(buffer);
+      }
+
+    mStatus = 0;
 
     return mIndex[0];
     }
@@ -93,7 +103,7 @@ public class InternalBuffer extends InternalObject
 
   public int createImmediatelyInt(int size, int[] buffer)
     {
-    if( mIndex[0]<0 )
+    if( (mStatus & RECREATE) != 0 )
       {
       mSize= size;
 
@@ -115,6 +125,12 @@ public class InternalBuffer extends InternalObject
 
       markWasCreatedImmediately();
       }
+    else if( (mStatus & UPDATE) != 0  )
+      {
+      updateInt(buffer);
+      }
+
+    mStatus = 0;
 
     return mIndex[0];
     }
@@ -147,7 +163,7 @@ public class InternalBuffer extends InternalObject
 
   public void invalidate()
     {
-    recreate();
+    mStatus |= UPDATE;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -155,13 +171,10 @@ public class InternalBuffer extends InternalObject
 
   void create()
     {
-    if( mIndex[0]<0 )
-      {
-      GLES30.glGenBuffers( 1, mIndex, 0);
-      GLES30.glBindBuffer( mTarget, mIndex[0]);
-      GLES30.glBufferData( mTarget, mSize, mBuffer, mUsage);
-      GLES30.glBindBuffer( mTarget, 0);
-      }
+    GLES30.glGenBuffers( 1, mIndex, 0);
+    GLES30.glBindBuffer( mTarget, mIndex[0]);
+    GLES30.glBufferData( mTarget, mSize, mBuffer, mUsage);
+    GLES30.glBindBuffer( mTarget, 0);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -169,19 +182,16 @@ public class InternalBuffer extends InternalObject
 
   void delete()
     {
-    if( mIndex[0]>=0 )
-      {
-      GLES30.glDeleteBuffers(1, mIndex, 0);
-      mIndex[0] = -1;
-      removeFromDone();
-      }
+    GLES30.glDeleteBuffers(1, mIndex, 0);
+    mStatus |= RECREATE;
+    removeFromDone();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void recreate()
+  public void recreate()
     {
-    mIndex[0] = -1;
+    mStatus |= RECREATE;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/mesh/MeshBase.java b/src/main/java/org/distorted/library/mesh/MeshBase.java
index 5f6c17a..34c454c 100644
--- a/src/main/java/org/distorted/library/mesh/MeshBase.java
+++ b/src/main/java/org/distorted/library/mesh/MeshBase.java
@@ -180,7 +180,6 @@ public abstract class MeshBase
      mVBO1= new InternalBuffer(GLES30.GL_ARRAY_BUFFER, GLES30.GL_STATIC_READ);
      mVertAttribs1= new float[mNumVertices*VERT1_ATTRIBS];
      System.arraycopy(original.mVertAttribs1,0,mVertAttribs1,0,mNumVertices*VERT1_ATTRIBS);
-     mVBO1.invalidate();
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -202,7 +201,6 @@ public abstract class MeshBase
      mVBO2= new InternalBuffer(GLES30.GL_ARRAY_BUFFER, GLES30.GL_STATIC_READ);
      mVertAttribs2= new float[mNumVertices*VERT2_ATTRIBS];
      System.arraycopy(original.mVertAttribs2,0,mVertAttribs2,0,mNumVertices*VERT2_ATTRIBS);
-     mVBO2.invalidate();
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/mesh/UniformBlockAssociation.java b/src/main/java/org/distorted/library/mesh/UniformBlockAssociation.java
index 333ebd0..2c85ec6 100644
--- a/src/main/java/org/distorted/library/mesh/UniformBlockAssociation.java
+++ b/src/main/java/org/distorted/library/mesh/UniformBlockAssociation.java
@@ -63,33 +63,55 @@ class UniformBlockAssociation
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   boolean matchesAssociation( int comp, int andAssoc, int equAssoc)
-     {
-     return (andAssoc & mAssociations[4*comp]) != 0 || (equAssoc == mAssociations[4*comp+2]);
-     }
+  boolean matchesAssociation( int comp, int andAssoc, int equAssoc)
+    {
+    return (andAssoc & mAssociations[4*comp]) != 0 || (equAssoc == mAssociations[4*comp+2]);
+    }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   void setEffectAssociationNow(int comp, int andAssociation, int equAssociation)
-     {
-     mAssociations[4*comp  ] = andAssociation;
-     mAssociations[4*comp+2] = equAssociation;
+  void setEffectAssociationNow(int comp, int andAssociation, int equAssociation)
+    {
+    mAssociations[4*comp  ] = andAssociation;
+    mAssociations[4*comp+2] = equAssociation;
 
-     mUBO.invalidate();
-     }
+    mUBO.invalidate();
+    }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   int getIndex()
-     {
-     return mUBO.createImmediatelyInt( BLOCK_SIZE, mAssociations);
-     }
+  int getIndex()
+    {
+    return mUBO.createImmediatelyInt( BLOCK_SIZE, mAssociations);
+    }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   void copy(int compTo, UniformBlockAssociation assocFrom, int compFrom)
-     {
-     mAssociations[4*compTo  ] = assocFrom.mAssociations[4*compFrom  ];
-     mAssociations[4*compTo+2] = assocFrom.mAssociations[4*compFrom+2];
-     }
+  void copy(int compTo, UniformBlockAssociation assocFrom, int compFrom)
+    {
+    mAssociations[4*compTo  ] = assocFrom.mAssociations[4*compFrom  ];
+    mAssociations[4*compTo+2] = assocFrom.mAssociations[4*compFrom+2];
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void print()
+    {
+    StringBuilder builder = new StringBuilder();
+
+    builder.append(mUBO.getID());
+    builder.append(' ');
+
+    for(int i=0; i<8; i++)
+      {
+      builder.append(mAssociations[4*i]);
+      builder.append(' ');
+      builder.append(mAssociations[4*i+2]);
+      builder.append(' ');
+      }
+
+    String res = builder.toString();
+
+    android.util.Log.e("uba", res);
+    }
   }
