commit 169219a7ac3a30e156ad99192e5f3f141bf1b993
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Aug 26 22:30:01 2021 +0200

    Remove the last 'isSolved()' (from Dino4) and put it to the parent class as a special case.

diff --git a/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java b/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
index 7f3136c5..f4120fff 100644
--- a/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
+++ b/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
@@ -353,6 +353,13 @@ abstract class TwistyBandagedAbstract extends TwistyObject
     return cuts;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumStickerTypes(int numLayers)
diff --git a/src/main/java/org/distorted/objects/TwistyCube.java b/src/main/java/org/distorted/objects/TwistyCube.java
index 695603b1..4f51eaa8 100644
--- a/src/main/java/org/distorted/objects/TwistyCube.java
+++ b/src/main/java/org/distorted/objects/TwistyCube.java
@@ -263,6 +263,13 @@ class TwistyCube extends TwistyObject
     return cuts;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumStickerTypes(int numLayers)
diff --git a/src/main/java/org/distorted/objects/TwistyDiamond.java b/src/main/java/org/distorted/objects/TwistyDiamond.java
index 3a5af363..7e081ee2 100644
--- a/src/main/java/org/distorted/objects/TwistyDiamond.java
+++ b/src/main/java/org/distorted/objects/TwistyDiamond.java
@@ -179,6 +179,13 @@ public class TwistyDiamond extends TwistyObject
     return false;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumStickerTypes(int numLayers)
diff --git a/src/main/java/org/distorted/objects/TwistyDino4.java b/src/main/java/org/distorted/objects/TwistyDino4.java
index f075b4f2..af29b0b4 100644
--- a/src/main/java/org/distorted/objects/TwistyDino4.java
+++ b/src/main/java/org/distorted/objects/TwistyDino4.java
@@ -21,7 +21,6 @@ package org.distorted.objects;
 
 import android.content.res.Resources;
 
-import org.distorted.helpers.QuatHelper;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshSquare;
@@ -35,55 +34,11 @@ import java.util.Random;
 public class TwistyDino4 extends TwistyDino
 {
   private static final int[] mFaceMap = { 4, 2, 2, 4, 0, 2, 1, 4, 0, 0, 1, 1 };
-  private static final int[][] mScramble;
-
-  static
-    {
-    int numQuats = QUATS.length;
-    int numCenters = CENTERS.length;
-
-    mScramble = new int[numQuats][numCenters];
-
-    for(int q=0; q<numQuats; q++)
-      for(int c=0; c<numCenters; c++) mScramble[q][c] = computeScramble(q,c);
-    }
-
-  private final int[] mColors = new int[CENTERS.length];
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private static int computeScramble(int quatNum, int centerNum)
-    {
-    float MAXDIFF = 0.01f;
-    float[] center= CENTERS[centerNum];
-    Static4D sc = new Static4D(center[0], center[1], center[2], 1.0f);
-    Static4D result = QuatHelper.rotateVectorByQuat(sc,QUATS[quatNum]);
-    int numCenters = CENTERS.length;
-
-    float x = result.get0();
-    float y = result.get1();
-    float z = result.get2();
-
-    for(int c=0; c<numCenters; c++)
-      {
-      float[] cent = CENTERS[c];
-
-      float qx = cent[0] - x;
-      float qy = cent[1] - y;
-      float qz = cent[2] - z;
-
-      if( qx>-MAXDIFF && qx<MAXDIFF &&
-          qy>-MAXDIFF && qy<MAXDIFF &&
-          qz>-MAXDIFF && qz<MAXDIFF  ) return c;
-      }
-
-    return -1;
-    }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  TwistyDino4(int size, Static4D quat, DistortedTexture texture,
-              MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
+  TwistyDino4(int size, Static4D quat, DistortedTexture texture, MeshSquare mesh,
+              DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
     {
     super(size, quat, texture, mesh, effects, moves, ObjectList.DIN4, res, scrWidth);
     }
@@ -102,6 +57,13 @@ public class TwistyDino4 extends TwistyDino
     return (cubitface==0 || cubitface==1) ? mFaceMap[cubit] : NUM_TEXTURES;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 1;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   boolean shouldResetTextureMaps()
@@ -132,34 +94,6 @@ public class TwistyDino4 extends TwistyDino
       }
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Dino4 is solved if and only if groups of cubits
-// (0,3,7), (1,2,5), (4,8,9), (6,10,11)
-// or
-// (0,1,4), (2,3,6), (5,9,10), (7,8,11)
-// are all the same color.
-
-  public boolean isSolved()
-    {
-    int numCenters = CENTERS.length;
-
-    for(int c=0; c<numCenters; c++)
-      {
-      int index = mScramble[CUBITS[c].mQuatIndex][c];
-      mColors[index] = mFaceMap[c];
-      }
-
-    if( mColors[0]==mColors[3] && mColors[0]==mColors[7] &&
-        mColors[1]==mColors[2] && mColors[1]==mColors[5] &&
-        mColors[4]==mColors[8] && mColors[4]==mColors[9]  ) return true;
-
-    if( mColors[0]==mColors[1] && mColors[0]==mColors[4] &&
-        mColors[2]==mColors[3] && mColors[2]==mColors[6] &&
-        mColors[5]==mColors[9] && mColors[5]==mColors[10] ) return true;
-
-    return false;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int getObjectName(int numLayers)
diff --git a/src/main/java/org/distorted/objects/TwistyDino6.java b/src/main/java/org/distorted/objects/TwistyDino6.java
index d17eabbe..fed76ade 100644
--- a/src/main/java/org/distorted/objects/TwistyDino6.java
+++ b/src/main/java/org/distorted/objects/TwistyDino6.java
@@ -39,8 +39,8 @@ public class TwistyDino6 extends TwistyDino
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  TwistyDino6(int size, Static4D quat, DistortedTexture texture,
-              MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
+  TwistyDino6(int size, Static4D quat, DistortedTexture texture, MeshSquare mesh,
+              DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
     {
     super(size, quat, texture, mesh, effects, moves, ObjectList.DINO, res, scrWidth);
     }
@@ -87,6 +87,13 @@ public class TwistyDino6 extends TwistyDino
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   boolean shouldResetTextureMaps()
diff --git a/src/main/java/org/distorted/objects/TwistyHelicopter.java b/src/main/java/org/distorted/objects/TwistyHelicopter.java
index 0ecbd399..a238c72a 100644
--- a/src/main/java/org/distorted/objects/TwistyHelicopter.java
+++ b/src/main/java/org/distorted/objects/TwistyHelicopter.java
@@ -279,6 +279,13 @@ public class TwistyHelicopter extends TwistyObject
     return FACE_COLORS.length;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumStickerTypes(int numLayers)
diff --git a/src/main/java/org/distorted/objects/TwistyIvy.java b/src/main/java/org/distorted/objects/TwistyIvy.java
index 9e3910f4..2b0521b6 100644
--- a/src/main/java/org/distorted/objects/TwistyIvy.java
+++ b/src/main/java/org/distorted/objects/TwistyIvy.java
@@ -160,6 +160,13 @@ public class TwistyIvy extends TwistyObject
     return false;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumStickerTypes(int numLayers)
diff --git a/src/main/java/org/distorted/objects/TwistyJing.java b/src/main/java/org/distorted/objects/TwistyJing.java
index 3090a69e..8031400a 100644
--- a/src/main/java/org/distorted/objects/TwistyJing.java
+++ b/src/main/java/org/distorted/objects/TwistyJing.java
@@ -252,6 +252,13 @@ public class TwistyJing extends TwistyObject
     return FACE_COLORS.length;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumStickerTypes(int numLayers)
diff --git a/src/main/java/org/distorted/objects/TwistyMinx.java b/src/main/java/org/distorted/objects/TwistyMinx.java
index 441f0fbc..7b39a6ad 100644
--- a/src/main/java/org/distorted/objects/TwistyMinx.java
+++ b/src/main/java/org/distorted/objects/TwistyMinx.java
@@ -360,6 +360,13 @@ abstract class TwistyMinx extends TwistyObject
     return FACE_COLORS.length;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   boolean shouldResetTextureMaps()
diff --git a/src/main/java/org/distorted/objects/TwistyObject.java b/src/main/java/org/distorted/objects/TwistyObject.java
index 3660bdb1..37a26d9c 100644
--- a/src/main/java/org/distorted/objects/TwistyObject.java
+++ b/src/main/java/org/distorted/objects/TwistyObject.java
@@ -115,6 +115,7 @@ public abstract class TwistyObject extends DistortedNode
   private final Static1D mRotationAngleStatic, mRotationAngleMiddle, mRotationAngleFinal;
   private final DistortedTexture mTexture;
   private final float mInitScreenRatio;
+  private final int mSolvedFunctionIndex;
   private float mObjectScreenRatio;
   private int[][] mSolvedQuats;
   private int[][] mQuatMult;
@@ -124,6 +125,12 @@ public abstract class TwistyObject extends DistortedNode
   private int mRotAxis;
   private MeshBase mMesh;
 
+  //////////////////// SOLVED1 ////////////////////////
+
+  private static final int[] mFaceMap = { 4, 2, 2, 4, 0, 2, 1, 4, 0, 0, 1, 1 };
+  private static int[][] mScramble;
+  private int[] mColors;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   TwistyObject(int numLayers, int realSize, Static4D quat, DistortedTexture nodeTexture, MeshSquare nodeMesh,
@@ -143,6 +150,7 @@ public abstract class TwistyObject extends DistortedNode
     mInitScreenRatio = getScreenRatio();
     mObjectScreenRatio = 1.0f;
     mNumCubitFaces = getNumCubitFaces();
+    mSolvedFunctionIndex = getSolvedFunctionIndex();
 
     mCuts = getCuts(mNumLayers);
     mNumCuts = new int[mAxis.length];
@@ -428,6 +436,16 @@ public abstract class TwistyObject extends DistortedNode
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public boolean isSolved()
+    {
+    if( mSolvedFunctionIndex==0 ) return isSolved0();
+    if( mSolvedFunctionIndex==1 ) return isSolved1();
+
+    return false;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public boolean isSolved0()
     {
     int len, q1,q = CUBITS[0].mQuatIndex;
     int[] solved;
@@ -458,6 +476,71 @@ public abstract class TwistyObject extends DistortedNode
     return true;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int computeScramble(int quatNum, int centerNum)
+    {
+    float MAXDIFF = 0.01f;
+    float[] center= mOrigPos[centerNum];
+    Static4D sc = new Static4D(center[0], center[1], center[2], 1.0f);
+    Static4D result = QuatHelper.rotateVectorByQuat(sc,QUATS[quatNum]);
+
+    float x = result.get0();
+    float y = result.get1();
+    float z = result.get2();
+
+    for(int c=0; c<NUM_CUBITS; c++)
+      {
+      float[] cent = mOrigPos[c];
+
+      float qx = cent[0] - x;
+      float qy = cent[1] - y;
+      float qz = cent[2] - z;
+
+      if( qx>-MAXDIFF && qx<MAXDIFF &&
+          qy>-MAXDIFF && qy<MAXDIFF &&
+          qz>-MAXDIFF && qz<MAXDIFF  ) return c;
+      }
+
+    return -1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Dino4 uses this. It is solved if and only if groups of cubits
+// (0,3,7), (1,2,5), (4,8,9), (6,10,11)
+// or
+// (0,1,4), (2,3,6), (5,9,10), (7,8,11)
+// are all the same color.
+
+  public boolean isSolved1()
+    {
+    if( mScramble==null )
+      {
+      int numQuats = QUATS.length;
+      mScramble = new int[numQuats][NUM_CUBITS];
+      mColors   = new int[NUM_CUBITS];
+
+      for(int q=0; q<numQuats; q++)
+        for(int c=0; c<NUM_CUBITS; c++) mScramble[q][c] = computeScramble(q,c);
+      }
+
+    for(int c=0; c<NUM_CUBITS; c++)
+      {
+      int index = mScramble[CUBITS[c].mQuatIndex][c];
+      mColors[index] = mFaceMap[c];
+      }
+
+    if( mColors[0]==mColors[3] && mColors[0]==mColors[7] &&
+        mColors[1]==mColors[2] && mColors[1]==mColors[5] &&
+        mColors[4]==mColors[8] && mColors[4]==mColors[9]  ) return true;
+
+    if( mColors[0]==mColors[1] && mColors[0]==mColors[4] &&
+        mColors[2]==mColors[3] && mColors[2]==mColors[6] &&
+        mColors[5]==mColors[9] && mColors[5]==mColors[10] ) return true;
+
+    return false;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void setObjectRatio(float sizeChange)
@@ -1089,6 +1172,7 @@ public abstract class TwistyObject extends DistortedNode
   abstract Static4D getQuat(int cubit, int numLayers);
   abstract ObjectShape getObjectShape(int cubit, int numLayers);
   abstract int[] getSolvedQuats(int cubit, int numLayers);
+  abstract int getSolvedFunctionIndex();
 
   public abstract Static3D[] getRotationAxis();
   public abstract int[] getBasicAngle();
diff --git a/src/main/java/org/distorted/objects/TwistyPyraminx.java b/src/main/java/org/distorted/objects/TwistyPyraminx.java
index 4531b073..3cf0965c 100644
--- a/src/main/java/org/distorted/objects/TwistyPyraminx.java
+++ b/src/main/java/org/distorted/objects/TwistyPyraminx.java
@@ -226,6 +226,13 @@ public class TwistyPyraminx extends TwistyObject
     return FACE_COLORS.length;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumStickerTypes(int numLayers)
diff --git a/src/main/java/org/distorted/objects/TwistyRedi.java b/src/main/java/org/distorted/objects/TwistyRedi.java
index 64d1e080..3b4db123 100644
--- a/src/main/java/org/distorted/objects/TwistyRedi.java
+++ b/src/main/java/org/distorted/objects/TwistyRedi.java
@@ -242,6 +242,13 @@ public class TwistyRedi extends TwistyObject
     return FACE_COLORS.length;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   boolean shouldResetTextureMaps()
diff --git a/src/main/java/org/distorted/objects/TwistyRex.java b/src/main/java/org/distorted/objects/TwistyRex.java
index b435fcc7..c453e866 100644
--- a/src/main/java/org/distorted/objects/TwistyRex.java
+++ b/src/main/java/org/distorted/objects/TwistyRex.java
@@ -196,6 +196,13 @@ public class TwistyRex extends TwistyObject
     return false;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumStickerTypes(int numLayers)
diff --git a/src/main/java/org/distorted/objects/TwistySkewb.java b/src/main/java/org/distorted/objects/TwistySkewb.java
index 8c63ae96..286237cd 100644
--- a/src/main/java/org/distorted/objects/TwistySkewb.java
+++ b/src/main/java/org/distorted/objects/TwistySkewb.java
@@ -247,6 +247,13 @@ public class TwistySkewb extends TwistyObject
     return FACE_COLORS.length;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   boolean shouldResetTextureMaps()
diff --git a/src/main/java/org/distorted/objects/TwistySquare.java b/src/main/java/org/distorted/objects/TwistySquare.java
index 957c98ab..9910095a 100644
--- a/src/main/java/org/distorted/objects/TwistySquare.java
+++ b/src/main/java/org/distorted/objects/TwistySquare.java
@@ -220,6 +220,13 @@ abstract class TwistySquare extends TwistyObject
     return FACE_COLORS[face];
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistyUltimate.java b/src/main/java/org/distorted/objects/TwistyUltimate.java
index 13a19c9c..275acdf6 100644
--- a/src/main/java/org/distorted/objects/TwistyUltimate.java
+++ b/src/main/java/org/distorted/objects/TwistyUltimate.java
@@ -349,6 +349,13 @@ class TwistyUltimate extends TwistyObject
     return QUATS;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getSolvedFunctionIndex()
+    {
+    return 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   boolean shouldResetTextureMaps()
