commit b2a92941806635a1c8a02e5ffd5cd1b703a397bd
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Jul 15 23:33:23 2021 +0200

    Again abandon RubikControl (after bumping into hard-to-solve issues)

diff --git a/src/main/java/org/distorted/control/RubikControlRotate.java b/src/main/java/org/distorted/control/RubikControlRotate.java
index a7357fc5..9638439c 100644
--- a/src/main/java/org/distorted/control/RubikControlRotate.java
+++ b/src/main/java/org/distorted/control/RubikControlRotate.java
@@ -19,22 +19,33 @@
 
 package org.distorted.control;
 
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
 import org.distorted.helpers.QuatHelper;
+import org.distorted.library.effect.MatrixEffectQuaternion;
 import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedNode;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshQuad;
+import org.distorted.library.message.EffectListener;
 import org.distorted.library.type.Dynamic;
 import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Dynamic4D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
+import org.distorted.main.R;
+import org.distorted.main.RubikActivity;
 import org.distorted.objects.TwistyObject;
 
+import java.io.IOException;
+import java.io.InputStream;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class RubikControlRotate
+class RubikControlRotate implements EffectListener
   {
   private static final int NUM_SCREEN = 0;
   private static final int NUM_OBJECT = 1;
@@ -44,19 +55,37 @@ class RubikControlRotate
   private final RubikControl mControl;
   private DistortedEffects[] mScreenEffects, mObjectEffects;
   private DistortedNode[] mScreenNodes, mObjectNodes;
-  private long mScreenEffectID, mObjectEffectID;
+  private long mScreenEffectID, mObjectEffectID, mCubeEffectID;
   private Static4D mObjRotQuat;
 
-  private Dynamic3D mDynamic;
+  private Dynamic3D mDynamic3;
+  private Dynamic4D mDynamic4;
   private MatrixEffectScale mScale;
+  private MatrixEffectQuaternion mQuaternion;
   private MeshQuad mScreenQuad, mObjectQuad;
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private Bitmap openBitmap(RubikActivity act, int resource)
+     {
+     try( InputStream is = act.getResources().openRawResource(resource) )
+       {
+       return BitmapFactory.decodeStream(is);
+       }
+     catch( IOException e )
+       {
+       // ignore
+       }
+
+     return null;
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private void computeInitQuat()
     {
-    double alphaZ = -Math.PI* 0.1250f;
-    double alphaY = -Math.PI* 0.0625f;
+    double alphaZ = 0;//-Math.PI* 0.1250f;
+    double alphaY = 0;//-Math.PI* 0.0625f;
 
     alphaY /= 2;
     alphaZ /= 2;
@@ -107,31 +136,54 @@ class RubikControlRotate
       quat = computeQuat(axis[a],objCurrQuat,axX,axY,axZ);
       cos = quat.get3();
 
+android.util.Log.e("D", "axis="+a+" "+quat.get0()+" "+quat.get1()+" "+quat.get2()+" "+quat.get3() );
+
       if (cos > maxCos)
         {
         maxCos = cos;
         chosen = a;
-        mObjRotQuat = quat;
+        if( mObjRotQuat==null ) mObjRotQuat = new Static4D(quat);
+        else mObjRotQuat.set(quat);
         }
       }
 
     android.util.Log.e("D", "axis chosen: "+chosen);
+
+
+android.util.Log.e("D", mObjRotQuat.get0()+" "+mObjRotQuat.get1()+" "+mObjRotQuat.get2()+" "+mObjRotQuat.get3() );
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private void setScreenEffectsStage1()
     {
-    mDynamic.resetToBeginning();
+    mDynamic3.resetToBeginning();
     mScale.notifyWhenFinished(mControl);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
+// the whole cube rotates so that its axis is alignled according to the Euler angles defined in
+// computeInitQuat()
 
   private void setObjectEffectsStage1()
     {
-    mDynamic.resetToBeginning();
-    mScale.notifyWhenFinished(mControl);
+    TwistyObject obj = mControl.getObject();
+    obj.apply(mQuaternion,0);
+    mDynamic4.resetToBeginning();
+    mQuaternion.notifyWhenFinished(this);
+
+
+Static4D d = mDynamic4.getPoint(1);
+
+android.util.Log.e("D", "set: "+d.get0()+" "+d.get1()+" "+d.get2()+" "+d.get3() );
+
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setObjectEffectsStage2()
+    {
+
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -147,13 +199,13 @@ class RubikControlRotate
     Static3D scaleStart= new Static3D(1,1,1);
     Static3D scaleEnd  = new Static3D(wid,wid,wid);
 
-    mDynamic = new Dynamic3D(10000,0.5f);
-    mDynamic.add(scaleStart);
-    mDynamic.add(scaleEnd  );
-    mDynamic.add(scaleStart);
-    mDynamic.setMode(Dynamic.MODE_PATH);
+    mDynamic3 = new Dynamic3D(10000,0.5f);
+    mDynamic3.add(scaleStart);
+    mDynamic3.add(scaleEnd  );
+    mDynamic3.add(scaleStart);
+    mDynamic3.setMode(Dynamic.MODE_PATH);
 
-    mScale = new MatrixEffectScale(mDynamic);
+    mScale = new MatrixEffectScale(mDynamic3);
     mScreenEffectID = mScale.getID();
     mScreenEffects[0].apply(mScale);
     }
@@ -165,21 +217,39 @@ class RubikControlRotate
     mObjectEffects   = new DistortedEffects[NUM_OBJECT];
     mObjectEffects[0]= new DistortedEffects();
 
-    DistortedScreen screen = mControl.getScreen();
-    int wid = screen.getWidth();
+    mDynamic4 = new Dynamic4D(5000,0.5f);
+    mDynamic4.add(new Static4D(0,0,0,1));
+    mDynamic4.add(mObjRotQuat);
+    mDynamic4.add(mObjRotQuat);
+    mDynamic4.add(mObjRotQuat);
+    mDynamic4.setMode(Dynamic.MODE_PATH);
 
-    Static3D scaleStart= new Static3D(1,1,1);
-    Static3D scaleEnd  = new Static3D(wid,wid,wid);
+android.util.Log.e("D", "create: "+mObjRotQuat.get0()+" "+mObjRotQuat.get1()+" "+mObjRotQuat.get2()+" "+mObjRotQuat.get3() );
+
+TwistyObject obj = mControl.getObject();
+Static3D ax = obj.getRotationAxis()[0];
+Static4D axis = new Static4D(ax.get0(), ax.get1(), ax.get2(), 0);
+
+Static4D v1 = QuatHelper.rotateVectorByQuat( new Static4D(1,0,0,0), INIT_QUAT);
+Static4D v2 = QuatHelper.rotateVectorByQuat( axis                 , mObjRotQuat);
 
-    mDynamic = new Dynamic3D(10000,0.5f);
-    mDynamic.add(scaleStart);
-    mDynamic.add(scaleEnd  );
-    mDynamic.add(scaleStart);
-    mDynamic.setMode(Dynamic.MODE_PATH);
+android.util.Log.e("D", "v1: "+v1.get0()+" "+v1.get1()+" "+v1.get2()+" "+v1.get3());
+android.util.Log.e("D", "v2: "+v2.get0()+" "+v2.get1()+" "+v2.get2()+" "+v2.get3());
+android.util.Log.e("D", "ax: "+ax.get0()+" "+ax.get1()+" "+ax.get2());
 
-    mScale = new MatrixEffectScale(mDynamic);
-    mObjectEffectID = mScale.getID();
-    mObjectEffects[0].apply(mScale);
+
+    Static3D center = new Static3D(0,0,0);
+    mQuaternion = new MatrixEffectQuaternion(mDynamic4, center);
+    mCubeEffectID = mQuaternion.getID();
+
+    DistortedScreen screen = mControl.getScreen();
+    int wid = screen.getWidth();
+    Static3D scaleFactor = new Static3D(wid,wid*0.1f,10);
+    MatrixEffectScale scale = new MatrixEffectScale(scaleFactor);
+    MatrixEffectQuaternion quat = new MatrixEffectQuaternion(INIT_QUAT,center);
+
+    mObjectEffects[0].apply(scale);
+    mObjectEffects[0].apply(quat);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -207,33 +277,26 @@ class RubikControlRotate
       mObjectQuad = new MeshQuad();
       }
 
-    if( INIT_QUAT==null ) computeInitQuat();
-
-    computeRotQuat();
-
-    DistortedTexture texture = new DistortedTexture();
-    texture.setColorARGB(0xff00ff00);
-    mObjectNodes[0] = new DistortedNode(texture, mObjectEffects[0], mObjectQuad);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// ??
+    RubikActivity act = mControl.getActivity();
 
-  long getEffectID()
-    {
-    return mObjectEffectID;
-    }
+    if( act!=null )
+      {
+      Bitmap bmpArrow = openBitmap(act, R.drawable.ui_axis_arrow);
+      DistortedTexture textureArrow = new DistortedTexture();
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
+      if( bmpArrow!=null ) textureArrow.setTexture(bmpArrow);
 
-  long getScreenEffectID()
-    {
-    return mScreenEffectID;
+      mObjectNodes[0] = new DistortedNode(textureArrow, mObjectEffects[0], mObjectQuad);
+      }
+    else
+      {
+      android.util.Log.e("D", "Activity NULL!!");
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  long getObjectEffectID()
+  long getEffectID()
     {
     return mObjectEffectID;
     }
@@ -265,6 +328,8 @@ class RubikControlRotate
     {
     if( NUM_OBJECT>0 )
       {
+      if( INIT_QUAT==null ) computeInitQuat();
+      computeRotQuat();
       if( mObjectEffects==null ) createObjectEffects();
       createObjectNodes();
       setObjectEffectsStage1();
@@ -286,4 +351,20 @@ class RubikControlRotate
     {
     mControl = control;
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  public void effectFinished(long effectID)
+    {
+    if( effectID==mCubeEffectID)
+      {
+      setObjectEffectsStage2();
+
+      TwistyObject obj = mControl.getObject();
+      obj.remove(mCubeEffectID);
+      mObjectEffectID = -1;
+      mControl.effectFinished(mObjectEffectID);
+      }
+    }
   }
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index d26a0558..6ef77d4d 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -57,7 +57,7 @@ public class RubikScreenPlay extends RubikScreenBase
 
   private static final int[] BUTTON_LABELS = { R.string.scores,
                                                R.string.patterns,
-                                               R.string.control,
+                                            //   R.string.control,
                                                R.string.solver,
                                                R.string.tutorials,
                                                R.string.about };
@@ -377,20 +377,22 @@ public class RubikScreenPlay extends RubikScreenBase
               pDiag.setArguments(pBundle);
               pDiag.show( act.getSupportFragmentManager(), RubikDialogPattern.getDialogTag() );
               break;
+/*
       case 2: RubikControl control = RubikControl.getInstance();
               //control.animateAll(act);
               control.animateRotate(act);
               break;
-      case 3: ScreenList.switchScreen(act, ScreenList.SVER);
+ */
+      case 2: ScreenList.switchScreen(act, ScreenList.SVER);
               break;
-      case 4: RubikDialogTutorial tDiag = new RubikDialogTutorial();
+      case 3: RubikDialogTutorial tDiag = new RubikDialogTutorial();
               Bundle tBundle = new Bundle();
               int tOrd = getTutorialOrdinal();
               tBundle.putInt("tab", tOrd );
               tDiag.setArguments(tBundle);
               tDiag.show( act.getSupportFragmentManager(), RubikDialogTutorial.getDialogTag() );
               break;
-      case 5: RubikDialogAbout aDiag = new RubikDialogAbout();
+      case 4: RubikDialogAbout aDiag = new RubikDialogAbout();
               aDiag.show(act.getSupportFragmentManager(), null);
               break;
       }
