commit 62efeeae75cfd545506f40de8a3eb69a58c72571
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed May 26 10:20:46 2021 +0200

    Progress with Skewb Ultimate.

diff --git a/src/main/java/org/distorted/objects/TwistyUltimate.java b/src/main/java/org/distorted/objects/TwistyUltimate.java
index 8f7c6b0a..2158d0ba 100644
--- a/src/main/java/org/distorted/objects/TwistyUltimate.java
+++ b/src/main/java/org/distorted/objects/TwistyUltimate.java
@@ -95,7 +95,7 @@ class TwistyUltimate extends TwistyObject
   // Colors of the faces of cubits. TODO
   private static final int[][] mFaceMap = new int[][]
          {
-           { 24,24,24, 36,36,36,36,36 },
+           { 25,25,25, 36,36,36,36,36 },
            { 24,24,24, 36,36,36,36,36 },
            { 24,24,24, 36,36,36,36,36 },
            { 24,24,24, 36,36,36,36,36 },
@@ -116,13 +116,14 @@ class TwistyUltimate extends TwistyObject
   static final float[][] CENTERS = new float[][]
          {
            { 0.0f,-0.5f,    G },
+           {    E,   -E,   -E },
+           {   -G, 0.0f,-0.5f },
+           { 0.5f,    G, 0.0f },
+
            {   -E,    E,    E },
            {    G, 0.0f, 0.5f },
            {-0.5f,   -G, 0.0f },
            { 0.0f, 0.5f,   -G },
-           {    E,   -E,   -E },
-           {   -G, 0.0f,-0.5f },
-           { 0.5f,    G, 0.0f },
 
            {        E/2, (E+0.5f)/2,    (E+G)/2 },
            {   -(E+G)/2,       -E/2, (E+0.5f)/2 },
@@ -132,13 +133,29 @@ class TwistyUltimate extends TwistyObject
            {-(E+0.5f)/2,    (E+G)/2,       -E/2 }
          };
 
-  static final int[] QUAT_INDEX = new int[]
+  private static final double[][] VERTICES_SMALL_LEFT = new double[][]
          {
-           0,      11,11,11,11, 6,1,2, // TODO the four middle ones
-           0,1,4,9,5,2
+            {         0.000,         0.000,         0.000},
+            {       - 0.250,-SQ5/8 - 0.125,-SQ5/8 - 0.375},
+            { SQ5/8 + 0.125,-SQ5/8 - 0.375,       + 0.250},
+            { SQ5/8 + 0.375,       + 0.250,-SQ5/8 - 0.125},
+            { SQ5/4 + 0.250,-SQ5/4 - 0.250,-SQ5/4 - 0.250},
+            { SQ5/8 - 0.125,       + 0.250,-SQ5/8 - 0.125},
+            {       - 0.250,-SQ5/8 - 0.125,-SQ5/8 + 0.125},
+            { SQ5/8 + 0.125,-SQ5/8 + 0.125,       + 0.250}
          };
 
-  private static final double[][] VERTICES_SMALL = new double[][]
+  private static final int[][] VERT_INDEXES_SMALL_LEFT  = new int[][]
+         {
+           {6,0,5,1},   // counterclockwise!
+           {0,7,3,5},
+           {0,6,2,7},
+           {1,5,3,4},
+           {3,7,2,4},
+           {2,6,1,4},
+         };
+
+  private static final double[][] VERTICES_SMALL_RIGHT = new double[][]
          {
            { 0.0       ,  0.0      , 0.0       },
            { -0.5*E    , 0.5*E+0.25, -0.25     },
@@ -150,7 +167,7 @@ class TwistyUltimate extends TwistyObject
            {  0.5*E    ,-0.5*E+0.25, -0.25     }
          };
 
-  private static final int[][] VERT_INDEXES_SMALL = new int[][]
+  private static final int[][] VERT_INDEXES_SMALL_RIGHT = new int[][]
          {
            {6,0,5,1},   // counterclockwise!
            {0,7,3,5},
@@ -187,6 +204,11 @@ class TwistyUltimate extends TwistyObject
            {10,8,2,6}
          };
 
+  private static final int[] QUAT_INDEX = new int[]
+         {
+           0,6,1,2,0,4,6,5,0,1,4,9,5,2
+         };
+
   private static final float[][] STICKERS = new float[][]
          {
            { -0.14400357f, -0.47894150f, 0.50000000f,-0.011045523f, 0.37700626f, 0.36749030f,-0.26699730f, 0.36749026f, -0.46600536f, -0.24499352f }, // Big cubit 1st
@@ -212,12 +234,12 @@ class TwistyUltimate extends TwistyObject
       {
       FactoryCubit factory = FactoryCubit.getInstance();
       factory.clear();
-      mMeshes = new MeshBase[2];
+      mMeshes = new MeshBase[3];
       }
 
     MeshBase mesh;
 
-    if( cubit<8 )
+    if( cubit<4 )
       {
       if( mMeshes[0]==null )
         {
@@ -233,8 +255,8 @@ class TwistyUltimate extends TwistyObject
         int[] centerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
 
         FactoryCubit factory = FactoryCubit.getInstance();
-        factory.createNewFaceTransform(VERTICES_SMALL,VERT_INDEXES_SMALL);
-        mMeshes[0] = factory.createRoundedSolid(VERTICES_SMALL, VERT_INDEXES_SMALL,
+        factory.createNewFaceTransform(VERTICES_SMALL_RIGHT,VERT_INDEXES_SMALL_RIGHT);
+        mMeshes[0] = factory.createRoundedSolid(VERTICES_SMALL_RIGHT, VERT_INDEXES_SMALL_RIGHT,
                                                 bands, bandIndexes,
                                                 corners, cornerIndexes,
                                                 centers, centerIndexes,
@@ -242,9 +264,34 @@ class TwistyUltimate extends TwistyObject
         }
       mesh = mMeshes[0].copy(true);
       }
-    else
+    else if( cubit<8 )
       {
       if( mMeshes[1]==null )
+        {
+        float[][] bands= new float[][]
+          {
+             {0.04f,17,0.5f,0.2f,5,  2,2},
+             {0.01f, 1,0.5f,0.2f,5,  2,2}
+          };
+        int[] bandIndexes   = new int[] { 0,0,0,1,1,1 };
+        float[][] corners   = new float[][] {  { 0.013f, 0.08f } };
+        int[] cornerIndexes = new int[] { 0, 0, 0, 0,-1, 0, 0, 0 };
+        float[][] centers   = new float[][] { { 0.0f,-0.5f, -(SQ5+3)/4 } };
+        int[] centerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
+
+        FactoryCubit factory = FactoryCubit.getInstance();
+        factory.createNewFaceTransform(VERTICES_SMALL_LEFT,VERT_INDEXES_SMALL_LEFT);
+        mMeshes[1] = factory.createRoundedSolid(VERTICES_SMALL_LEFT, VERT_INDEXES_SMALL_LEFT,
+                                                bands, bandIndexes,
+                                                corners, cornerIndexes,
+                                                centers, centerIndexes,
+                                                getNumCubitFaces() );
+        }
+      mesh = mMeshes[1].copy(true);
+      }
+    else
+      {
+      if( mMeshes[2]==null )
         {
         float[][] bands= new float[][]
           {
@@ -260,16 +307,16 @@ class TwistyUltimate extends TwistyObject
 
         FactoryCubit factory = FactoryCubit.getInstance();
         factory.createNewFaceTransform(VERTICES_BIG,VERT_INDEXES_BIG);
-        mMeshes[1] = factory.createRoundedSolid(VERTICES_BIG, VERT_INDEXES_BIG,
+        mMeshes[2] = factory.createRoundedSolid(VERTICES_BIG, VERT_INDEXES_BIG,
                                                 bands, bandIndexes,
                                                 corners, cornerIndexes,
                                                 centers, centerIndexes,
                                                 getNumCubitFaces() );
         }
-      mesh = mMeshes[1].copy(true);
+      mesh = mMeshes[2].copy(true);
       }
 
-    Static4D q = QUATS[getQuat(cubit)];
+    Static4D q = QUATS[getQuatIndex(cubit)];
     MatrixEffectQuaternion quat = new MatrixEffectQuaternion( q, new Static3D(0,0,0) );
     mesh.apply(quat,0xffffffff,0);
 
@@ -285,7 +332,7 @@ class TwistyUltimate extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private int getQuat(int cubit)
+  private int getQuatIndex(int cubit)
     {
     return QUAT_INDEX[cubit];
     }
@@ -300,8 +347,8 @@ class TwistyUltimate extends TwistyObject
 
     switch(stickerType)
       {
-      case 0:  R = 0.09f; S = 0.08f; break;
-      case 1:  R = 0.10f; S = 0.08f; break;
+      case 0:  R = 0.08f; S = 0.07f; break;
+      case 1:  R = 0.13f; S = 0.09f; break;
       case 2:  R = 0.11f; S = 0.08f; break;
       default: R = 0.00f; S = 0.00f; break;
       }
@@ -373,7 +420,7 @@ class TwistyUltimate extends TwistyObject
 
   float getScreenRatio()
     {
-    return 0.5f;
+    return 0.67f;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
