commit 2fcad75d24ff0d4677249330c6c0a300ae790552
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Jun 9 13:20:01 2020 +0100

    Bugfixes.

diff --git a/src/main/java/org/distorted/objects/Cubit.java b/src/main/java/org/distorted/objects/Cubit.java
index 163dac68..8faac2f0 100644
--- a/src/main/java/org/distorted/objects/Cubit.java
+++ b/src/main/java/org/distorted/objects/Cubit.java
@@ -35,7 +35,7 @@ class Cubit
   private Static3D mCurrentPosition;
   private int mNumAxis;
 
-  Static4D mQuatScramble;
+  int mQuatIndex;
   float[] mRotationRow;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -48,9 +48,8 @@ class Cubit
 
     mParent          = parent;
     mOrigPosition    = new Static3D(x,y,z);
-    mQuatScramble    = new Static4D(0,0,0,1);
-
-    mCurrentPosition = position;
+    mCurrentPosition = new Static3D(x,y,z);
+    mQuatIndex       = 0;
 
     mNumAxis     = mParent.ROTATION_AXIS.length;
     mRotationRow = new float[mNumAxis];
@@ -172,26 +171,18 @@ class Cubit
   void savePreferences(SharedPreferences.Editor editor)
     {
     String number = mOrigPosition.get0()+"_"+mOrigPosition.get1()+"_"+mOrigPosition.get2();
-
-    editor.putFloat("qx_"+number, mQuatScramble.get0());
-    editor.putFloat("qy_"+number, mQuatScramble.get1());
-    editor.putFloat("qz_"+number, mQuatScramble.get2());
-    editor.putFloat("qw_"+number, mQuatScramble.get3());
+    editor.putInt("q_"+number, mQuatIndex);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void restorePreferences(SharedPreferences preferences)
+  int restorePreferences(SharedPreferences preferences)
     {
     String number = mOrigPosition.get0()+"_"+mOrigPosition.get1()+"_"+mOrigPosition.get2();
+    mQuatIndex = preferences.getInt("q_"+number, 0);
+    modifyCurrentPosition(mParent.QUATS[mQuatIndex]);
 
-    float qx = preferences.getFloat("qx_"+number, 0.0f);
-    float qy = preferences.getFloat("qy_"+number, 0.0f);
-    float qz = preferences.getFloat("qz_"+number, 0.0f);
-    float qw = preferences.getFloat("qw_"+number, 1.0f);
-
-    mQuatScramble.set(qx,qy,qz,qw);
-    modifyCurrentPosition(mQuatScramble);
+    return mQuatIndex;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -204,12 +195,9 @@ class Cubit
 // a) is a corner or edge and the quaternions are the same
 // b) is inside one of the faces and after rotations by both quats it ends up on the same face.
 
-  boolean thereIsNoVisibleDifference(Static4D quat)
+  boolean thereIsNoVisibleDifference(int quatIndex)
     {
-    if ( mQuatScramble.get0()==quat.get0() &&
-         mQuatScramble.get1()==quat.get1() &&
-         mQuatScramble.get2()==quat.get2() &&
-         mQuatScramble.get3()==quat.get3()  ) return true;
+    if ( mQuatIndex == quatIndex ) return true;
 
     int belongsToHowManyFaces = 0;
     int size = mParent.getSize()-1;
@@ -231,9 +219,12 @@ class Cubit
                float cubitCenterY = mCurrentPosition.get1();
                float cubitCenterZ = mCurrentPosition.get2();
 
+               Static4D quat1 = mParent.QUATS[quatIndex];
+               Static4D quat2 = mParent.QUATS[mQuatIndex];
+
                Static4D cubitCenter = new Static4D(cubitCenterX, cubitCenterY, cubitCenterZ, 0);
-               Static4D rotated1 = RubikSurfaceView.rotateVectorByQuat( cubitCenter, quat);
-               Static4D rotated2 = RubikSurfaceView.rotateVectorByQuat( cubitCenter, mQuatScramble );
+               Static4D rotated1 = RubikSurfaceView.rotateVectorByQuat( cubitCenter, quat1 );
+               Static4D rotated2 = RubikSurfaceView.rotateVectorByQuat( cubitCenter, quat2 );
 
                float row1, row2, row3, row4;
                float ax,ay,az;
@@ -272,20 +263,19 @@ class Cubit
 
   int removeRotationNow(Static4D quat)
     {
-    mQuatScramble.set(RubikSurfaceView.quatMultiply(quat,mQuatScramble));
-    int index = normalizeScrambleQuat( mQuatScramble );
-    mQuatScramble.set(mParent.QUATS[index]);
+    Static4D q = RubikSurfaceView.quatMultiply(quat,mParent.QUATS[mQuatIndex]);
+    mQuatIndex = normalizeScrambleQuat(q);
 
     modifyCurrentPosition(quat);
 
-    return index;
+    return mQuatIndex;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   void solve()
     {
-    mQuatScramble.set(0,0,0,1);
+    mQuatIndex = 0;
     mCurrentPosition.set(mOrigPosition);
     computeRotationRow();
     }
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index 89020f12..149abadb 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -358,7 +358,11 @@ public abstract class RubikObject extends DistortedNode
 
   public void restorePreferences(SharedPreferences preferences)
     {
-    for(int i=0; i<NUM_CUBITS; i++) mCubits[i].restorePreferences(preferences);
+    for(int i=0; i<NUM_CUBITS; i++)
+      {
+      int index = mCubits[i].restorePreferences(preferences);
+      mMesh.setEffectAssociation(i,mCubits[i].computeAssociation(),index);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -397,11 +401,11 @@ public abstract class RubikObject extends DistortedNode
 
   public boolean isSolved()
     {
-    Static4D q = mCubits[0].mQuatScramble;
+    int index = mCubits[0].mQuatIndex;
 
     for(int i=1; i<NUM_CUBITS; i++)
       {
-      if( !mCubits[i].thereIsNoVisibleDifference(q) ) return false;
+      if( !mCubits[i].thereIsNoVisibleDifference(index) ) return false;
       }
 
     return true;
