commit 74ffd68efa531fd4b8cc5873576aef9adbfef9e8
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue May 25 16:43:21 2021 +0200

    Progress with Skewb Ultimate.

diff --git a/src/main/java/org/distorted/objects/TwistyObject.java b/src/main/java/org/distorted/objects/TwistyObject.java
index c214827e..2d365bfb 100644
--- a/src/main/java/org/distorted/objects/TwistyObject.java
+++ b/src/main/java/org/distorted/objects/TwistyObject.java
@@ -81,7 +81,7 @@ public abstract class TwistyObject extends DistortedNode
   private static final float MAX_SIZE_CHANGE = 1.35f;
   private static final float MIN_SIZE_CHANGE = 0.75f;
 
-  private static final boolean mCreateFromDMesh = true;
+  private static final boolean mCreateFromDMesh = false;
 
   private static final Static3D CENTER = new Static3D(0,0,0);
   private static final int POST_ROTATION_MILLISEC = 500;
diff --git a/src/main/java/org/distorted/objects/TwistyUltimate.java b/src/main/java/org/distorted/objects/TwistyUltimate.java
index de5b0223..8f7c6b0a 100644
--- a/src/main/java/org/distorted/objects/TwistyUltimate.java
+++ b/src/main/java/org/distorted/objects/TwistyUltimate.java
@@ -59,6 +59,7 @@ class TwistyUltimate extends TwistyObject
   private static final float D = SQ3/3;
   private static final float E = (SQ5+1)/4;
   private static final float F = (SQ5-1)/4;
+  private static final float G = (SQ5+3)/4;
 
   static final Static3D[] ROT_AXIS = new Static3D[]
          {
@@ -91,6 +92,52 @@ class TwistyUltimate extends TwistyObject
            new Static4D(    F, 0.5f,    E, 0.0f )
          };
 
+  // Colors of the faces of cubits. TODO
+  private static final int[][] mFaceMap = new int[][]
+         {
+           { 24,24,24, 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 },
+           { 24,24,24, 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 },
+
+           {  0, 0,12,12, 36,36,36,36 },
+           {  0, 0,12,12, 36,36,36,36 },
+           {  0, 0,12,12, 36,36,36,36 },
+           {  0, 0,12,12, 36,36,36,36 },
+           {  0, 0,12,12, 36,36,36,36 },
+           {  0, 0,12,12, 36,36,36,36 }
+         };
+
+  // centers of the 14 cubits.
+  static final float[][] CENTERS = new float[][]
+         {
+           { 0.0f,-0.5f,    G },
+           {   -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 },
+           { (E+0.5f)/2,   -(E+G)/2,        E/2 },
+           {       -E/2,-(E+0.5f)/2,   -(E+G)/2 },
+           {    (E+G)/2,        E/2,-(E+0.5f)/2 },
+           {-(E+0.5f)/2,    (E+G)/2,       -E/2 }
+         };
+
+  static final int[] QUAT_INDEX = new int[]
+         {
+           0,      11,11,11,11, 6,1,2, // TODO the four middle ones
+           0,1,4,9,5,2
+         };
+
   private static final double[][] VERTICES_SMALL = new double[][]
          {
            { 0.0       ,  0.0      , 0.0       },
@@ -140,10 +187,11 @@ class TwistyUltimate extends TwistyObject
            {10,8,2,6}
          };
 
-  // TODO
   private static final float[][] STICKERS = new float[][]
          {
-              { -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f }
+           { -0.14400357f, -0.47894150f, 0.50000000f,-0.011045523f, 0.37700626f, 0.36749030f,-0.26699730f, 0.36749026f, -0.46600536f, -0.24499352f }, // Big cubit 1st
+           {  0.36327127f,  0.26393202f,-0.36327127f, 0.500000000f,-0.36327127f,-0.26393202f, 0.36327127f,-0.50000000f },                             // Big cubit 2nd
+           { -0.29389262f, -0.50000000f, 0.29389262f,-0.309017000f, 0.29389262f, 0.30901700f,-0.29389262f, 0.50000000f },                             // Small cubit 1st
          };
 
   private static MeshBase[] mMeshes;
@@ -221,76 +269,59 @@ class TwistyUltimate extends TwistyObject
       mesh = mMeshes[1].copy(true);
       }
 
-    MatrixEffectQuaternion quat = new MatrixEffectQuaternion( getQuat(cubit), new Static3D(0,0,0) );
+    Static4D q = QUATS[getQuat(cubit)];
+    MatrixEffectQuaternion quat = new MatrixEffectQuaternion( q, new Static3D(0,0,0) );
     mesh.apply(quat,0xffffffff,0);
 
     return mesh;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
 
-  private Static4D getQuat(int cubit)
+  float[][] getCubitPositions(int numLayers)
     {
-    switch(cubit)
-      {
-      case  0:
-      case  1:
-      case  2:
-      case  3:
-      case  4:
-      case  5:
-      case  6:
-      case  7:
-
-      case  8:
-      case  9:
-      case 10:
-      case 11:
-      case 12:
-      case 13: return QUATS[0];
-      }
-
-    return null;
+    return CENTERS;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[][] getCubitPositions(int numLayers)
+  private int getQuat(int cubit)
     {
-    float[][] tmp = new float[14][];
-
-    // TODO
-
-    return tmp;
+    return QUAT_INDEX[cubit];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
 
   void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top)
     {
-    float R = 0.10f;
-    float S = 0.08f;
+    int COLORS = FACE_COLORS.length;
+    int stickerType = face/COLORS;
+    float R,S;
+
+    switch(stickerType)
+      {
+      case 0:  R = 0.09f; S = 0.08f; break;
+      case 1:  R = 0.10f; S = 0.08f; break;
+      case 2:  R = 0.11f; S = 0.08f; break;
+      default: R = 0.00f; S = 0.00f; break;
+      }
 
     FactorySticker factory = FactorySticker.getInstance();
-    factory.drawRoundedPolygon(canvas, paint, left, top, STICKERS[0], S, FACE_COLORS[face], R);
+    factory.drawRoundedPolygon(canvas, paint, left, top, STICKERS[stickerType], S, FACE_COLORS[face%COLORS], R);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
 
   int getFaceColor(int cubit, int cubitface, int size)
     {
-    return CUBITS[cubit].mRotationRow[cubitface/2] == (cubitface%2==0 ? (1<<(size-1)):1) ? cubitface : NUM_FACES;
+    return mFaceMap[cubit][cubitface];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
 
   float returnMultiplier()
     {
-    return getNumLayers();
+    return 1.0f;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
