commit 9224ffd2357bbd4c11e6c3e85878991b721ea67c
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Mar 30 13:29:03 2020 +0100

    extend the RubikObject API to make it possible to add rotations of multiple rows simultaneously (all along the same axis of course!)

diff --git a/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java b/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
index a7d3e2cd..26c6a562 100644
--- a/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
+++ b/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
@@ -141,7 +141,7 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
         mLastVector = (newVector>=mLastVector ? newVector+1 : newVector);
         }
 
-      int row  = mRnd.nextInt(mObject.getSize());
+      int rowBitmap  = (1<<mRnd.nextInt(mObject.getSize()));
       int angle= randomizeAngle();
       int absAngle = (angle<0 ? -angle : angle);
       long durationMillis =  absAngle*mDurationSingleTurn;
@@ -154,7 +154,7 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
         android.util.Log.e("effect", "ERROR: "+mNumDoubleScramblesLeft);
         }
 
-      mCurrentBaseEffectID = mObject.addNewRotation(mLastVector, row, angle*(360/mBasicAngle), durationMillis, this );
+      mCurrentBaseEffectID = mObject.addNewRotation(mLastVector, rowBitmap, angle*(360/mBasicAngle), durationMillis, this );
       }
     else
       {
diff --git a/src/main/java/org/distorted/object/Cubit.java b/src/main/java/org/distorted/object/Cubit.java
index 55198f93..79ab9493 100644
--- a/src/main/java/org/distorted/object/Cubit.java
+++ b/src/main/java/org/distorted/object/Cubit.java
@@ -305,8 +305,6 @@ class Cubit
                  }
                return false;
       default: return false;  // edge or corner
-
-
       }
     }
 
diff --git a/src/main/java/org/distorted/object/RubikObject.java b/src/main/java/org/distorted/object/RubikObject.java
index f372afdb..c861052b 100644
--- a/src/main/java/org/distorted/object/RubikObject.java
+++ b/src/main/java/org/distorted/object/RubikObject.java
@@ -53,7 +53,7 @@ public abstract class RubikObject extends DistortedNode
 
   private static final int POST_ROTATION_MILLISEC = 500;
   private final int NUM_CUBITS;
-  private int mRotRow;
+  private int mRotRowBitmap;
   private int mRotAxis;
   private Static3D[] mOrigPos;
   private Static3D mScale, mNodeScale;
@@ -190,9 +190,10 @@ public abstract class RubikObject extends DistortedNode
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private boolean belongsToRotation( int cubit, int axis, int row)
+  private boolean belongsToRotation( int cubit, int axis, int rowBitmap)
     {
-    return ((int)(mCubits[cubit].mRotationRow[axis]+0.5f))==row;
+    int cubitRow = (int)(mCubits[cubit].mRotationRow[axis]+0.5f);
+    return ((1<<cubitRow)&rowBitmap)!=0;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -221,6 +222,9 @@ public abstract class RubikObject extends DistortedNode
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // TODO
+// rotV : 0 --> VECTX, 1--> VECTY, 2 --> VECTZ
+// rotRC: 01010 --> move the 2nd and 4th layer
+// rotA : counterclockwise by rotA*90 degrees
 
 	private boolean scheduleMultiRotation(int rotV, int rotRC, int rotA)
 	  {
@@ -433,7 +437,7 @@ public abstract class RubikObject extends DistortedNode
 
     for(int i=0; i<NUM_CUBITS; i++)
       {
-      if( belongsToRotation(i,mRotAxis,mRotRow) )
+      if( belongsToRotation(i,mRotAxis,mRotRowBitmap) )
         {
         if( first )
           {
@@ -506,13 +510,13 @@ public abstract class RubikObject extends DistortedNode
       return;
       }
 
-    mRotAxis = axis;
-    mRotRow  = row;
+    mRotAxis       = axis;
+    mRotRowBitmap  = (1<<row);
 
     mRotationAngleStatic.set0(0.0f);
 
     for(int i=0; i<NUM_CUBITS; i++)
-      if( belongsToRotation(i,mRotAxis,mRotRow) )
+      if( belongsToRotation(i,mRotAxis,mRotRowBitmap) )
         {
         mCubits[i].beginNewRotation(axis);
         }
@@ -520,18 +524,18 @@ public abstract class RubikObject extends DistortedNode
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public long addNewRotation( int axis, int row, int angle, long durationMillis, EffectListener listener )
+  public long addNewRotation( int axis, int rowBitmap, int angle, long durationMillis, EffectListener listener )
      {
      long effectID=0;
      boolean first = true;
 
-     mRotAxis = axis;
-     mRotRow  = row;
+     mRotAxis       = axis;
+     mRotRowBitmap  = rowBitmap;
 
      mRotationAngleStatic.set0(0.0f);
 
      for(int i=0; i<NUM_CUBITS; i++)
-       if( belongsToRotation(i,mRotAxis,mRotRow) )
+       if( belongsToRotation(i,mRotAxis,mRotRowBitmap) )
          {
          mCubits[i].addNewRotation(axis,durationMillis,angle);
 
@@ -553,7 +557,7 @@ public abstract class RubikObject extends DistortedNode
      Static4D quat = null;
 
      for(int i=0; i<NUM_CUBITS; i++)
-       if( belongsToRotation(i,mRotAxis,mRotRow) )
+       if( belongsToRotation(i,mRotAxis,mRotRowBitmap) )
          {
          if( first )
            {
@@ -575,9 +579,9 @@ public abstract class RubikObject extends DistortedNode
 		int a2=move.charAt(2)-'0';
 		int a3=move.charAt(3)-'0';
 
-    int rotVector = (10*a1+a2)/32; // 0 --> VECTX, 1--> VECTY, 2 --> VECTZ
-    int rotBitmap = (10*a1+a2)%32; // 01010 --> move the 2nd and 4th layer
-    int rotAngle  = 2-a3;          // counterclockwise by rotAngle*90 degrees
+    int rotVector = (10*a1+a2)/32;
+    int rotBitmap = (10*a1+a2)%32;
+    int rotAngle  = 2-a3;
 
 		return scheduleMultiRotation(rotVector, rotBitmap, rotAngle);
     }
