commit 9621255fb92c5825e066c386701d32a0e19d50e6
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun Apr 5 23:45:15 2020 +0100

    Progress with the 3x3x3 Solver.

diff --git a/src/main/java/org/distorted/main/RubikSurfaceView.java b/src/main/java/org/distorted/main/RubikSurfaceView.java
index b9247679..408e0ecc 100644
--- a/src/main/java/org/distorted/main/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/main/RubikSurfaceView.java
@@ -173,7 +173,7 @@ public class RubikSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void setUpDragOrRotate(float x, float y)
+    private void setUpDragOrRotate(boolean down, float x, float y)
       {
       int mode = RubikState.getMode();
 
@@ -201,11 +201,18 @@ public class RubikSurfaceView extends GLSurfaceView
           else if( mode==MODE_REPLACE )
             {
             mBeginningRotation= false;
-            RubikStateSolver solver = (RubikStateSolver) RubikState.SVER.getStateClass();
-            int cubit = mMovement.getTouchedCubit();
-            int face  = mMovement.getTouchedFace();
-            int color = solver.getCurrentColor();
-            mPostRender.setTextureMap( cubit, face, color );
+
+            if( down )
+              {
+              RubikStateSolver solver = (RubikStateSolver) RubikState.SVER.getStateClass();
+              int face      = mMovement.getTouchedFace();
+              float[] point = mMovement.getTouchedPoint3D();
+              int color = solver.getCurrentColor();
+              RubikObject object = mPostRender.getObject();
+              int cubit = object.getCubit(point);
+
+              mPostRender.setTextureMap( cubit, face, color );
+              }
             }
           }
         else
@@ -337,7 +344,7 @@ public class RubikSurfaceView extends GLSurfaceView
          {
          case MotionEvent.ACTION_DOWN: mX = x;
                                        mY = y;
-                                       setUpDragOrRotate(x,y);
+                                       setUpDragOrRotate(true,x,y);
                                        break;
          case MotionEvent.ACTION_MOVE: if( mBeginningRotation )
                                          {
@@ -357,7 +364,7 @@ public class RubikSurfaceView extends GLSurfaceView
                                            computeCurrentAxis( object.getRotationAxis()[axis] );
                                            mRotationFactor = object.returnRotationFactor(offset);
 
-                                           object.beginNewRotation( axis, object.returnRowFromOffset(offset) );
+                                           object.beginNewRotation( axis, (int)(object.returnMultiplier()*offset) );
 
                                            if( RubikState.getCurrentState()==RubikState.SOLV )
                                              {
@@ -391,7 +398,7 @@ public class RubikSurfaceView extends GLSurfaceView
                                          }
                                        else
                                          {
-                                         setUpDragOrRotate(x,y);
+                                         setUpDragOrRotate(false,x,y);
                                          }
                                        break;
          case MotionEvent.ACTION_UP  : if( mDragging )
diff --git a/src/main/java/org/distorted/objects/Cubit.java b/src/main/java/org/distorted/objects/Cubit.java
index e6f666d0..d2709ac8 100644
--- a/src/main/java/org/distorted/objects/Cubit.java
+++ b/src/main/java/org/distorted/objects/Cubit.java
@@ -407,6 +407,17 @@ class Cubit
     return mRotateEffect.getID();
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float getDistSquared(float[] point)
+    {
+    float dx = mCurrentPosition.get0() - point[0];
+    float dy = mCurrentPosition.get1() - point[1];
+    float dz = mCurrentPosition.get2() - point[2];
+
+    return dx*dx + dy*dy + dz*dz;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   MeshBase getMesh()
diff --git a/src/main/java/org/distorted/objects/RubikCube.java b/src/main/java/org/distorted/objects/RubikCube.java
index 33ced24d..49dbb066 100644
--- a/src/main/java/org/distorted/objects/RubikCube.java
+++ b/src/main/java/org/distorted/objects/RubikCube.java
@@ -214,9 +214,9 @@ class RubikCube extends RubikObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int returnRowFromOffset(float offset)
+  public float returnMultiplier()
     {
-    return (int)(getSize()*offset);
+    return getSize();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index 03550aaa..d60825b7 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -535,6 +535,31 @@ public abstract class RubikObject extends DistortedNode
     setupPosition(moves);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getCubit(float[] point3D)
+    {
+    float dist, minDist = Float. MAX_VALUE;
+    int currentBest=-1;
+    float multiplier = returnMultiplier();
+
+    point3D[0] *= multiplier;
+    point3D[1] *= multiplier;
+    point3D[2] *= multiplier;
+
+    for(int i=0; i<NUM_CUBITS; i++)
+      {
+      dist = mCubits[i].getDistSquared(point3D);
+      if( dist<minDist )
+        {
+        minDist = dist;
+        currentBest = i;
+        }
+      }
+
+    return currentBest;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public RubikObjectList getObjectList()
@@ -553,6 +578,6 @@ public abstract class RubikObject extends DistortedNode
   abstract void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top, int side);
   public abstract Static3D[] getRotationAxis();
   public abstract int getBasicAngle();
-  public abstract int returnRowFromOffset(float offset);
+  public abstract float returnMultiplier();
   public abstract float returnRotationFactor(float offset);
   }
diff --git a/src/main/java/org/distorted/objects/RubikObjectMovement.java b/src/main/java/org/distorted/objects/RubikObjectMovement.java
index 10fc89e9..07997ac2 100644
--- a/src/main/java/org/distorted/objects/RubikObjectMovement.java
+++ b/src/main/java/org/distorted/objects/RubikObjectMovement.java
@@ -292,10 +292,9 @@ public abstract class RubikObjectMovement
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
 
-  public int getTouchedCubit()
+  public float[] getTouchedPoint3D()
     {
-    return 0;
+    return mTouch;
     }
   }
diff --git a/src/main/java/org/distorted/objects/RubikPyraminx.java b/src/main/java/org/distorted/objects/RubikPyraminx.java
index 1272fced..29c21528 100644
--- a/src/main/java/org/distorted/objects/RubikPyraminx.java
+++ b/src/main/java/org/distorted/objects/RubikPyraminx.java
@@ -305,9 +305,9 @@ public class RubikPyraminx extends RubikObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int returnRowFromOffset(float offset)
+  public float returnMultiplier()
     {
-    return (int)(getSize()*offset/(SQ3/2));
+    return getSize()/(SQ3/2);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
