commit 0b7e1b05cbadcc0400391328cfc080d845082b30
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Jun 19 13:35:45 2020 +0100

    Progress with improvements for cube manipulation.

diff --git a/src/main/java/org/distorted/main/RubikSurfaceView.java b/src/main/java/org/distorted/main/RubikSurfaceView.java
index 4e808346..85f253d7 100644
--- a/src/main/java/org/distorted/main/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/main/RubikSurfaceView.java
@@ -42,7 +42,6 @@ import org.distorted.states.RubikStateSolving;
 public class RubikSurfaceView extends GLSurfaceView
 {
     private static final int NUM_SPEED_PROBES = 10;
-    private static final int INVALID_POINTER_ID = -1;
 
     public static final int MODE_ROTATE  = 0;
     public static final int MODE_DRAG    = 1;
@@ -73,8 +72,8 @@ public class RubikSurfaceView extends GLSurfaceView
     private boolean mDragging, mBeginningRotation, mContinuingRotation;
     private int mScreenWidth, mScreenHeight, mScreenMin;
 
-    private int mPtrID1, mPtrID2;
-    private float mX, mY, mBegX1, mBegY1, mBegX2, mBegY2;
+    private int mNumFingersDown;
+    private float mX, mY;
     private float mStartRotX, mStartRotY;
     private float mAxisX, mAxisY;
     private float mRotationFactor;
@@ -211,22 +210,6 @@ public class RubikSurfaceView extends GLSurfaceView
       mAxisY /= len;
       }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    private float continueRotation(float dx, float dy)
-      {
-      float alpha = dx*mAxisX + dy*mAxisY;
-      float x = dx - alpha*mAxisX;
-      float y = dy - alpha*mAxisY;
-
-      float len = (float)Math.sqrt(x*x + y*y);
-
-      // we have the length of 1D vector 'angle', now the direction:
-      float tmp = mAxisY==0 ? -mAxisX*y : mAxisY*x;
-
-      return (tmp>0 ? 1:-1)*len*mRotationFactor;
-      }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // return quat1*quat2
 
@@ -395,11 +378,8 @@ public class RubikSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void dragging(float x, float y)
+    private void drag(float x, float y)
       {
-      mTempCurrent.set(quatFromDrag(mX-x,y-mY));
-      mPreRender.setQuatCurrentOnNextRender();
-
       if( retFingerDragDistanceInInches(mX,mY,x,y) > DIRECTION_SENSITIVITY )
         {
         mX = x;
@@ -409,22 +389,55 @@ public class RubikSurfaceView extends GLSurfaceView
         mPreRender.setQuatCurrentOnNextRender();
         mPreRender.setQuatAccumulatedOnNextRender();
         }
+
+      mTempCurrent.set(quatFromDrag(mX-x,y-mY));
+      mPreRender.setQuatCurrentOnNextRender();
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private void finishRotation()
+      {
+      computeCurrentSpeedInInchesPerSecond();
+      int angle = mPreRender.getObject().computeNearestAngle(mCurrentAngle, mCurrRotSpeed);
+      mPreRender.finishRotation(angle);
+
+      if( RubikState.getCurrentState()==RubikState.SOLV && angle!=0 )
+        {
+        RubikStateSolving solving = (RubikStateSolving)RubikState.SOLV.getStateClass();
+        solving.addMove(mCurrentAxis, mCurrentRow, angle);
+        }
+
+      mContinuingRotation = false;
+      mBeginningRotation  = false;
+      mDragging           = true;
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void continuingRotation(float x, float y)
+    private void continueRotation(float x, float y)
       {
-      float angle = continueRotation(x-mStartRotX,y-mStartRotY);
+      float dx = x-mStartRotX;
+      float dy = y-mStartRotY;
+      float alpha = dx*mAxisX + dy*mAxisY;
+      float x2 = dx - alpha*mAxisX;
+      float y2 = dy - alpha*mAxisY;
+
+      float len = (float)Math.sqrt(x2*x2 + y2*y2);
+
+      // we have the length of 1D vector 'angle', now the direction:
+      float tmp = mAxisY==0 ? -mAxisX*y2 : mAxisY*x2;
+
+      float angle = (tmp>0 ? 1:-1)*len*mRotationFactor;
       mCurrentAngle = SWIPING_SENSITIVITY*angle;
       mPreRender.getObject().continueRotation(mCurrentAngle);
 
-      addSpeedProbe(x,y);
+      addSpeedProbe(x2,y2);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void beginningRotation(float x, float y)
+    private void beginRotation(float x, float y)
       {
       mStartRotX = x;
       mStartRotY = y;
@@ -470,46 +483,31 @@ public class RubikSurfaceView extends GLSurfaceView
 
     private void actionMove(MotionEvent event)
       {
-      if( mPtrID2 == INVALID_POINTER_ID )
-        {
-        float x = (event.getX() - mScreenWidth*0.5f)/mScreenMin;
-        float y = (mScreenHeight*0.5f -event.getY())/mScreenMin;
+      float x = (event.getX() - mScreenWidth*0.5f)/mScreenMin;
+      float y = (mScreenHeight*0.5f -event.getY())/mScreenMin;
 
-        if( mBeginningRotation )
-          {
-          if( retFingerDragDistanceInInches(mX,mY,x,y) > ROTATION_SENSITIVITY )
-            {
-            beginningRotation(x,y);
-            }
-          }
-        else if( mContinuingRotation )
-          {
-          continuingRotation(x,y);
-          }
-        else if( mDragging )
-          {
-          dragging(x,y);
-          }
-        else
+
+      //android.util.Log.e("view", "num fingers: "+mNumFingersDown+" x="+event.getX()+" y="+event.getY());
+
+
+      if( mBeginningRotation )
+        {
+        if( retFingerDragDistanceInInches(mX,mY,x,y) > ROTATION_SENSITIVITY )
           {
-          setUpDragOrRotate(false,x,y);
+          beginRotation(x,y);
           }
         }
+      else if( mContinuingRotation )
+        {
+        continueRotation(x,y);
+        }
+      else if( mDragging )
+        {
+        drag(x,y);
+        }
       else
         {
-        int index1 = event.findPointerIndex(mPtrID1);
-        int index2 = event.findPointerIndex(mPtrID2);
-
-        float nX1 = event.getX(index1);
-        float nY1 = event.getY(index1);
-        float nX2 = event.getX(index2);
-        float nY2 = event.getY(index2);
-
-        float angle1 = (float) Math.atan2(mBegY1-mBegY2, mBegX1-mBegX2);
-        float angle2 = (float) Math.atan2( nY1-nY2     , nX1-nX2      );
-
-        mTempCurrent.set(quatFromAngle(angle1-angle2));
-        mPreRender.setQuatCurrentOnNextRender();
+        setUpDragOrRotate(false,x,y);
         }
       }
 
@@ -517,7 +515,9 @@ public class RubikSurfaceView extends GLSurfaceView
 
     private void actionDown(MotionEvent event)
       {
-      mPtrID1 = event.getPointerId(0);
+      mNumFingersDown++;
+
+      //android.util.Log.e("view", "down1 num fingers: "+mNumFingersDown+" x="+event.getX()+" y="+event.getY());
 
       mX = (event.getX() - mScreenWidth*0.5f)/mScreenMin;
       mY = (mScreenHeight*0.5f -event.getY())/mScreenMin;
@@ -527,9 +527,11 @@ public class RubikSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void actionUp()
+    private void actionUp(MotionEvent event)
       {
-      mPtrID1 = INVALID_POINTER_ID;
+      mNumFingersDown--;
+
+      //android.util.Log.e("view", "up1 num fingers: "+mNumFingersDown+" x="+event.getX()+" y="+event.getY());
 
       if( mDragging )
         {
@@ -541,15 +543,7 @@ public class RubikSurfaceView extends GLSurfaceView
 
       if( mContinuingRotation )
         {
-        computeCurrentSpeedInInchesPerSecond();
-        int angle = mPreRender.getObject().computeNearestAngle(mCurrentAngle, mCurrRotSpeed);
-        mPreRender.finishRotation(angle);
-
-        if( RubikState.getCurrentState()==RubikState.SOLV && angle!=0 )
-          {
-          RubikStateSolving solving = (RubikStateSolving)RubikState.SOLV.getStateClass();
-          solving.addMove(mCurrentAxis, mCurrentRow, angle);
-          }
+        finishRotation();
         }
 
       if( mLastCubitColor>=0 )
@@ -562,25 +556,29 @@ public class RubikSurfaceView extends GLSurfaceView
 
     private void actionDown2(MotionEvent event)
       {
-      mPtrID2 = event.getPointerId(event.getActionIndex());
-
-      int index1 = event.findPointerIndex(mPtrID1);
-      mBegX1 = event.getX(index1);
-      mBegY1 = event.getY(index1);
+      mNumFingersDown++;
 
-      mX = (mBegX1 - mScreenWidth*0.5f)/mScreenMin;
-      mY = (mScreenHeight*0.5f -mBegY1)/mScreenMin;
+      if( mBeginningRotation )
+        {
+        mContinuingRotation = false;
+        mBeginningRotation  = false;
+        mDragging           = true;
+        }
+      else if( mContinuingRotation )
+        {
+        finishRotation();
+        }
 
-      int index2 = event.findPointerIndex(mPtrID2);
-      mBegX2 = event.getX(index2);
-      mBegY2 = event.getY(index2);
+      //android.util.Log.e("view", "down2 num fingers: "+mNumFingersDown+" x="+event.getX()+" y="+event.getY());
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void actionUp2()
+    private void actionUp2(MotionEvent event)
       {
-      mPtrID2 = INVALID_POINTER_ID;
+      mNumFingersDown--;
+
+      //android.util.Log.e("view", "up2 num fingers: "+mNumFingersDown+" x="+event.getX()+" y="+event.getY());
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -602,8 +600,7 @@ public class RubikSurfaceView extends GLSurfaceView
         mFirstIndex =0;
         mLastIndex  =0;
 
-        mPtrID1 = INVALID_POINTER_ID;
-        mPtrID2 = INVALID_POINTER_ID;
+        mNumFingersDown = 0;
 
         mRenderer  = new RubikRenderer(this);
         mPreRender = new RubikPreRender(this);
@@ -636,9 +633,9 @@ public class RubikSurfaceView extends GLSurfaceView
          {
          case MotionEvent.ACTION_DOWN        : actionDown(event) ; break;
          case MotionEvent.ACTION_MOVE        : actionMove(event) ; break;
-         case MotionEvent.ACTION_UP          : actionUp()        ; break;
+         case MotionEvent.ACTION_UP          : actionUp(event)   ; break;
          case MotionEvent.ACTION_POINTER_DOWN: actionDown2(event); break;
-         case MotionEvent.ACTION_POINTER_UP  : actionUp2()       ; break;
+         case MotionEvent.ACTION_POINTER_UP  : actionUp2(event)  ; break;
          }
 
       return true;
