commit ede1b68c71f1a7e3291c638c6247006fea767a22
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Jan 27 14:56:02 2021 +0100

    Progress with Megaminx.

diff --git a/src/main/java/org/distorted/objects/MovementMinx.java b/src/main/java/org/distorted/objects/MovementMinx.java
index b18143c4..c8f4ed0f 100644
--- a/src/main/java/org/distorted/objects/MovementMinx.java
+++ b/src/main/java/org/distorted/objects/MovementMinx.java
@@ -26,6 +26,8 @@ import static org.distorted.objects.TwistyKilominx.LEN;
 import static org.distorted.objects.FactoryCubit.SIN54;
 import static org.distorted.objects.FactoryCubit.COS54;
 import static org.distorted.objects.TwistyObject.SQ5;
+import static org.distorted.objects.FactoryCubit.COS18;
+import static org.distorted.objects.TwistyMegaminx.MEGA_D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -54,14 +56,30 @@ class MovementMinx extends Movement
 
   MovementMinx()
     {
-    super(TwistyKilominx.ROT_AXIS, FACE_AXIS, DIST3D, DIST2D);
+    super(TwistyMinx.ROT_AXIS, FACE_AXIS, DIST3D, DIST2D);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int computeRowFromOffset(int face, int size, float offset)
     {
-    return offset<DIST2D ? 0:2;
+    if( size==3 )
+      {
+      return offset<DIST2D ? 0:2;
+      }
+    if( size==5 )
+      {
+      // TODO
+
+      float LEN = (0.5f-MEGA_D)*COS18/3;
+
+      android.util.Log.e("mega", "offset = "+offset+" len="+LEN+" dist2D="+DIST2D);
+
+      if( offset<LEN/2 ) return 0;
+      if( offset<LEN   ) return 1;
+      }
+
+    return 0;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyMegaminx.java b/src/main/java/org/distorted/objects/TwistyMegaminx.java
index 71c09a24..d6bc99f3 100644
--- a/src/main/java/org/distorted/objects/TwistyMegaminx.java
+++ b/src/main/java/org/distorted/objects/TwistyMegaminx.java
@@ -34,7 +34,9 @@ import org.distorted.main.R;
 import org.distorted.main.RubikSurfaceView;
 
 import static org.distorted.objects.FactoryCubit.COS18;
+import static org.distorted.objects.FactoryCubit.COS54;
 import static org.distorted.objects.FactoryCubit.SIN18;
+import static org.distorted.objects.FactoryCubit.SIN54;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -196,10 +198,10 @@ public class TwistyMegaminx extends TwistyMinx
   float[] getCuts(int numLayers)
     {
     float[] cuts = new float[numLayers-1];
-    float D = (numLayers/3.0f)*MovementMinx.DIST3D;
+    float D = numLayers*MovementMinx.DIST3D;
     float E = 2*C1;           // 2*cos(36 deg)
     float X = 2*D*E/(1+2*E);  // height of the 'upper' part of a dodecahedron, i.e. put it on a table,
-                              // its height is then 2*DIST3D, it has one 'lower' part of height X, one
+                              // its height is then D*2*DIST3D, it has one 'lower' part of height X, one
                               // 'middle' part of height Y and one upper part of height X again.
                               // It's edge length = numLayers/3.0f.
     int num = (numLayers-1)/2;
@@ -207,7 +209,7 @@ public class TwistyMegaminx extends TwistyMinx
 
     for(int i=0; i<num; i++)
       {
-      cuts[        i] = -MovementMinx.DIST3D + (i+0.5f)*G;
+      cuts[        i] = -D + (i+0.5f)*G;
       cuts[2*num-1-i] = -cuts[i];
       }
 
@@ -511,9 +513,52 @@ public class TwistyMegaminx extends TwistyMinx
 
   void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top)
     {
-    paint.setColor(FACE_COLORS[face%NUM_FACES]);
-    paint.setStyle(Paint.Style.FILL);
-    canvas.drawRect(left,top,left+TEXTURE_HEIGHT,top+TEXTURE_HEIGHT,paint);
+    int COLORS = FACE_COLORS.length;
+    float R,S;
+    float[] vertices;
+
+    int variant = face/COLORS;
+
+    if( variant==0 )
+      {
+      float Y = COS54/(2*SIN54);
+      R = 0.05f;
+      S = 0.06f;
+      vertices = new float[] { -0.5f, 0.0f, 0.0f, -Y, 0.5f, 0.0f, 0.0f, Y };
+      }
+    else
+      {
+      int numLayers = getNumLayers();
+      float height= (numLayers/3.0f)*(0.5f-MEGA_D)*COS18/((numLayers-1)*0.5f);
+      float W = height*SIN18/COS18;
+      float width = (numLayers/3.0f)*2*MEGA_D + 2*(variant-1)*W;
+
+      if( variant < (numLayers+1)/2 )
+        {
+        float X1 = 0.5f*height;
+        float Y1 = 0.5f*width;
+        float Y2 = 0.5f*width + W;
+
+        R = 0.04f;
+        S = 0.055f;
+        vertices = new float[] { -X1, Y1, -X1, -Y1, X1, -Y2, X1, Y2 };
+        }
+      else
+        {
+        float Z = width/(2*COS54);
+        float X1 = 0.5f*width;
+        float Y1 = Z*SIN54;
+        float X2 = Z*COS18;
+        float Y2 = Z*SIN18;
+
+        R = 0.05f;
+        S = 0.05f;
+        vertices = new float[] { -X1,+Y1, -X2,-Y2, 0.0f,-Z, +X2,-Y2, +X1,+Y1 };
+        }
+      }
+
+    FactorySticker factory = FactorySticker.getInstance();
+    factory.drawRoundedPolygon(canvas, paint, left, top, vertices, S, FACE_COLORS[face%COLORS], R);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
