commit 8655f3fe7d7de5bc47c93747c119135fba597055
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Aug 21 00:58:57 2021 +0200

    Convert Skewb to the new scheme. New smaller mesh for the Master Skewb.

diff --git a/src/main/java/org/distorted/objects/TwistySkewb.java b/src/main/java/org/distorted/objects/TwistySkewb.java
index dd9881b4..2228f480 100644
--- a/src/main/java/org/distorted/objects/TwistySkewb.java
+++ b/src/main/java/org/distorted/objects/TwistySkewb.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;
@@ -465,96 +466,103 @@ public class TwistySkewb extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  MeshBase createCubitMesh(int cubit, int numLayers)
+  ObjectShape getObjectShape(int cubit, int numLayers)
     {
-    if( mMeshes==null )
-      {
-      FactoryCubit factory = FactoryCubit.getInstance();
-      factory.clear();
-      mMeshes = new MeshBase[3];
-      }
-
-    MeshBase mesh;
+    int variant = getCubitVariant(cubit,numLayers);
 
-    int numCorners = getNumCorners();
-    int numEdges   = getNumEdges(numLayers);
-
-    if( cubit<numCorners )
+    if( variant==0 )
       {
-      if( mMeshes[0]==null )
-        {
-        float[][] bands= new float[][]
+      int N = numLayers==2 ? 7:5;
+      int E1= numLayers==2 ? 3:2;
+      int E2= numLayers==2 ? 5:3;
+      float[][] bands= new float[][]
           {
-             {0.028f,35,0.16f,0.7f,7,3,3},
-             {0.000f, 0,1.00f,0.0f,3,1,5}
+             {0.028f,35,0.16f,0.7f,N,E1,E1},
+             {0.000f, 0,1.00f,0.0f,3, 1,E2}
           };
-        int[] bandIndexes   = new int[] { 0,0,0,1,1,1 };
-        float[][] corners   = new float[][] { {0.08f,0.15f}, {0.08f,0.20f} };
-        int[] cornerIndexes = new int[] { 1,1,1,0,0 };
-        float[][] centers   = new float[][] { {-0.25f, -0.25f, -0.25f} };
-        int[] centerIndexes = new int[] { 0,0,0,-1,0 };
-
-        FactoryCubit factory = FactoryCubit.getInstance();
-        factory.createNewFaceTransform(VERTICES_CORNER,VERT_INDEXES_CORNER);
-        mMeshes[0] = factory.createRoundedSolid(VERTICES_CORNER, VERT_INDEXES_CORNER,
-                                                bands, bandIndexes,
-                                                corners, cornerIndexes,
-                                                centers, centerIndexes,
-                                                getNumCubitFaces(), null );
-        }
-      mesh = mMeshes[0].copy(true);
+      int[] bandIndices   = new int[] { 0,0,0,1,1,1 };
+      float[][] corners   = new float[][] { {0.08f,0.15f}, {0.08f,0.20f} };
+      int[] cornerIndices = new int[] { 1,1,1,0,0 };
+      float[][] centers   = new float[][] { {-0.25f, -0.25f, -0.25f} };
+      int[] centerIndices = new int[] { 0,0,0,-1,0 };
+
+      return new ObjectShape(VERTICES_CORNER,VERT_INDEXES_CORNER,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
       }
-    else if( cubit<numCorners+numEdges )
+    else if( variant==1 )
       {
-      if( mMeshes[1]==null )
-        {
-        float[][] bands= new float[][]
+      int N = numLayers==2 ? 7:5;
+      int E = numLayers==2 ? 5:2;
+      float[][] bands= new float[][]
           {
-             {0.035f,30,0.16f,0.8f,7,2,5},
+             {0.035f,30,0.16f,0.8f,N,2,E},
              {0.020f,45,0.16f,0.2f,3,1,2}
           };
-        int[] bandIndexes   = new int[] { 0,0,1,1 };
-        float[][] corners   = new float[][] { {0.07f,0.20f}, {0.02f,0.30f} };
-        int[] cornerIndexes = new int[] { 0,0,1,1 };
-        float[][] centers   = new float[][] { {0.0f, -0.25f, -0.25f} };
-        int[] centerIndexes = new int[] { 0,0,0,0 };
-
-        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 );
-        }
-      mesh = mMeshes[1].copy(true);
+      int[] bandIndices   = new int[] { 0,0,1,1 };
+      float[][] corners   = new float[][] { {0.07f,0.20f}, {0.02f,0.30f} };
+      int[] cornerIndices = new int[] { 0,0,1,1 };
+      float[][] centers   = new float[][] { {0.0f, -0.25f, -0.25f} };
+      int[] centerIndices = new int[] { 0,0,0,0 };
+
+      return new ObjectShape(VERTICES_EDGE,VERT_INDEXES_EDGE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
       }
     else
       {
-      if( mMeshes[2]==null )
-        {
-        float[][] bands= new float[][]
+      int N = numLayers==2 ? 7:6;
+      int E = numLayers==2 ? 3:1;
+      float[][] bands= new float[][]
           {
-             {0.051f,35,SQ2/8,0.9f, 7,3,3},
+             {0.051f,35,SQ2/8,0.9f, N,E,E},
              {0.000f, 0,    1,0.0f, 3,0,0}
           };
-        int[] bandIndexes   = new int[] { 0,1,1,1,1 };
-        float[][] corners   = new float[][] { {0.06f,0.10f} };
-        int[] cornerIndexes = new int[] { 0,0,0,0,0 };
-        float[][] centers   = new float[][] { {0,0,-0.2f} };
-        int[] centerIndexes = new int[] { 0,0,0,0,-1 };
-
-        FactoryCubit factory = FactoryCubit.getInstance();
-        factory.createNewFaceTransform(VERTICES_FACE,VERT_INDEXES_FACE);
-        mMeshes[2] = factory.createRoundedSolid(VERTICES_FACE, VERT_INDEXES_FACE,
-                                                bands, bandIndexes,
-                                                corners, cornerIndexes,
-                                                centers, centerIndexes,
-                                                getNumCubitFaces(), null );
-        }
-      mesh = mMeshes[2].copy(true);
+      int[] bandIndices   = new int[] { 0,1,1,1,1 };
+      float[][] corners   = new float[][] { {0.06f,0.10f} };
+      int[] cornerIndices = new int[] { 0,0,0,0,0 };
+      float[][] centers   = new float[][] { {0,0,-0.2f} };
+      int[] centerIndices = new int[] { 0,0,0,0,-1 };
+
+      return new ObjectShape(VERTICES_FACE,VERT_INDEXES_FACE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int getNumCubitVariants(int numLayers)
+    {
+    return 3;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getCubitVariant(int cubit, int numLayers)
+    {
+    int numCorners = getNumCorners();
+    if( cubit<numCorners ) return 0;
+    int numEdges = getNumEdges(numLayers);
+    return cubit<numCorners+numEdges ? 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[getNumCubitVariants(numLayers)];
+      }
+
+    if( mMeshes[variant]==null )
+      {
+      ObjectShape shape = getObjectShape(cubit,numLayers);
+      FactoryCubit factory = FactoryCubit.getInstance();
+      factory.createNewFaceTransform(shape);
+      mMeshes[variant] = factory.createRoundedSolid(shape);
       }
 
+    MeshBase mesh = mMeshes[variant].copy(true);
     MatrixEffectQuaternion quat = new MatrixEffectQuaternion( getQuat(cubit,numLayers), new Static3D(0,0,0) );
     mesh.apply(quat,0xffffffff,0);
 
diff --git a/src/main/res/raw/skew3.dmesh b/src/main/res/raw/skew3.dmesh
index 4b66c20b..9d794f30 100644
Binary files a/src/main/res/raw/skew3.dmesh and b/src/main/res/raw/skew3.dmesh differ
