commit a44724371f852a7992325b42d0c21f0f9be1bd73
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Jun 19 22:38:23 2020 +0100

    Progress with dragging.

diff --git a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectRound.java b/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectRound.java
index 416008ab..5328d4e6 100644
--- a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectRound.java
+++ b/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectRound.java
@@ -36,7 +36,7 @@ class ObjectChangeEffectRound extends ObjectChangeEffect
     {
     float X = NODE_FBO_SIZE /3;
 
-    mCubeEffectPosition[0] = new int[] {3,4};
+    mCubeEffectPosition[0] = new int[] {2,3};
     mCubeEffects[0]        = new Effect[mCubeEffectPosition[0].length];
 
     Dynamic3D d0 = new Dynamic3D(duration/2, 0.5f);
@@ -60,7 +60,7 @@ class ObjectChangeEffectRound extends ObjectChangeEffect
     {
     float X = NODE_FBO_SIZE /3;
 
-    mCubeEffectPosition[1] = new int[] {3,4};
+    mCubeEffectPosition[1] = new int[] {2,3};
     mCubeEffects[1]        = new Effect[mCubeEffectPosition[1].length];
 
     Dynamic3D d0 = new Dynamic3D(duration/2, 0.5f);
diff --git a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectScale.java b/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectScale.java
index f2a5d89e..e5b97a8b 100644
--- a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectScale.java
+++ b/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectScale.java
@@ -30,7 +30,7 @@ class ObjectChangeEffectScale extends ObjectChangeEffect
   {
   public int createEffectsPhase0(int duration)
     {
-    mCubeEffectPosition[0] = new int[] {3};
+    mCubeEffectPosition[0] = new int[] {2};
     mCubeEffects[0]        = new Effect[mCubeEffectPosition[0].length];
 
     Dynamic3D d0 = new Dynamic3D(duration/2, 0.5f);
@@ -45,7 +45,7 @@ class ObjectChangeEffectScale extends ObjectChangeEffect
 
   public int createEffectsPhase1(int duration)
     {
-    mCubeEffectPosition[1] = new int[] {3};
+    mCubeEffectPosition[1] = new int[] {2};
     mCubeEffects[1]        = new Effect[mCubeEffectPosition[1].length];
 
     Dynamic3D d0 = new Dynamic3D(duration/2, 0.5f);
diff --git a/src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java b/src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java
index 13ed99d5..6b5138c7 100644
--- a/src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java
+++ b/src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java
@@ -58,7 +58,7 @@ public class ScrambleEffectRotations extends ScrambleEffect
     {
     mCubeEffectNumber   = 2;
     mNodeEffectNumber   = 0;
-    mCubeEffectPosition = new int[] {3,4};
+    mCubeEffectPosition = new int[] {2,3};
     mCubeEffects        = new Effect[mCubeEffectPosition.length];
 
     mRnd.setSeed(System.currentTimeMillis());
diff --git a/src/main/java/org/distorted/main/RubikSurfaceView.java b/src/main/java/org/distorted/main/RubikSurfaceView.java
index 5ced07af..931f4a2c 100644
--- a/src/main/java/org/distorted/main/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/main/RubikSurfaceView.java
@@ -42,6 +42,7 @@ 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;
@@ -70,6 +71,7 @@ public class RubikSurfaceView extends GLSurfaceView
     private boolean mDragging, mBeginningRotation, mContinuingRotation;
     private int mScreenWidth, mScreenHeight, mScreenMin;
 
+    private int mPtrID1, mPtrID2;
     private int mNumFingersDown;
     private float mX, mY;
     private float mStartRotX, mStartRotY;
@@ -457,10 +459,13 @@ public class RubikSurfaceView extends GLSurfaceView
 
     private void actionMove(MotionEvent event)
       {
-      float x = (event.getX() - mScreenWidth*0.5f)/mScreenMin;
-      float y = (mScreenHeight*0.5f -event.getY())/mScreenMin;
+      int pointer = event.findPointerIndex(mPtrID1 != INVALID_POINTER_ID ? mPtrID1:mPtrID2);
 
-      //android.util.Log.e("view", "num fingers: "+mNumFingersDown+" x="+event.getX()+" y="+event.getY());
+      float pX = event.getX(pointer);
+      float pY = event.getY(pointer);
+
+      float x = (pX - mScreenWidth*0.5f)/mScreenMin;
+      float y = (mScreenHeight*0.5f -pY)/mScreenMin;
 
       if( mBeginningRotation )
         {
@@ -488,13 +493,11 @@ public class RubikSurfaceView extends GLSurfaceView
     private void actionDown(MotionEvent event)
       {
       mNumFingersDown++;
+      mPtrID1 = event.getPointerId(0);
 
-      int index = event.getActionIndex();
       float x = event.getX();
       float y = event.getY();
 
-      android.util.Log.e("view", "down1 num fingers: "+mNumFingersDown+" index="+index+" x="+x+" y="+y);
-
       mX = (x - mScreenWidth*0.5f)/mScreenMin;
       mY = (mScreenHeight*0.5f -y)/mScreenMin;
 
@@ -507,11 +510,8 @@ public class RubikSurfaceView extends GLSurfaceView
       {
       mNumFingersDown--;
 
-      int index = event.getActionIndex();
-      float x = event.getX();
-      float y = event.getY();
-
-      android.util.Log.e("view", "up1 num fingers: "+mNumFingersDown+" index="+index+" x="+x+" y="+y);
+      mPtrID1 = INVALID_POINTER_ID;
+      mPtrID2 = INVALID_POINTER_ID;
 
       if( mContinuingRotation )
         {
@@ -530,6 +530,31 @@ public class RubikSurfaceView extends GLSurfaceView
       {
       mNumFingersDown++;
 
+      int index = event.getActionIndex();
+
+      if( mPtrID1==INVALID_POINTER_ID )
+        {
+        mPtrID1 = event.getPointerId(index);
+        float x = event.getX(index);
+        float y = event.getY(index);
+
+        mX = (x - mScreenWidth*0.5f)/mScreenMin;
+        mY = (mScreenHeight*0.5f -y)/mScreenMin;
+        }
+      else if( mPtrID2==INVALID_POINTER_ID )
+        {
+        mPtrID2 = event.getPointerId(index);
+
+        if( mBeginningRotation || mContinuingRotation )
+          {
+          float x = event.getX();
+          float y = event.getY();
+
+          mX = (x - mScreenWidth*0.5f)/mScreenMin;
+          mY = (mScreenHeight*0.5f -y)/mScreenMin;
+          }
+        }
+
       if( mBeginningRotation )
         {
         mContinuingRotation = false;
@@ -540,12 +565,6 @@ public class RubikSurfaceView extends GLSurfaceView
         {
         finishRotation();
         }
-
-      int index = event.getActionIndex();
-      float x = event.getX();
-      float y = event.getY();
-
-      android.util.Log.e("view", "down2 num fingers: "+mNumFingersDown+" index="+index+" x="+x+" y="+y);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -555,10 +574,21 @@ public class RubikSurfaceView extends GLSurfaceView
       mNumFingersDown--;
 
       int index = event.getActionIndex();
-      float x = event.getX();
-      float y = event.getY();
 
-      android.util.Log.e("view", "up2 num fingers: "+mNumFingersDown+" index="+index+" x="+x+" y="+y);
+      if( index==0 )
+        {
+        mPtrID1 = INVALID_POINTER_ID;
+        int pointer = event.findPointerIndex(mPtrID2);
+        float x1 = event.getX(pointer);
+        float y1 = event.getY(pointer);
+
+        mX = (x1 - mScreenWidth*0.5f)/mScreenMin;
+        mY = (mScreenHeight*0.5f -y1)/mScreenMin;
+        }
+      else
+        {
+        mPtrID2 = INVALID_POINTER_ID;
+        }
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -580,6 +610,9 @@ public class RubikSurfaceView extends GLSurfaceView
         mFirstIndex =0;
         mLastIndex  =0;
 
+        mPtrID1 = INVALID_POINTER_ID;
+        mPtrID2 = INVALID_POINTER_ID;
+
         mNumFingersDown = 0;
 
         mRenderer  = new RubikRenderer(this);
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index b83d6d89..4fa4629e 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -622,7 +622,7 @@ public abstract class RubikObject extends DistortedNode
 
     if( tmp!=0 ) return NEAREST*tmp;
 
-    return speed> 1.5f ? NEAREST*(angle>0 ? 1:-1) : 0;
+    return speed> 1.3f ? NEAREST*(angle>0 ? 1:-1) : 0;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
