commit fd836c4e19ec58c0ee0fd669d8ffc45e7c361a82
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Aug 23 14:07:25 2021 +0200

    Convert the two Squares to the new scheme.

diff --git a/src/main/java/org/distorted/objects/TwistySquare.java b/src/main/java/org/distorted/objects/TwistySquare.java
index 67ceffd4..2f57d319 100644
--- a/src/main/java/org/distorted/objects/TwistySquare.java
+++ b/src/main/java/org/distorted/objects/TwistySquare.java
@@ -166,64 +166,6 @@ abstract class TwistySquare extends TwistyObject
     super(size, size, quat, texture, mesh, effects, moves, obj, res, scrWidth);
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  MeshBase createMiddleCubitMesh()
-    {
-    if( mMeshes[0]==null )
-      {
-      float[][] bands= new float[][]
-        {
-           {0.040f,35,0.8f,1.0f,5,2,1},
-           {0.020f,35,0.8f,1.0f,5,2,1},
-           {0.001f,35,0.8f,1.0f,5,2,1}
-        };
-      int[] bandIndexes   = new int[] { 2,2,1,1,0,2 };
-      float[][] corners   = new float[][] { {0.03f,0.05f} };
-      int[] cornerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
-      float[][] centers   = new float[][] { { -0.75f, 0.0f, 0.0f} };
-      int[] centerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
-
-      FactoryCubit factory = FactoryCubit.getInstance();
-      factory.createNewFaceTransform(VERTICES_MIDDLE,VERT_INDEXES_MIDDLE);
-      mMeshes[0] = factory.createRoundedSolid(VERTICES_MIDDLE, VERT_INDEXES_MIDDLE,
-                                              bands, bandIndexes,
-                                              corners, cornerIndexes,
-                                              centers, centerIndexes,
-                                              getNumCubitFaces(), null );
-      }
-
-    return mMeshes[0].copy(true);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  MeshBase createEdgeCubitMesh()
-    {
-    if( mMeshes[1]==null )
-       {
-       float[][] bands= new float[][]
-         {
-           {0.038f,35,0.5f,0.9f, 5,2,1},
-           {0.001f,35,0.5f,0.9f, 5,2,1}
-         };
-       int[] bandIndexes   = new int[] { 0,1,0,1,1 };
-       float[][] corners   = new float[][] { {0.04f,0.15f} };
-       int[] cornerIndexes = new int[] { 0,0,-1,0,0,-1 };
-       float[][] centers   = new float[][] { { 0.0f, 0.0f,-0.5f} };
-       int[] centerIndexes = new int[] { 0,0,-1,0,0,-1 };
-
-       FactoryCubit factory = FactoryCubit.getInstance();
-       factory.createNewFaceTransform(VERTICES_EDGE,VERT_INDEXES_EDGE);
-       mMeshes[1] = factory.createRoundedSolid(VERTICES_EDGE, VERT_INDEXES_EDGE,
-                                               bands, bandIndexes,
-                                               corners, cornerIndexes,
-                                               centers, centerIndexes,
-                                               getNumCubitFaces(), null );
-       }
-    return mMeshes[1].copy(true);
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   Static4D[] getQuats()
diff --git a/src/main/java/org/distorted/objects/TwistySquare1.java b/src/main/java/org/distorted/objects/TwistySquare1.java
index 7c1cb245..0ef0a6a8 100644
--- a/src/main/java/org/distorted/objects/TwistySquare1.java
+++ b/src/main/java/org/distorted/objects/TwistySquare1.java
@@ -22,6 +22,7 @@ package org.distorted.objects;
 import android.content.res.Resources;
 
 import org.distorted.helpers.FactoryCubit;
+import org.distorted.helpers.ObjectShape;
 import org.distorted.helpers.ObjectSticker;
 import org.distorted.library.effect.MatrixEffectQuaternion;
 import org.distorted.library.main.DistortedEffects;
@@ -181,57 +182,89 @@ class TwistySquare1 extends TwistySquare
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private Static4D getQuat(int cubit)
+  ObjectShape getObjectShape(int cubit, int numLayers)
+    {
+    int variant = getCubitVariant(cubit,numLayers);
+
+    if( variant==0 )
+      {
+      float[][] bands     = new float[][] { {0.040f,35,0.8f,1.0f,5,2,1}, {0.020f,35,0.8f,1.0f,5,2,1}, {0.001f,35,0.8f,1.0f,5,2,1} };
+      int[] bandIndices   = new int[] { 2,2,1,1,0,2 };
+      float[][] corners   = new float[][] { {0.03f,0.05f} };
+      int[] cornerIndices = new int[] { 0,0,0,0,0,0,0,0 };
+      float[][] centers   = new float[][] { { -0.75f, 0.0f, 0.0f} };
+      int[] centerIndices = new int[] { 0,0,0,0,0,0,0,0 };
+
+      return new ObjectShape(VERTICES_MIDDLE,VERT_INDEXES_MIDDLE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
+      }
+    else if( variant==1 )
+      {
+      float[][] bands     = new float[][] { {0.038f,35,0.5f,0.9f, 5,2,1}, {0.001f,35,0.5f,0.9f, 5,2,1} };
+      int[] bandIndices   = new int[] { 0,1,0,1,1 };
+      float[][] corners   = new float[][] { {0.04f,0.15f} };
+      int[] cornerIndices = new int[] { 0,0,-1,0,0,-1 };
+      float[][] centers   = new float[][] { { 0.0f, 0.0f,-0.5f} };
+      int[] centerIndices = new int[] { 0,0,-1,0,0,-1 };
+
+      return new ObjectShape(VERTICES_EDGE,VERT_INDEXES_EDGE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
+      }
+    else
+      {
+      float[][] bands     = new float[][] { {0.038f,35,0.9f,1.0f, 5,2,1}, {0.001f,35,0.9f,1.0f, 5,2,1} };
+      int[] bandIndices   = new int[] { 0,1,0,0,1,1 };
+      float[][] corners   = new float[][] { {0.05f,0.13f} };
+      int[] cornerIndices = new int[] { 0,0,0,-1,0,0,0,-1 };
+      float[][] centers   = new float[][] { { -0.5f, 0.0f,-0.5f} };
+      int[] centerIndices = new int[] { -1,0,-1,-1,-1,0,-1,-1 };
+
+      return new ObjectShape(VERTICES_CORNER,VERT_INDEXES_CORNER,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private Static4D getQuat(int cubit, int numLayers)
     {
     return QUATS[QUAT_NUMBER[cubit]];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  MeshBase createCornerCubitMesh()
+  private int getNumCubitVariants(int numLayers)
     {
-    if( mMeshes[2]==null )
-      {
-      float[][] bands= new float[][]
-        {
-          {0.038f,35,0.9f,1.0f, 5,2,1},
-          {0.001f,35,0.9f,1.0f, 5,2,1}
-        };
-      int[] bandIndexes   = new int[] { 0,1,0,0,1,1 };
-      float[][] corners   = new float[][] { {0.05f,0.13f} };
-      int[] cornerIndexes = new int[] { 0,0,0,-1,0,0,0,-1 };
-      float[][] centers   = new float[][] { { -0.5f, 0.0f,-0.5f} };
-      int[] centerIndexes = new int[] { -1,0,-1,-1,-1,0,-1,-1 };
+    return 3;
+    }
 
-      FactoryCubit factory = FactoryCubit.getInstance();
-      factory.createNewFaceTransform(VERTICES_CORNER,VERT_INDEXES_CORNER);
-      mMeshes[2] = factory.createRoundedSolid(VERTICES_CORNER, VERT_INDEXES_CORNER,
-                                              bands, bandIndexes,
-                                              corners, cornerIndexes,
-                                              centers, centerIndexes,
-                                              getNumCubitFaces(), null );
-      }
-    return mMeshes[2].copy(true);
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getCubitVariant(int cubit, int numLayers)
+    {
+    return cubit<2 ? 0 : (cubit<10 ? 1:2);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   MeshBase createCubitMesh(int cubit, int numLayers)
     {
+    int variant = getCubitVariant(cubit,numLayers);
+
     if( mMeshes==null )
       {
       FactoryCubit factory = FactoryCubit.getInstance();
       factory.clear();
-      mMeshes = new MeshBase[4];
+      mMeshes = new MeshBase[getNumCubitVariants(numLayers)];
       }
 
-    MeshBase mesh;
-
-         if( cubit< 2 ) mesh = createMiddleCubitMesh();
-    else if( cubit<10 ) mesh = createEdgeCubitMesh();
-    else                mesh = createCornerCubitMesh();
+    if( mMeshes[variant]==null )
+      {
+      ObjectShape shape = getObjectShape(cubit,numLayers);
+      FactoryCubit factory = FactoryCubit.getInstance();
+      factory.createNewFaceTransform(shape);
+      mMeshes[variant] = factory.createRoundedSolid(shape);
+      }
 
-    MatrixEffectQuaternion quat = new MatrixEffectQuaternion( getQuat(cubit), new Static3D(0,0,0) );
+    MeshBase mesh = mMeshes[variant].copy(true);
+    MatrixEffectQuaternion quat = new MatrixEffectQuaternion( getQuat(cubit,numLayers), new Static3D(0,0,0) );
     mesh.apply(quat,0xffffffff,0);
 
     return mesh;
@@ -262,13 +295,8 @@ class TwistySquare1 extends TwistySquare
 
   int getFaceColor(int cubit, int cubitface, int numLayers)
     {
-    int type;
-
-         if( cubit< 2 ) type = 0;
-    else if( cubit<10 ) type = 1;
-    else                type = 2;
-
-    return mStickerType[type][cubitface]*FACE_COLORS.length + mStickerColor[cubit][cubitface];
+    int variant = getCubitVariant(cubit,numLayers);
+    return mStickerType[variant][cubitface]*FACE_COLORS.length + mStickerColor[cubit][cubitface];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistySquare2.java b/src/main/java/org/distorted/objects/TwistySquare2.java
index 4b8a37c8..b3cc18f7 100644
--- a/src/main/java/org/distorted/objects/TwistySquare2.java
+++ b/src/main/java/org/distorted/objects/TwistySquare2.java
@@ -22,6 +22,7 @@ package org.distorted.objects;
 import android.content.res.Resources;
 
 import org.distorted.helpers.FactoryCubit;
+import org.distorted.helpers.ObjectShape;
 import org.distorted.helpers.ObjectSticker;
 import org.distorted.library.effect.MatrixEffectQuaternion;
 import org.distorted.library.main.DistortedEffects;
@@ -186,57 +187,89 @@ class TwistySquare2 extends TwistySquare
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private Static4D getQuat(int cubit)
+  ObjectShape getObjectShape(int cubit, int numLayers)
     {
-    return QUATS[QUAT_NUMBER[cubit]];
-    }
+    int variant = getCubitVariant(cubit,numLayers);
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
+    if( variant==0 )
+      {
+      float[][] bands     = new float[][] { {0.040f,35,0.8f,1.0f,5,2,1}, {0.020f,35,0.8f,1.0f,5,2,1}, {0.001f,35,0.8f,1.0f,5,2,1} };
+      int[] bandIndices   = new int[] { 2,2,1,1,0,2 };
+      float[][] corners   = new float[][] { {0.03f,0.05f} };
+      int[] cornerIndices = new int[] { 0,0,0,0,0,0,0,0 };
+      float[][] centers   = new float[][] { { -0.75f, 0.0f, 0.0f} };
+      int[] centerIndices = new int[] { 0,0,0,0,0,0,0,0 };
+
+      return new ObjectShape(VERTICES_MIDDLE,VERT_INDEXES_MIDDLE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
+      }
+    else if( variant==1 )
+      {
+      float[][] bands     = new float[][] { {0.038f,35,0.5f,0.9f, 5,2,1}, {0.001f,35,0.5f,0.9f, 5,2,1} };
+      int[] bandIndices   = new int[] { 0,1,0,1,1 };
+      float[][] corners   = new float[][] { {0.04f,0.15f} };
+      int[] cornerIndices = new int[] { 0,0,-1,0,0,-1 };
+      float[][] centers   = new float[][] { { 0.0f, 0.0f,-0.5f} };
+      int[] centerIndices = new int[] { 0,0,-1,0,0,-1 };
 
-  MeshBase createCornerCubitMesh()
-    {
-    if( mMeshes[3]==null )
+      return new ObjectShape(VERTICES_EDGE,VERT_INDEXES_EDGE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
+      }
+    else
       {
-      float[][] bands= new float[][]
-        {
-          {0.030f,35,0.9f,1.0f, 5,2,1},
-          {0.001f,35,0.9f,1.0f, 5,2,1}
-        };
-      int[] bandIndexes   = new int[] { 0,0,0,1,1 };
+      float[][] bands     = new float[][] { {0.030f,35,0.9f,1.0f, 5,2,1}, {0.001f,35,0.9f,1.0f, 5,2,1} };
+      int[] bandIndices   = new int[] { 0,0,0,1,1 };
       float[][] corners   = new float[][] { {0.05f,0.13f} };
-      int[] cornerIndexes = new int[] { 0,0,-1,0,0,-1 };
+      int[] cornerIndices = new int[] { 0,0,-1,0,0,-1 };
       float[][] centers   = new float[][] { { 0.0f, 0.0f,-0.5f} };
-      int[] centerIndexes = new int[] { 0,0,-1,0,0,-1 };
+      int[] centerIndices = new int[] { 0,0,-1,0,0,-1 };
 
-      FactoryCubit factory = FactoryCubit.getInstance();
-      factory.createNewFaceTransform(VERTICES_CORNER,VERT_INDEXES_CORNER);
-      mMeshes[3] = factory.createRoundedSolid(VERTICES_CORNER, VERT_INDEXES_CORNER,
-                                              bands, bandIndexes,
-                                              corners, cornerIndexes,
-                                              centers, centerIndexes,
-                                              getNumCubitFaces(), null );
+      return new ObjectShape(VERTICES_CORNER,VERT_INDEXES_CORNER,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
       }
-    return mMeshes[3].copy(true);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private Static4D getQuat(int cubit, int numLayers)
+    {
+    return QUATS[QUAT_NUMBER[cubit]];
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int getNumCubitVariants(int numLayers)
+    {
+    return 3;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getCubitVariant(int cubit, int numLayers)
+    {
+    return cubit<2 ? 0 : (cubit<10 ? 1:2);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   MeshBase createCubitMesh(int cubit, int numLayers)
     {
+    int variant = getCubitVariant(cubit,numLayers);
+
     if( mMeshes==null )
       {
       FactoryCubit factory = FactoryCubit.getInstance();
       factory.clear();
-      mMeshes = new MeshBase[4];
+      mMeshes = new MeshBase[getNumCubitVariants(numLayers)];
       }
 
-    MeshBase mesh;
-
-         if( cubit< 2 ) mesh = createMiddleCubitMesh();
-    else if( cubit<10 ) mesh = createEdgeCubitMesh();
-    else                mesh = createCornerCubitMesh();
+    if( mMeshes[variant]==null )
+      {
+      ObjectShape shape = getObjectShape(cubit,numLayers);
+      FactoryCubit factory = FactoryCubit.getInstance();
+      factory.createNewFaceTransform(shape);
+      mMeshes[variant] = factory.createRoundedSolid(shape);
+      }
 
-    MatrixEffectQuaternion quat = new MatrixEffectQuaternion( getQuat(cubit), new Static3D(0,0,0) );
+    MeshBase mesh = mMeshes[variant].copy(true);
+    MatrixEffectQuaternion quat = new MatrixEffectQuaternion( getQuat(cubit,numLayers), new Static3D(0,0,0) );
     mesh.apply(quat,0xffffffff,0);
 
     return mesh;
