commit d12bb11beee8b75d9aa940f26f3b8a52553abe71
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Mar 31 17:37:27 2020 +0100

    Bugfixes - do more stuff 'post render'

diff --git a/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java b/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
index d34ef180..db82e8eb 100644
--- a/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
+++ b/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
@@ -72,6 +72,7 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
   private RubikObject mObject;
   private int mNumAxis;
   private int mBasicAngle;
+  private int mSize;
 
   Effect[] mNodeEffects;
   int[] mNodeEffectPosition;
@@ -141,7 +142,7 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
         mLastVector = (newVector>=mLastVector ? newVector+1 : newVector);
         }
 
-      int rowBitmap  = (1<<mRnd.nextInt(mObject.getSize()));
+      int rowBitmap  = (1<<mRnd.nextInt(mSize));
       int angle= randomizeAngle();
       int absAngle = (angle<0 ? -angle : angle);
       long durationMillis =  absAngle*mDurationSingleTurn;
@@ -244,7 +245,6 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
 
   public void onActionFinished(final long effectID)
     {
-    mObject.removeRotationNow();
     addNewScramble();
     }
 
@@ -311,6 +311,7 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
 
     mNumAxis    = mObject.getRotationAxis().length;
     mBasicAngle = mObject.getBasicAngle();
+    mSize       = mObject.getSize();
 
     int numScrambles = post.getNumScrambles();
     int dura = (int)(duration*Math.pow(numScrambles,0.6f));
diff --git a/src/main/java/org/distorted/magic/RubikPostRender.java b/src/main/java/org/distorted/magic/RubikPostRender.java
index 065ac1fa..7d2d03fa 100644
--- a/src/main/java/org/distorted/magic/RubikPostRender.java
+++ b/src/main/java/org/distorted/magic/RubikPostRender.java
@@ -42,7 +42,8 @@ public class RubikPostRender implements EffectListener
     }
 
   private RubikSurfaceView mView;
-  private boolean mFinishRotation, mRemoveRotation, mAddRotation, mSetQuatCurrent, mSetQuatAccumulated;
+  private boolean mFinishRotation, mRemoveRotation, mRemovePatternRotation, mAddRotation,
+                  mSetQuatCurrent, mSetQuatAccumulated;
   private boolean mChangeObject, mSolveObject, mScrambleObject;
   private boolean mCanRotate, mCanDrag, mCanUI;
   private boolean mIsSolved;
@@ -60,7 +61,8 @@ public class RubikPostRender implements EffectListener
   private int mAddRotationAxis, mAddRotationRowBitmap, mAddRotationAngle;
   private long mAddRotationDuration;
   private ActionFinishedListener mAddActionListener;
-  private long mAddRotationID;
+  private long mAddRotationID, mRemoveRotationID;
+  private boolean mInitializeObject;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -68,14 +70,15 @@ public class RubikPostRender implements EffectListener
     {
     mView = view;
 
-    mFinishRotation     = false;
-    mRemoveRotation     = false;
-    mAddRotation        = false;
-    mSetQuatCurrent     = false;
-    mSetQuatAccumulated = false;
-    mChangeObject       = false;
-    mSolveObject        = false;
-    mScrambleObject     = false;
+    mFinishRotation       = false;
+    mRemoveRotation       = false;
+    mRemovePatternRotation= false;
+    mAddRotation          = false;
+    mSetQuatCurrent       = false;
+    mSetQuatAccumulated   = false;
+    mChangeObject         = false;
+    mSolveObject          = false;
+    mScrambleObject       = false;
 
     mCanRotate   = true;
     mCanDrag     = true;
@@ -182,12 +185,27 @@ public class RubikPostRender implements EffectListener
     mRemoveRotation = true;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void removePatternRotation()
+    {
+    mRemovePatternRotation = true;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void removePatternRotationNow()
+    {
+    mRemovePatternRotation=false;
+    mNewObject.removeRotationNow();
+    mAddActionListener.onActionFinished(mRemoveRotationID);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private void addRotationNow()
     {
     mAddRotation = false;
-
     mAddRotationID = mNewObject.addNewRotation( mAddRotationAxis, mAddRotationRowBitmap,
                                                 mAddRotationAngle, mAddRotationDuration, this);
     }
@@ -252,6 +270,14 @@ public class RubikPostRender implements EffectListener
     doEffectNow( BaseEffect.Type.SOLVE );
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void initializeObjectNow()
+    {
+    mInitializeObject = false;
+    mNewObject.initializeObject(mNextMoves);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private void setQuatCurrentNow()
@@ -374,14 +400,16 @@ public class RubikPostRender implements EffectListener
 
   void postRender()
     {
-    if( mSetQuatCurrent     ) setQuatCurrentNow();
-    if( mSetQuatAccumulated ) setQuatAccumulatedNow();
-    if( mFinishRotation     ) finishRotationNow();
-    if( mRemoveRotation     ) removeRotationNow();
-    if( mChangeObject       ) changeObjectNow();
-    if( mSolveObject        ) solveObjectNow();
-    if( mScrambleObject     ) scrambleObjectNow();
-    if( mAddRotation        ) addRotationNow();
+    if( mSetQuatCurrent        ) setQuatCurrentNow();
+    if( mSetQuatAccumulated    ) setQuatAccumulatedNow();
+    if( mFinishRotation        ) finishRotationNow();
+    if( mRemoveRotation        ) removeRotationNow();
+    if( mRemovePatternRotation ) removePatternRotationNow();
+    if( mChangeObject          ) changeObjectNow();
+    if( mSolveObject           ) solveObjectNow();
+    if( mScrambleObject        ) scrambleObjectNow();
+    if( mAddRotation           ) addRotationNow();
+    if( mInitializeObject      ) initializeObjectNow();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -399,6 +427,14 @@ public class RubikPostRender implements EffectListener
     mAddRotationDuration  = duration;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void initializeObject(int[][] moves)
+    {
+    mInitializeObject = true;
+    mNextMoves = moves;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public RubikObject getObject()
@@ -432,7 +468,8 @@ public class RubikPostRender implements EffectListener
     else if( effectID == mAddRotationID )
       {
       mAddRotationID = 0;
-      mAddActionListener.onActionFinished(effectID);
+      mRemoveRotationID = effectID;
+      removePatternRotation();
       }
     else
       {
diff --git a/src/main/java/org/distorted/patterns/RubikPattern.java b/src/main/java/org/distorted/patterns/RubikPattern.java
index d469af73..c702545e 100644
--- a/src/main/java/org/distorted/patterns/RubikPattern.java
+++ b/src/main/java/org/distorted/patterns/RubikPattern.java
@@ -158,9 +158,7 @@ public class RubikPattern
     private int[][] moves;
     private int curMove;
     private int numMove;
-
     private boolean mCanRotate;
-    private RubikObject mObject;
 
   /////////////////////////////////////////////////////////////
 
@@ -223,17 +221,16 @@ public class RubikPattern
       curMove++;
       RubikObject object = post.getObject();
 
-      if( curMove>numMove )
-        {
-        curMove= 0;
-        object.initializeObject(null);
-        }
-      else
+      if( mCanRotate )
         {
-        if( mCanRotate )
+        if( curMove>numMove )
+          {
+          curMove= 0;
+          post.initializeObject(null);
+          }
+        else
           {
           mCanRotate = false;
-          mObject = object;
 
           int axis     =moves[curMove-1][0];
 		      int rowBitmap=moves[curMove-1][1];
@@ -243,12 +240,11 @@ public class RubikPattern
 
           post.addRotation(this, axis, rowBitmap, angle, numRot*DURATION_MILLIS);
           }
-        else
-          {
-          android.util.Log.e("pattern", "failed to make Move!");
-
-          curMove--;
-          }
+        }
+      else
+        {
+        android.util.Log.e("pattern", "failed to make Move!");
+        curMove--;
         }
       }
 
@@ -259,17 +255,16 @@ public class RubikPattern
       curMove--;
       RubikObject object = post.getObject();
 
-      if( curMove<0 )
-        {
-        curMove=numMove;
-        object.initializeObject(moves);
-        }
-      else
+      if( mCanRotate )
         {
-        if( mCanRotate )
+        if( curMove<0 )
+          {
+          curMove=numMove;
+          post.initializeObject(moves);
+          }
+        else
           {
           mCanRotate = false;
-          mObject = object;
 
           int axis     =moves[curMove][0];
 		      int rowBitmap=moves[curMove][1];
@@ -279,11 +274,11 @@ public class RubikPattern
 
           post.addRotation(this, axis, rowBitmap, -angle, numRot*DURATION_MILLIS);
           }
-        else
-          {
-          android.util.Log.e("pattern", "failed to back Move!");
-          curMove++;
-          }
+        }
+      else
+        {
+        android.util.Log.e("pattern", "failed to back Move!");
+        curMove++;
         }
       }
 
@@ -298,7 +293,6 @@ public class RubikPattern
 
     public void onActionFinished(final long effectID)
       {
-      mObject.removeRotationNow();
       mCanRotate = true;
       }
     }
