commit c92c163c212d3a1c7f625b3498fa4bbaab250d3a
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Oct 6 23:08:01 2020 +0100

    New API for the library: add an empty texture component to a Mesh.
    Use this in thr Magic Cube to add empty texture components to some types of cubits.

diff --git a/src/main/java/org/distorted/library/mesh/DeferredJobs.java b/src/main/java/org/distorted/library/mesh/DeferredJobs.java
index 205bcc2..9fa3b1f 100644
--- a/src/main/java/org/distorted/library/mesh/DeferredJobs.java
+++ b/src/main/java/org/distorted/library/mesh/DeferredJobs.java
@@ -37,15 +37,16 @@ import android.util.Log;
  */
 public class DeferredJobs
   {
-  private static final int JOB_TYPE_VERTEX   = 0;
-  private static final int JOB_TYPE_MATRIX   = 1;
-  private static final int JOB_TYPE_MERGE_TEX= 2;
-  private static final int JOB_TYPE_MERGE_EFF= 3;
-  private static final int JOB_TYPE_JOIN     = 4;
-  private static final int JOB_TYPE_COPY     = 5;
-  private static final int JOB_TYPE_TEXTURE  = 6;
-  private static final int JOB_TYPE_ASSOC    = 7;
-  private static final int JOB_TYPE_CENTER   = 8;
+  private static final int JOB_TYPE_VERTEX       = 0;
+  private static final int JOB_TYPE_MATRIX       = 1;
+  private static final int JOB_TYPE_MERGE_TEX    = 2;
+  private static final int JOB_TYPE_MERGE_EFF    = 3;
+  private static final int JOB_TYPE_JOIN         = 4;
+  private static final int JOB_TYPE_COPY         = 5;
+  private static final int JOB_TYPE_TEXTURE      = 6;
+  private static final int JOB_TYPE_ASSOC        = 7;
+  private static final int JOB_TYPE_CENTER       = 8;
+  private static final int JOB_TYPE_ADD_EMPTY_TEX= 9;
 
   private static ArrayList<JobNode> mJobs = new ArrayList<>();
 
@@ -62,7 +63,8 @@ public class DeferredJobs
     private int mComp, mAndAssoc, mEquAssoc;
     private float mX,mY,mZ;
 
-    Job(int type, MeshBase target, MeshBase[] source, VertexEffect vEff, MatrixEffect mEff, Static4D[] maps, int comp, int and, int equ, float x, float y, float z)
+    Job(int type, MeshBase target, MeshBase[] source, VertexEffect vEff, MatrixEffect mEff,
+        Static4D[] maps, int comp, int and, int equ, float x, float y, float z)
       {
       mType     = type;
       mTarget   = target;
@@ -93,29 +95,27 @@ public class DeferredJobs
       {
       switch(mType)
         {
-        case JOB_TYPE_VERTEX   : DistortedLibrary.adjustVertices(mTarget, mVertexEffects);
-                                 break;
-        case JOB_TYPE_MATRIX   : mTarget.applyMatrix(mMatrixEffect,mAndAssoc,mEquAssoc);
-                                 break;
-        case JOB_TYPE_MERGE_TEX: mTarget.mergeTexComponentsNow();
-                                 break;
-        case JOB_TYPE_MERGE_EFF: mTarget.mergeEffComponentsNow();
-                                 break;
-        case JOB_TYPE_JOIN     : mTarget.joinAttribs(mSource);
-                                 break;
-        case JOB_TYPE_COPY     : mTarget.copy(mSource[0]);
-                                 break;
-        case JOB_TYPE_TEXTURE  : mTarget.textureMap(mMaps,mComp);
-                                 break;
-        case JOB_TYPE_ASSOC    : mTarget.setEffectAssociationNow(mComp,mAndAssoc,mEquAssoc);
-                                 break;
-        case JOB_TYPE_CENTER   : mTarget.setComponentCenterNow(mComp,mX,mY,mZ);
-                                 break;
+        case JOB_TYPE_VERTEX       : DistortedLibrary.adjustVertices(mTarget, mVertexEffects);
+                                     break;
+        case JOB_TYPE_MATRIX       : mTarget.applyMatrix(mMatrixEffect,mAndAssoc,mEquAssoc);
+                                     break;
+        case JOB_TYPE_MERGE_TEX    : mTarget.mergeTexComponentsNow();
+                                     break;
+        case JOB_TYPE_MERGE_EFF    : mTarget.mergeEffComponentsNow();
+                                     break;
+        case JOB_TYPE_JOIN         : mTarget.joinAttribs(mSource);
+                                     break;
+        case JOB_TYPE_COPY         : mTarget.copy(mSource[0]);
+                                     break;
+        case JOB_TYPE_TEXTURE      : mTarget.textureMap(mMaps,mComp);
+                                     break;
+        case JOB_TYPE_ASSOC        : mTarget.setEffectAssociationNow(mComp,mAndAssoc,mEquAssoc);
+                                     break;
+        case JOB_TYPE_CENTER       : mTarget.setComponentCenterNow(mComp,mX,mY,mZ);
+                                     break;
+        case JOB_TYPE_ADD_EMPTY_TEX: mTarget.addEmptyTexComponentNow();
+                                     break;
         }
-/*
-      Log.e("jobs", "executing "+print()+" job");
-      mTarget.print();
-*/
       }
 
     void clear()
@@ -127,15 +127,16 @@ public class DeferredJobs
       {
       switch(mType)
         {
-        case JOB_TYPE_VERTEX   : return "VERTEX";
-        case JOB_TYPE_MATRIX   : return "MATRIX";
-        case JOB_TYPE_MERGE_TEX: return "MERGE_TEX";
-        case JOB_TYPE_MERGE_EFF: return "MERGE_EFF";
-        case JOB_TYPE_JOIN     : return "JOIN";
-        case JOB_TYPE_COPY     : return "COPY";
-        case JOB_TYPE_TEXTURE  : return "TEXTURE";
-        case JOB_TYPE_ASSOC    : return "ASSOC";
-        case JOB_TYPE_CENTER   : return "CENTER";
+        case JOB_TYPE_VERTEX       : return "VERTEX";
+        case JOB_TYPE_MATRIX       : return "MATRIX";
+        case JOB_TYPE_MERGE_TEX    : return "MERGE_TEX";
+        case JOB_TYPE_MERGE_EFF    : return "MERGE_EFF";
+        case JOB_TYPE_JOIN         : return "JOIN";
+        case JOB_TYPE_COPY         : return "COPY";
+        case JOB_TYPE_TEXTURE      : return "TEXTURE";
+        case JOB_TYPE_ASSOC        : return "ASSOC";
+        case JOB_TYPE_CENTER       : return "CENTER";
+        case JOB_TYPE_ADD_EMPTY_TEX: return "ADD_EMPTY_TEX";
         }
 
       return null;
@@ -289,6 +290,19 @@ public class DeferredJobs
     return node;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static JobNode addEmptyTex(MeshBase target)
+    {
+    JobNode jn = target.mJobNode[0];
+    Job job = new Job(JOB_TYPE_ADD_EMPTY_TEX,target,null,null,null,null,0,0,0,0,0,0);
+    JobNode node = new JobNode(job);
+    node.mPrevJobs.add(jn);
+    jn.mNextJobs.add(node);
+    mJobs.add(node);
+    return node;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   static JobNode mergeEff(MeshBase target)
diff --git a/src/main/java/org/distorted/library/mesh/MeshBase.java b/src/main/java/org/distorted/library/mesh/MeshBase.java
index 55488f7..5a186dd 100644
--- a/src/main/java/org/distorted/library/mesh/MeshBase.java
+++ b/src/main/java/org/distorted/library/mesh/MeshBase.java
@@ -220,6 +220,14 @@ public abstract class MeshBase
        }
      }
 
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   void addEmptyTexComponentNow()
+     {
+     mTexComponent.add(new TexComponent(mNumVertices-1));
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    void mergeEffComponentsNow()
@@ -1210,6 +1218,24 @@ public abstract class MeshBase
        }
      }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Adds an empty (no vertices) texture component to the end of the text component list.
+ *
+ * Sometimes we want to do this to have several Meshes with equal number of tex components each.
+ */
+   public void addEmptyTexComponent()
+     {
+      if( mJobNode[0]==null )
+       {
+       addEmptyTexComponentNow();
+       }
+     else
+       {
+       mJobNode[0] = DeferredJobs.addEmptyTex(this);
+       }
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Return the number of texture components, i.e. individual subsets of the whole set of vertices
