commit a304ee64f6fcccd128199f1b8dbeb8bd8da8f34a
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Apr 6 23:18:06 2020 +0100

    Progress implementing RubikCube.retObjectString()

diff --git a/src/main/java/org/distorted/objects/Cubit.java b/src/main/java/org/distorted/objects/Cubit.java
index d2709ac8..e1cd4bd9 100644
--- a/src/main/java/org/distorted/objects/Cubit.java
+++ b/src/main/java/org/distorted/objects/Cubit.java
@@ -418,6 +418,14 @@ class Cubit
     return dx*dx + dy*dy + dz*dz;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getColorIndex(int face)
+    {
+    Static4D texMap = mMesh.getTextureMap(face);
+    return (int)(texMap.get0() / texMap.get2());
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   MeshBase getMesh()
diff --git a/src/main/java/org/distorted/objects/RubikCube.java b/src/main/java/org/distorted/objects/RubikCube.java
index 08d88bc7..f41d21d6 100644
--- a/src/main/java/org/distorted/objects/RubikCube.java
+++ b/src/main/java/org/distorted/objects/RubikCube.java
@@ -227,6 +227,17 @@ class RubikCube extends RubikObject
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
+// order: Up --> Right --> Front --> Down --> Left --> Back
+// (because the first implemented Solver - the two-phase Cube3 one - expects such order)
+//
+// s : size of the cube
+//
+// Left  :   index --> ((s-1) + index/s) * s + index%s
+// Right :   index --> 6*s*s - 12*s + 7 - index
+// Bottom:   index --> s|index ? (s-1 - index/s) : (s*s + s-1 + 4*(index%s -1)*(s-1) - index/s)
+// Top   :   index -->
+// Front :   index -->
+// Back  :   index -->
 
   public String retObjectString()
     {
diff --git a/src/main/java/org/distorted/solvers/Solver.java b/src/main/java/org/distorted/solvers/Solver.java
deleted file mode 100644
index 2bc9ea52..00000000
--- a/src/main/java/org/distorted/solvers/Solver.java
+++ /dev/null
@@ -1,113 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2020 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Magic Cube.                                                              //
-//                                                                                               //
-// Magic Cube is free software: you can redistribute it and/or modify                            //
-// it under the terms of the GNU General Public License as published by                          //
-// the Free Software Foundation, either version 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Magic Cube is distributed in the hope that it will be useful,                                 //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
-// GNU General Public License for more details.                                                  //
-//                                                                                               //
-// You should have received a copy of the GNU General Public License                             //
-// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.solvers;
-
-import android.content.res.Resources;
-
-import org.distorted.main.R;
-import org.distorted.objects.RubikObjectList;
-import org.distorted.states.RubikState;
-import org.distorted.states.RubikStateSolver;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class Solver implements Runnable
-{
-  private String mObjectPosition;
-  private Resources mRes;
-  private RubikObjectList mObject;
-  private int mSize;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public Solver(Resources res, RubikObjectList object, int size, String position )
-    {
-    mRes            = res;
-    mObject         = object;
-    mSize           = size;
-    mObjectPosition = position;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void solveCube3(RubikStateSolver solver)
-    {
-    String result;
-
-    if( !org.distorted.solvers.cube3.Search.prepare(mRes) )
-      result= "Error 9";
-    else
-      result = org.distorted.solvers.cube3.Search.solution(mObjectPosition, 24, 20);
-
-    if (result.contains("Error"))
-      {
-      switch (result.charAt(result.length() - 1))
-        {
-        case '1': result = mRes.getString(R.string.solver_cube3_error1); break;
-        case '2': result = mRes.getString(R.string.solver_cube3_error2); break;
-        case '3': result = mRes.getString(R.string.solver_cube3_error3); break;
-        case '4': result = mRes.getString(R.string.solver_cube3_error4); break;
-        case '5': result = mRes.getString(R.string.solver_cube3_error5); break;
-        case '6': result = mRes.getString(R.string.solver_cube3_error6); break;
-        case '7': result = mRes.getString(R.string.solver_cube3_error7); break;
-        case '8': result = mRes.getString(R.string.solver_cube3_error8); break;
-        case '9': result = mRes.getString(R.string.solver_cube3_error9); break;
-        }
-
-      solver.displayErrorDialog(result);
-      }
-    else
-      {
-      solver.setSolved(result);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void interruptCube3()
-    {
-    org.distorted.solvers.cube3.Search.interrupt();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void start()
-    {
-    Thread thr = new Thread(this);
-    thr.start();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void run()
-    {
-    RubikStateSolver solver = (RubikStateSolver) RubikState.SVER.getStateClass();
-
-    if( mObject == RubikObjectList.CUBE && mSize == 3)
-      {
-      solveCube3(solver);
-      }
-    else
-      {
-      solver.displayErrorDialog(mRes.getString(R.string.solver_generic_error1));
-      }
-    }
-}  
-
diff --git a/src/main/java/org/distorted/solvers/SolverMain.java b/src/main/java/org/distorted/solvers/SolverMain.java
new file mode 100644
index 00000000..86dd4723
--- /dev/null
+++ b/src/main/java/org/distorted/solvers/SolverMain.java
@@ -0,0 +1,113 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2020 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is free software: you can redistribute it and/or modify                            //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Magic Cube is distributed in the hope that it will be useful,                                 //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.solvers;
+
+import android.content.res.Resources;
+
+import org.distorted.main.R;
+import org.distorted.objects.RubikObjectList;
+import org.distorted.states.RubikState;
+import org.distorted.states.RubikStateSolver;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class SolverMain implements Runnable
+{
+  private String mObjectPosition;
+  private Resources mRes;
+  private RubikObjectList mObject;
+  private int mSize;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public SolverMain(Resources res, RubikObjectList object, int size, String position )
+    {
+    mRes            = res;
+    mObject         = object;
+    mSize           = size;
+    mObjectPosition = position;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void solveCube3(RubikStateSolver solver)
+    {
+    String result;
+
+    if( !org.distorted.solvers.cube3.Search.prepare(mRes) )
+      result= "Error 9";
+    else
+      result = org.distorted.solvers.cube3.Search.solution(mObjectPosition, 24, 20);
+
+    if (result.contains("Error"))
+      {
+      switch (result.charAt(result.length() - 1))
+        {
+        case '1': result = mRes.getString(R.string.solver_cube3_error1); break;
+        case '2': result = mRes.getString(R.string.solver_cube3_error2); break;
+        case '3': result = mRes.getString(R.string.solver_cube3_error3); break;
+        case '4': result = mRes.getString(R.string.solver_cube3_error4); break;
+        case '5': result = mRes.getString(R.string.solver_cube3_error5); break;
+        case '6': result = mRes.getString(R.string.solver_cube3_error6); break;
+        case '7': result = mRes.getString(R.string.solver_cube3_error7); break;
+        case '8': result = mRes.getString(R.string.solver_cube3_error8); break;
+        case '9': result = mRes.getString(R.string.solver_cube3_error9); break;
+        }
+
+      solver.displayErrorDialog(result);
+      }
+    else
+      {
+      solver.setSolved(result);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void interruptCube3()
+    {
+    org.distorted.solvers.cube3.Search.interrupt();
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void start()
+    {
+    Thread thr = new Thread(this);
+    thr.start();
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void run()
+    {
+    RubikStateSolver solver = (RubikStateSolver) RubikState.SVER.getStateClass();
+
+    if( mObject == RubikObjectList.CUBE && mSize == 3)
+      {
+      solveCube3(solver);
+      }
+    else
+      {
+      solver.displayErrorDialog(mRes.getString(R.string.solver_generic_error1));
+      }
+    }
+}  
+
diff --git a/src/main/java/org/distorted/states/RubikStateSolver.java b/src/main/java/org/distorted/states/RubikStateSolver.java
index fc892021..bc667634 100644
--- a/src/main/java/org/distorted/states/RubikStateSolver.java
+++ b/src/main/java/org/distorted/states/RubikStateSolver.java
@@ -40,7 +40,7 @@ import org.distorted.main.RubikPostRender;
 import org.distorted.objects.RubikObject;
 import org.distorted.objects.RubikObjectList;
 import org.distorted.solvers.ImplementedSolversList;
-import org.distorted.solvers.Solver;
+import org.distorted.solvers.SolverMain;
 
 import java.lang.ref.WeakReference;
 
@@ -199,7 +199,7 @@ public class RubikStateSolver extends RubikStateAbstract
           mSolving = true;
           RubikObject object = act.getObject();
           String objectString = object.retObjectString();
-          Solver solver = new Solver( act.getResources(), mCurrentObject, mCurrentObjectSize, objectString );
+          SolverMain solver = new SolverMain( act.getResources(), mCurrentObject, mCurrentObjectSize, objectString );
           solver.start();
           }
         }
