commit a4962b9cd3d66e1556cf7c1284cbe2d50563ebfc
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Apr 2 16:05:08 2021 +0200

    Progress with any size Kilominx.

diff --git a/src/main/java/org/distorted/objects/TwistyDiamond.java b/src/main/java/org/distorted/objects/TwistyDiamond.java
index 31e46f36..cfbde6aa 100644
--- a/src/main/java/org/distorted/objects/TwistyDiamond.java
+++ b/src/main/java/org/distorted/objects/TwistyDiamond.java
@@ -389,11 +389,11 @@ public class TwistyDiamond extends TwistyObject
         case 7: axis = 0; layer =             1; break;
         }
 
-      return CUBITS[cubit].mRotationRow[axis] == layer ? cubitface : NUM_FACES;
+      return CUBITS[cubit].mRotationRow[axis] == layer ? cubitface : NUM_TEXTURES;
       }
     else
       {
-      return cubitface>0 ? NUM_FACES : retFaceTetraBelongsTo(cubit-numO, size);
+      return cubitface>0 ? NUM_TEXTURES : retFaceTetraBelongsTo(cubit-numO, size);
       }
     }
 
diff --git a/src/main/java/org/distorted/objects/TwistyKilominx.java b/src/main/java/org/distorted/objects/TwistyKilominx.java
index f55e58bc..24d52cda 100644
--- a/src/main/java/org/distorted/objects/TwistyKilominx.java
+++ b/src/main/java/org/distorted/objects/TwistyKilominx.java
@@ -216,7 +216,8 @@ public class TwistyKilominx extends TwistyMinx
       float vY = D*center[1] - y;
       float vZ = D*center[2] - z;
 
-      float T = 0.5f + leftRight*(mult*D*SIN18 + 1.0f)/(numLayers-1);
+      float T = 0.5f + leftRight*(mult*SIN18 + 1.0f)/(numLayers-1);
+
       x = D * (T*c1[0]+(1.0f-T)*c2[0]);
       y = D * (T*c1[1]+(1.0f-T)*c2[1]);
       z = D * (T*c1[2]+(1.0f-T)*c2[2]);
@@ -341,7 +342,7 @@ public class TwistyKilominx extends TwistyMinx
         {
         float tmp   = (numLayers/3.0f)/(numLayers-1);
         float height= tmp*COS18;
-        float width = tmp + (type/2)*height*SIN18/COS18;
+        float width = tmp + (type/2)*tmp*SIN18;
 
         mEdgeMeshes[indexCornerEdge][type] = FactoryCubit.getInstance().createKilominxEdgeMesh(numLayers,width,height, (type%2)==0 );
         }
@@ -369,26 +370,94 @@ public class TwistyKilominx extends TwistyMinx
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
 
-  int getFaceColor(int cubit, int cubitface, int numLayers)
+  int getCornerColor(int cubit, int cubitface, int numLayers, int numCubitsPerCorner)
     {
-    if( numLayers==3 )
+    if( cubitface<0 || cubitface>2 ) return NUM_TEXTURES;
+
+    int part  = cubit % numCubitsPerCorner;
+    int corner= cubit / numCubitsPerCorner;
+
+    if( part==0 )
       {
-      return cubitface>=0 && cubitface<3 ? mCornerFaceMap[cubit][cubitface] : NUM_TEXTURES*NUM_FACES;
+      return mCornerFaceMap[corner][cubitface];
       }
+    else
+      {
+      int N = (numCubitsPerCorner-1)/3;
+      int block = (part-1) % N;
+      int index = (part-1) / N;
 
-    int numCubitsPerCorner = numCubitsPerCorner(numLayers);
-    int numCubitsPerEdge   = numCubitsPerEdge(numLayers);
+      if( block< (numLayers-3)/2 )
+        {
+        switch(index)
+          {
+          case 0: return cubitface==1 ? NUM_TEXTURES : mCornerFaceMap[corner][cubitface];
+          case 1: return cubitface==0 ? NUM_TEXTURES : mCornerFaceMap[corner][cubitface];
+          case 2: return cubitface==2 ? NUM_TEXTURES : mCornerFaceMap[corner][cubitface];
+          }
+        }
+      else
+        {
+        switch(index)
+          {
+          case 0: return cubitface==0 ? mCornerFaceMap[corner][cubitface] : NUM_TEXTURES;
+          case 1: return cubitface==2 ? mCornerFaceMap[corner][cubitface] : NUM_TEXTURES;
+          case 2: return cubitface==1 ? mCornerFaceMap[corner][cubitface] : NUM_TEXTURES;
+          }
+        }
+      }
+
+    return NUM_TEXTURES;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getEdgeColor(int edge, int cubitface, int numCubitsPerEdge)
+    {
+    if( cubitface<0 || cubitface>1 ) return NUM_TEXTURES;
+
+    int part    = edge % numCubitsPerEdge;
+    int variant = edge / numCubitsPerEdge;
 
-    cubit -= (NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge);
+    part /=2;
 
-    if( cubit >= 0 )
+    return (part==0 || cubitface==((part+1)%2)) ? mEdgeMap[variant][cubitface+2] + ((part+3)/2)*NUM_FACES : NUM_TEXTURES;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getCenterColor(int center, int cubitface, int numLayers)
+    {
+     if( numLayers==3 )
       {
-      return cubit/5;
+      return cubitface>=0 && cubitface<3 ? mCornerFaceMap[center][cubitface] : NUM_TEXTURES;
       }
 
-    return 0;
+    return center/5 + NUM_FACES*(numLayers-1)/2; // TODO
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getFaceColor(int cubit, int cubitface, int numLayers)
+    {
+    int numCubitsPerCorner = numCubitsPerCorner(numLayers);
+    int numCubitsPerEdge   = numCubitsPerEdge(numLayers);
+
+    if( cubit < NUM_CORNERS*numCubitsPerCorner )
+      {
+      return getCornerColor(cubit,cubitface,numLayers,numCubitsPerCorner);
+      }
+    else if( cubit<NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge )
+      {
+      int edge = cubit - NUM_CORNERS*numCubitsPerCorner;
+      return getEdgeColor(edge,cubitface,numCubitsPerEdge);
+      }
+    else
+      {
+      int center = cubit-NUM_CORNERS*numCubitsPerCorner-NUM_EDGES*numCubitsPerEdge;
+      return getCenterColor( center, cubitface, numLayers);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
