commit e6734aa97652043623fd97379d6cf986563a043b
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Jun 4 01:25:20 2021 +0200

    Make it possible for an object to have different 'cuts' along each of its axis.

diff --git a/src/main/java/org/distorted/objects/MovementSquare.java b/src/main/java/org/distorted/objects/MovementSquare.java
index 63ad7cbd..96d03253 100644
--- a/src/main/java/org/distorted/objects/MovementSquare.java
+++ b/src/main/java/org/distorted/objects/MovementSquare.java
@@ -67,16 +67,14 @@ class MovementSquare extends Movement
 
   void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
     {
-    enabled[0] = 2;
-
     switch(face)
       {
       case 0:
-      case 1: enabled[1]=1; enabled[2]=2; break;
+      case 1: enabled[0]=1; enabled[1]=0; break;
       case 2:
-      case 3: enabled[1]=0; enabled[2]=2; break;
+      case 3: enabled[0]=1; enabled[1]=1; break;
       case 4:
-      case 5: enabled[1]=0; enabled[2]=1; break;
+      case 5: enabled[0]=2; enabled[1]=0; enabled[2]=1; break;
       }
     }
 }
diff --git a/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java b/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
index 457273b3..7b473c60 100644
--- a/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
+++ b/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
@@ -425,13 +425,16 @@ abstract class TwistyBandagedAbstract extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int numLayers)
+  float[][] getCuts(int numLayers)
     {
-    float[] cuts = new float[numLayers-1];
+    float[][] cuts = new float[3][numLayers-1];
 
     for(int i=0; i<numLayers-1; i++)
       {
-      cuts[i] = (2-numLayers)*0.5f + i;
+      float cut = (2-numLayers)*0.5f + i;
+      cuts[0][i] = cut;
+      cuts[1][i] = cut;
+      cuts[2][i] = cut;
       }
 
     return cuts;
diff --git a/src/main/java/org/distorted/objects/TwistyCube.java b/src/main/java/org/distorted/objects/TwistyCube.java
index bbdd50ab..c3ef2c2f 100644
--- a/src/main/java/org/distorted/objects/TwistyCube.java
+++ b/src/main/java/org/distorted/objects/TwistyCube.java
@@ -232,13 +232,16 @@ class TwistyCube extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int numLayers)
+  float[][] getCuts(int numLayers)
     {
-    float[] cuts = new float[numLayers-1];
+    float[][] cuts = new float[3][numLayers-1];
 
     for(int i=0; i<numLayers-1; i++)
       {
-      cuts[i] = (2-numLayers)*0.5f + i;
+      float cut = (2-numLayers)*0.5f + i;
+      cuts[0][i] = cut;
+      cuts[1][i] = cut;
+      cuts[2][i] = cut;
       }
 
     return cuts;
diff --git a/src/main/java/org/distorted/objects/TwistyDiamond.java b/src/main/java/org/distorted/objects/TwistyDiamond.java
index c6c509b8..cbad5e44 100644
--- a/src/main/java/org/distorted/objects/TwistyDiamond.java
+++ b/src/main/java/org/distorted/objects/TwistyDiamond.java
@@ -185,7 +185,7 @@ public class TwistyDiamond extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int numLayers)
+  float[][] getCuts(int numLayers)
     {
     if( numLayers<2 )
       {
@@ -193,13 +193,16 @@ public class TwistyDiamond extends TwistyObject
       }
     else
       {
-      float[] cuts = new float[numLayers-1];
+      float[][] cuts = new float[4][numLayers-1];
       float dist = SQ6*0.666f*DIST;
       float cut  = 0.5f*dist*(2-numLayers);
 
       for(int i=0; i<numLayers-1; i++)
         {
-        cuts[i] = cut;
+        cuts[0][i] = cut;
+        cuts[1][i] = cut;
+        cuts[2][i] = cut;
+        cuts[3][i] = cut;
         cut += dist;
         }
 
diff --git a/src/main/java/org/distorted/objects/TwistyDino.java b/src/main/java/org/distorted/objects/TwistyDino.java
index 39a07972..90c35987 100644
--- a/src/main/java/org/distorted/objects/TwistyDino.java
+++ b/src/main/java/org/distorted/objects/TwistyDino.java
@@ -143,9 +143,10 @@ public abstract class TwistyDino extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int size)
+  float[][] getCuts(int size)
     {
-    return new float[] { -SQ3/3, +SQ3/3 };
+    float[] cut = new float[] { -SQ3/3, +SQ3/3 };
+    return new float[][] { cut,cut,cut,cut };
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyHelicopter.java b/src/main/java/org/distorted/objects/TwistyHelicopter.java
index 90699f78..9d62e5bb 100644
--- a/src/main/java/org/distorted/objects/TwistyHelicopter.java
+++ b/src/main/java/org/distorted/objects/TwistyHelicopter.java
@@ -275,14 +275,10 @@ public class TwistyHelicopter extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int size)
+  float[][] getCuts(int size)
     {
-    float[] cuts = new float[2];
-
-    cuts[0] = -SQ2/4;
-    cuts[1] = +SQ2/4;
-
-    return cuts;
+    float[] cut = new float[] { -SQ2/4, +SQ2/4 };
+    return new float[][] { cut,cut,cut,cut,cut,cut };
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyIvy.java b/src/main/java/org/distorted/objects/TwistyIvy.java
index 97dda68b..6c86f667 100644
--- a/src/main/java/org/distorted/objects/TwistyIvy.java
+++ b/src/main/java/org/distorted/objects/TwistyIvy.java
@@ -152,12 +152,10 @@ public class TwistyIvy extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int numLayers)
+  float[][] getCuts(int numLayers)
     {
-    float[] cuts = new float[1];
-    cuts[0] = 0.0f;
-
-    return cuts;
+    float[] cut = new float[] {0.0f};
+    return new float[][] { cut,cut,cut,cut };
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyKilominx.java b/src/main/java/org/distorted/objects/TwistyKilominx.java
index cef3ff0d..fee7463a 100644
--- a/src/main/java/org/distorted/objects/TwistyKilominx.java
+++ b/src/main/java/org/distorted/objects/TwistyKilominx.java
@@ -117,9 +117,9 @@ public class TwistyKilominx extends TwistyMinx
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int numLayers)
+  float[][] getCuts(int numLayers)
     {
-    float[] cuts = new float[numLayers-1];
+    float[][] cuts = new float[6][numLayers-1];
     float D = numLayers*MovementMinx.DIST3D;
     float E = 2*SIN54;
     float X = 2*D*E/(1+2*E);  // height of the 'upper' part of a dodecahedron, i.e. put it on a table,
@@ -131,8 +131,20 @@ public class TwistyKilominx extends TwistyMinx
 
     for(int i=0; i<num; i++)
       {
-      cuts[        i] = -D + (i+0.5f)*G;
-      cuts[2*num-1-i] = -cuts[i];
+      float cut = -D + (i+0.5f)*G;
+      int j = 2*num-1-i;
+      cuts[0][i] = +cut;
+      cuts[0][j] = -cut;
+      cuts[1][i] = +cut;
+      cuts[1][j] = -cut;
+      cuts[2][i] = +cut;
+      cuts[2][j] = -cut;
+      cuts[3][i] = +cut;
+      cuts[3][j] = -cut;
+      cuts[4][i] = +cut;
+      cuts[4][j] = -cut;
+      cuts[5][i] = +cut;
+      cuts[5][j] = -cut;
       }
 
     return cuts;
diff --git a/src/main/java/org/distorted/objects/TwistyMegaminx.java b/src/main/java/org/distorted/objects/TwistyMegaminx.java
index 940e8597..c3ffe471 100644
--- a/src/main/java/org/distorted/objects/TwistyMegaminx.java
+++ b/src/main/java/org/distorted/objects/TwistyMegaminx.java
@@ -96,9 +96,9 @@ public class TwistyMegaminx extends TwistyMinx
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int numLayers)
+  float[][] getCuts(int numLayers)
     {
-    float[] cuts = new float[numLayers-1];
+    float[][] cuts = new float[6][numLayers-1];
     float D = numLayers*MovementMinx.DIST3D;
     float E = 2*SIN54;
     float X = 2*D*E/(1+2*E);  // height of the 'upper' part of a dodecahedron, i.e. put it on a table,
@@ -110,8 +110,20 @@ public class TwistyMegaminx extends TwistyMinx
 
     for(int i=0; i<num; i++)
       {
-      cuts[        i] = -D + (i+0.5f)*G;
-      cuts[2*num-1-i] = -cuts[i];
+      float cut = -D + (i+0.5f)*G;
+      int j = 2*num-1-i;
+      cuts[0][i] = +cut;
+      cuts[0][j] = -cut;
+      cuts[1][i] = +cut;
+      cuts[1][j] = -cut;
+      cuts[2][i] = +cut;
+      cuts[2][j] = -cut;
+      cuts[3][i] = +cut;
+      cuts[3][j] = -cut;
+      cuts[4][i] = +cut;
+      cuts[4][j] = -cut;
+      cuts[5][i] = +cut;
+      cuts[5][j] = -cut;
       }
 
     return cuts;
diff --git a/src/main/java/org/distorted/objects/TwistyObject.java b/src/main/java/org/distorted/objects/TwistyObject.java
index da9c905a..bf39654b 100644
--- a/src/main/java/org/distorted/objects/TwistyObject.java
+++ b/src/main/java/org/distorted/objects/TwistyObject.java
@@ -98,8 +98,8 @@ public abstract class TwistyObject extends DistortedNode
 
   private final int mNumCubitFaces;
   private final Static3D[] mAxis;
-  private final float[] mCuts;
-  private final int mNumCuts;
+  private final float[][] mCuts;
+  private final int[] mNumCuts;
   private final int mNodeSize;
   private final float[][] mOrigPos;
   private final Static3D mNodeScale;
@@ -138,8 +138,11 @@ public abstract class TwistyObject extends DistortedNode
     mAxis = getRotationAxis();
     mInitScreenRatio = getScreenRatio();
     mNumCubitFaces = getNumCubitFaces();
+
     mCuts = getCuts(mNumLayers);
-    mNumCuts = mCuts== null ? 0: mCuts.length;
+    mNumCuts = new int[mAxis.length];
+    if( mCuts==null ) for(int i=0; i<mAxis.length; i++) mNumCuts[i] = 0;
+    else              for(int i=0; i<mAxis.length; i++) mNumCuts[i] = mCuts[i].length;
 
     QUATS = getQuats();
     NUM_CUBITS  = mOrigPos.length;
@@ -302,18 +305,20 @@ public abstract class TwistyObject extends DistortedNode
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  int computeRow(float[] pos, int rotIndex)
+  int computeRow(float[] pos, int axisIndex)
     {
     int ret=0;
     int len = pos.length / 3;
-    Static3D axis = mAxis[rotIndex];
+    Static3D axis = mAxis[axisIndex];
     float axisX = axis.get0();
     float axisY = axis.get1();
     float axisZ = axis.get2();
+    float casted;
 
     for(int i=0; i<len; i++)
       {
-      ret |= computeRow(pos[3*i]*axisX + pos[3*i+1]*axisY + pos[3*i+2]*axisZ);
+      casted = pos[3*i]*axisX + pos[3*i+1]*axisY + pos[3*i+2]*axisZ;
+      ret |= computeSingleRow(axisIndex,casted);
       }
 
     return ret;
@@ -321,14 +326,16 @@ public abstract class TwistyObject extends DistortedNode
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private int computeRow(float casted)
+  private int computeSingleRow(int axisIndex,float casted)
     {
-    for(int i=0; i<mNumCuts; i++)
+    int num = mNumCuts[axisIndex];
+
+    for(int i=0; i<num; i++)
       {
-      if( casted<mCuts[i] ) return (1<<i);
+      if( casted<mCuts[axisIndex][i] ) return (1<<i);
       }
 
-    return (1<<mNumCuts);
+    return (1<<num);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -959,7 +966,7 @@ public abstract class TwistyObject extends DistortedNode
   abstract void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top);
   abstract int getFaceColor(int cubit, int cubitface, int numLayers);
   abstract float returnMultiplier();
-  abstract float[] getCuts(int numLayers);
+  abstract float[][] getCuts(int numLayers);
   abstract boolean shouldResetTextureMaps();
   abstract Static3D[] getRotationAxis();
 
diff --git a/src/main/java/org/distorted/objects/TwistyPyraminx.java b/src/main/java/org/distorted/objects/TwistyPyraminx.java
index 01ff16b7..f3ee6133 100644
--- a/src/main/java/org/distorted/objects/TwistyPyraminx.java
+++ b/src/main/java/org/distorted/objects/TwistyPyraminx.java
@@ -218,13 +218,17 @@ public class TwistyPyraminx extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int size)
+  float[][] getCuts(int size)
     {
-    float[] cuts = new float[size-1];
+    float[][] cuts = new float[4][size-1];
 
     for(int i=0; i<size-1; i++)
       {
-      cuts[i] = (1.0f-0.25f*size+i)*(SQ6/3);
+      float cut = (1.0f-0.25f*size+i)*(SQ6/3);
+      cuts[0][i] = cut;
+      cuts[1][i] = cut;
+      cuts[2][i] = cut;
+      cuts[3][i] = cut;
       }
 
     return cuts;
diff --git a/src/main/java/org/distorted/objects/TwistyRedi.java b/src/main/java/org/distorted/objects/TwistyRedi.java
index dde131e0..54a6f324 100644
--- a/src/main/java/org/distorted/objects/TwistyRedi.java
+++ b/src/main/java/org/distorted/objects/TwistyRedi.java
@@ -248,14 +248,10 @@ public class TwistyRedi extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int size)
+  float[][] getCuts(int size)
     {
-    float[] cuts = new float[2];
-
-    cuts[0] = -SQ3/3 -0.05f;
-    cuts[1] = +SQ3/3 +0.05f;
-
-    return cuts;
+    float[] cut = new float[] { -SQ3/3 -0.05f, +SQ3/3 +0.05f };
+    return new float[][] { cut,cut,cut,cut };
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyRex.java b/src/main/java/org/distorted/objects/TwistyRex.java
index c624f13c..7b83676c 100644
--- a/src/main/java/org/distorted/objects/TwistyRex.java
+++ b/src/main/java/org/distorted/objects/TwistyRex.java
@@ -182,11 +182,10 @@ public class TwistyRex extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int numLayers)
+  float[][] getCuts(int numLayers)
     {
-    float C = SQ3*0.15f;   // bit less than 1/6 of the length of the main diagonal
-
-    return new float[] {-C,+C};
+    float[] cut = new float[] {-SQ3*0.15f,+SQ3*0.15f}; // bit less than 1/6 of the length of the main diagonal
+    return new float[][] { cut,cut,cut,cut };
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistySkewb.java b/src/main/java/org/distorted/objects/TwistySkewb.java
index 7ae06de1..9ac1fa1d 100644
--- a/src/main/java/org/distorted/objects/TwistySkewb.java
+++ b/src/main/java/org/distorted/objects/TwistySkewb.java
@@ -243,23 +243,16 @@ public class TwistySkewb extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int numLayers)
+  float[][] getCuts(int numLayers)
     {
-    float[] cuts = new float[numLayers-1];
-
     switch(numLayers)
       {
-      case 2: cuts[0] = 0;
-              break;
-      case 3: cuts[0] = -SQ3/12;
-              cuts[1] = +SQ3/12;
-              break;
-      case 4: cuts[0] = -SQ3/9;
-              cuts[1] = 0;
-              cuts[2] = +SQ3/9;
-              break;
+      case 2: float[] c2 = new float[] {0.0f};
+              return new float[][] { c2,c2,c2,c2 };
+      case 3: float[] c3 = new float[] {-SQ3/12,+SQ3/12};
+              return new float[][] { c3,c3,c3,c3 };
       }
-    return cuts;
+    return null;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistySquare1.java b/src/main/java/org/distorted/objects/TwistySquare1.java
index 62be2877..77c76629 100644
--- a/src/main/java/org/distorted/objects/TwistySquare1.java
+++ b/src/main/java/org/distorted/objects/TwistySquare1.java
@@ -433,18 +433,10 @@ class TwistySquare1 extends TwistyObject
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
 
-  float[] getCuts(int numLayers)
+  float[][] getCuts(int numLayers)
     {
-    float[] cuts = new float[numLayers-1];
-
-    for(int i=0; i<numLayers-1; i++)
-      {
-      cuts[i] = (2-numLayers)*0.5f + i;
-      }
-
-    return cuts;
+    return new float[][] { {-0.5f,+0.5f}, {0.0f} };
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyUltimate.java b/src/main/java/org/distorted/objects/TwistyUltimate.java
index 6841a9d4..e6eed015 100644
--- a/src/main/java/org/distorted/objects/TwistyUltimate.java
+++ b/src/main/java/org/distorted/objects/TwistyUltimate.java
@@ -397,12 +397,10 @@ class TwistyUltimate extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  float[] getCuts(int numLayers)
+  float[][] getCuts(int numLayers)
     {
-    float[] cuts = new float[1];
-    cuts[0] = 0.0f;
-
-    return cuts;
+    float[] cut = new float[] {0.0f};
+    return new float[][] { cut,cut,cut,cut };
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
