commit 4e627d8b9940d2b743b5a91f03d583e20420f16a
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Dec 29 00:01:42 2020 +0100

    Progress with the Kilominx.

diff --git a/src/main/java/org/distorted/objects/FactoryCubit.java b/src/main/java/org/distorted/objects/FactoryCubit.java
index 7b95ffa8..b09af3df 100644
--- a/src/main/java/org/distorted/objects/FactoryCubit.java
+++ b/src/main/java/org/distorted/objects/FactoryCubit.java
@@ -42,9 +42,17 @@ class FactoryCubit
 
   private static final float SQ2 = (float)Math.sqrt(2);
   private static final float SQ3 = (float)Math.sqrt(3);
+  private static final float SQ5 = (float)Math.sqrt(5);
   private static final float SQ6 = (float)Math.sqrt(6);
 
+  static final float MINX_C0 = (SQ5-1)/4;
+  static final float MINX_C1 = (SQ5+1)/4;                         // sin(54 deg)
+  static final float MINX_C3 = (float)(Math.sqrt(10-2*SQ5)/4);    // cos(54 deg)
+  static final float MINX_C4 = (float)(Math.sqrt(0.5f-0.1f*SQ5)); // cos(half the dihedral angle)
+  static final float MINX_C5 = (float)(Math.sqrt(0.5f+0.1f*SQ5)); // sin(half the dihedral angle)
+
   private static final int IVY_N = 8;
+
   private static final Static1D RADIUS = new Static1D(1);
   private static FactoryCubit mThis;
 
@@ -674,16 +682,23 @@ class FactoryCubit
     return new MeshJoined(meshes);
     }
 
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   MeshBase createFacesMinxCorner()
     {
     MeshBase[] meshes = new MeshPolygon[6];
 
-    float[] vertices0 = {  };   // TODO
-    float[] bands0 = computeBands(0.03f,27,0.25f,0.5f,5);
-    float[] vertices1 = {  };   // TODO
+    float X1= (SQ5+1)/8;
+    float Y1= (float)(Math.sqrt(2+0.4f*SQ5)/4);
+    float Y2= Y1 - (float)(Math.sqrt(10-2*SQ5)/8);
+    float H = 0.5f*MINX_C1/MINX_C3;
+    float X2= H*MINX_C5;
+    float Y3= H/(2*MINX_C4);
+    float Y4= H*(1/(2*MINX_C4) - MINX_C4);
+
+    float[] vertices0 = { -X1, Y2, 0, -Y1, X1, Y2, 0, Y1 };
+    float[] bands0 = computeBands(0.03f,39,0.3f,0.2f,5);
+    float[] vertices1 = { -X2, Y4, 0, -Y3, X2, Y4, 0, Y3 };
     float[] bands1 = computeBands(0.00f,27,0.25f,0.5f,2);
 
     meshes[0] = new MeshPolygon(vertices0, bands0, 1, 1);
@@ -1203,9 +1218,53 @@ class FactoryCubit
 
   VertexEffect[] createVertexEffectsMinxCorner()
     {
-    // TODO
+    VertexEffect[] effect = new VertexEffect[9];
+
+    float H = 0.5f*(MINX_C1/MINX_C3);
+    float Y1= (float)(Math.sqrt(2+0.4f*SQ5)/4);
+    float Y2= H/(2*MINX_C4);
+    float A = (float)(Math.acos(-SQ5/5)*180/Math.PI);  // dihedral angle of a dedecahedron in degrees
+    float sin18 = MINX_C0;
+    float cos18 = (float)(Math.sqrt(1-MINX_C0*MINX_C0));
+    float LEN   = (float)Math.sqrt(H*H/(MINX_C4*MINX_C4) + 0.25f);
+
+    Static3D axisZ = new Static3D(0.0f  , 0.0f , 1.0f);
+    Static3D axisY = new Static3D(0.0f  , 1.0f , 0.0f);
+    Static3D axisA = new Static3D(-sin18, cos18, 0.0f);
+    Static3D axisC = new Static3D( H/LEN, -0.5f/LEN,-H*MINX_C5/(MINX_C4*LEN));
+
+    Static3D move1 = new Static3D(0,-Y1,0);
+    Static3D move2 = new Static3D(0,-Y2,0);
+    Static3D move3 = new Static3D(0.5f*cos18,0.5f*sin18,0);
+    Static3D center= new Static3D(0.0f, 0.0f, 0.0f);
+
+    Static1D angle1 = new Static1D(54);
+    Static1D angle2 = new Static1D(A/2+18);
+    Static1D angle3 = new Static1D(90);
+    Static1D angle4 = new Static1D(120);
+    Static1D angle5 = new Static1D(240);
+    Static1D angle6 = new Static1D(90-A/2);
+
+    effect[0] = new VertexEffectMove(move1);
+    effect[1] = new VertexEffectMove(move2);
+    effect[2] = new VertexEffectRotate(angle1, axisZ, center);
+    effect[3] = new VertexEffectRotate(angle2, axisZ, center);
+    effect[4] = new VertexEffectRotate(angle3, axisA, center);
+    effect[5] = new VertexEffectMove(move3);
+    effect[6] = new VertexEffectRotate(angle4, axisC, center);
+    effect[7] = new VertexEffectRotate(angle5, axisC, center);
+    effect[8] = new VertexEffectRotate(angle6, axisY, center);
 
-    return null;
+    effect[0].setMeshAssociation( 7,-1);  // meshes 0,1,2
+    effect[1].setMeshAssociation(56,-1);  // meshes 3,4,5
+    effect[2].setMeshAssociation( 7,-1);  // meshes 0,1,2
+    effect[3].setMeshAssociation(56,-1);  // meshes 3,4,5
+    effect[4].setMeshAssociation(56,-1);  // meshes 3,4,5
+    effect[5].setMeshAssociation(56,-1);  // meshes 3,4,5
+    effect[6].setMeshAssociation(18,-1);  // meshes 1,4
+    effect[7].setMeshAssociation(36,-1);  // meshes 2,5
+
+    return effect;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyMinx.java b/src/main/java/org/distorted/objects/TwistyMinx.java
index 18282f19..91173cfd 100644
--- a/src/main/java/org/distorted/objects/TwistyMinx.java
+++ b/src/main/java/org/distorted/objects/TwistyMinx.java
@@ -41,19 +41,21 @@ import static org.distorted.effects.scramble.ScrambleEffect.START_AXIS;
 public class TwistyMinx extends TwistyObject
 {
   private static final int FACES_PER_CUBIT =6;
-  private static final float AXIS_LEN = 1.0f/(float)Math.sqrt(2.5f+0.5f*SQ5);
-  private static final float C0 = (SQ5-1)/4;
-  private static final float C1 = (SQ5+1)/4;
+
+  static final float C0 = (SQ5-1)/4;
+  static final float C1 = (SQ5+1)/4;
+  static final float C2 = (SQ5+3)/4;
+  static final float C3 = (float)(Math.sqrt(10-2*SQ5)/4);  // cos(54 deg)
 
   // the six rotation axis of a RubikMegaminx. Must be normalized.
   static final Static3D[] ROT_AXIS = new Static3D[]
          {
-           new Static3D( AXIS_LEN*C1, AXIS_LEN   , 0          ),
-           new Static3D(-AXIS_LEN*C1, AXIS_LEN   , 0          ),
-           new Static3D( 0          , AXIS_LEN*C1, AXIS_LEN   ),
-           new Static3D( 0          ,-AXIS_LEN*C1, AXIS_LEN   ),
-           new Static3D( AXIS_LEN   , 0          , AXIS_LEN*C1),
-           new Static3D( AXIS_LEN   , 0          ,-AXIS_LEN*C1)
+           new Static3D( C1/(2*C3), 1/(2*C3) , 0        ),
+           new Static3D(-C1/(2*C3), 1/(2*C3) , 0        ),
+           new Static3D( 0        , C1/(2*C3), 1/(2*C3) ),
+           new Static3D( 0        ,-C1/(2*C3), 1/(2*C3) ),
+           new Static3D( 1/(2*C3) , 0        , C1/(2*C3)),
+           new Static3D( 1/(2*C3) , 0        ,-C1/(2*C3))
          };
 
   private static final int MINX_LGREEN = 0xff53aa00;
@@ -233,31 +235,28 @@ public class TwistyMinx extends TwistyObject
 
   Static3D[] getCubitPositions(int numLayers)
     {
-    final float C0 = (SQ5+1)/4;
-    final float C1 = (SQ5+3)/4;
-
     final Static3D[] CENTERS = new Static3D[20];
 
-    CENTERS[ 0] = new Static3D( 0.0f, 0.5f,   C1);
-    CENTERS[ 1] = new Static3D( 0.0f, 0.5f,  -C1);
-    CENTERS[ 2] = new Static3D( 0.0f,-0.5f,   C1);
-    CENTERS[ 3] = new Static3D( 0.0f,-0.5f,  -C1);
-    CENTERS[ 4] = new Static3D(   C1, 0.0f, 0.5f);
-    CENTERS[ 5] = new Static3D(   C1, 0.0f,-0.5f);
-    CENTERS[ 6] = new Static3D(  -C1, 0.0f, 0.5f);
-    CENTERS[ 7] = new Static3D(  -C1, 0.0f,-0.5f);
-    CENTERS[ 8] = new Static3D( 0.5f,   C1, 0.0f);
-    CENTERS[ 9] = new Static3D( 0.5f,  -C1, 0.0f);
-    CENTERS[10] = new Static3D(-0.5f,   C1, 0.0f);
-    CENTERS[11] = new Static3D(-0.5f,  -C1, 0.0f);
-    CENTERS[12] = new Static3D(   C0,   C0,   C0);
-    CENTERS[13] = new Static3D(   C0,   C0,  -C0);
-    CENTERS[14] = new Static3D(   C0,  -C0,   C0);
-    CENTERS[15] = new Static3D(   C0,  -C0,  -C0);
-    CENTERS[16] = new Static3D(  -C0,   C0,   C0);
-    CENTERS[17] = new Static3D(  -C0,   C0,  -C0);
-    CENTERS[18] = new Static3D(  -C0,  -C0,   C0);
-    CENTERS[19] = new Static3D(  -C0,  -C0,  -C0);
+    CENTERS[ 0] = new Static3D( 0.0f, 0.5f,   C2);
+    CENTERS[ 1] = new Static3D( 0.0f, 0.5f,  -C2);
+    CENTERS[ 2] = new Static3D( 0.0f,-0.5f,   C2);
+    CENTERS[ 3] = new Static3D( 0.0f,-0.5f,  -C2);
+    CENTERS[ 4] = new Static3D(   C2, 0.0f, 0.5f);
+    CENTERS[ 5] = new Static3D(   C2, 0.0f,-0.5f);
+    CENTERS[ 6] = new Static3D(  -C2, 0.0f, 0.5f);
+    CENTERS[ 7] = new Static3D(  -C2, 0.0f,-0.5f);
+    CENTERS[ 8] = new Static3D( 0.5f,   C2, 0.0f);
+    CENTERS[ 9] = new Static3D( 0.5f,  -C2, 0.0f);
+    CENTERS[10] = new Static3D(-0.5f,   C2, 0.0f);
+    CENTERS[11] = new Static3D(-0.5f,  -C2, 0.0f);
+    CENTERS[12] = new Static3D(   C1,   C1,   C1);
+    CENTERS[13] = new Static3D(   C1,   C1,  -C1);
+    CENTERS[14] = new Static3D(   C1,  -C1,   C1);
+    CENTERS[15] = new Static3D(   C1,  -C1,  -C1);
+    CENTERS[16] = new Static3D(  -C1,   C1,   C1);
+    CENTERS[17] = new Static3D(  -C1,   C1,  -C1);
+    CENTERS[18] = new Static3D(  -C1,  -C1,   C1);
+    CENTERS[19] = new Static3D(  -C1,  -C1,  -C1);
 
     return CENTERS;
     }
@@ -320,7 +319,11 @@ public class TwistyMinx extends TwistyObject
     float S = 0.08f;
     float R = 0.12f;
 
-    float[] vertices = {  };   // TODO
+    float X1= (SQ5+1)/8;
+    float Y1= (float)(Math.sqrt(2+0.4f*SQ5)/4);
+    float Y2= Y1 - (float)(Math.sqrt(10-2*SQ5)/8);
+
+    float[] vertices = { -X1, Y2, 0, -Y1, X1, Y2, 0, Y1 };
 
     FactorySticker factory = FactorySticker.getInstance();
     factory.drawRoundedPolygon(canvas, paint, left, top, vertices, S, FACE_COLORS[face], R);
diff --git a/src/main/java/org/distorted/objects/TwistyObject.java b/src/main/java/org/distorted/objects/TwistyObject.java
index 8ca73a92..30fe9b55 100644
--- a/src/main/java/org/distorted/objects/TwistyObject.java
+++ b/src/main/java/org/distorted/objects/TwistyObject.java
@@ -79,7 +79,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;
