commit 30b683224e0f45886c54976a96b811f627dc634c
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Dec 16 02:21:14 2019 +0000

    library: Fix DynamicQuat
    cube app: progress with ScrambleEffects

diff --git a/src/main/java/org/distorted/effect/ScrambleEffect.java b/src/main/java/org/distorted/effect/ScrambleEffect.java
index e46fe479..6199f4f7 100644
--- a/src/main/java/org/distorted/effect/ScrambleEffect.java
+++ b/src/main/java/org/distorted/effect/ScrambleEffect.java
@@ -221,7 +221,7 @@ public abstract class ScrambleEffect implements EffectListener
     {
     for(int i=0; i<mCubeEffectNumber[flavour]; i++)
       {
-      android.util.Log.e("scramble", "applying cube effect "+mCubeEffects[flavour][i].getName());
+      //android.util.Log.e("scramble", "applying cube effect "+mCubeEffects[flavour][i].getName());
 
       mCube.apply(mCubeEffects[flavour][i],mCubeEffectPosition[flavour][i]);
       mCubeEffects[flavour][i].notifyWhenFinished(this);
@@ -242,7 +242,7 @@ public abstract class ScrambleEffect implements EffectListener
     {
     for(int i=0; i<mCubeEffectNumber[flavour]; i++)
       {
-      android.util.Log.e("scramble", "removing cube effect "+mCubeEffects[flavour][i].getName());
+      //android.util.Log.e("scramble", "removing cube effect "+mCubeEffects[flavour][i].getName());
 
       mCube.remove(mCubeEffects[flavour][i].getID());
       }
diff --git a/src/main/java/org/distorted/effect/ScrambleEffectRotations.java b/src/main/java/org/distorted/effect/ScrambleEffectRotations.java
index 171998ef..252626b7 100644
--- a/src/main/java/org/distorted/effect/ScrambleEffectRotations.java
+++ b/src/main/java/org/distorted/effect/ScrambleEffectRotations.java
@@ -21,9 +21,14 @@ package org.distorted.effect;
 
 import org.distorted.library.effect.Effect;
 import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.effect.MatrixEffectQuaternion;
 import org.distorted.library.type.Dynamic;
 import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.DynamicQuat;
 import org.distorted.library.type.Static3D;
+import org.distorted.library.type.Static4D;
+
+import java.util.Random;
 
 import static org.distorted.magic.RubikRenderer.TEXTURE_SIZE;
 
@@ -31,16 +36,29 @@ import static org.distorted.magic.RubikRenderer.TEXTURE_SIZE;
 
 public class ScrambleEffectRotations extends ScrambleEffect
   {
+  private Random mRnd = new Random(0);
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void createEffects(int duration)
     {
-    mCubeEffectNumber[EFFECT_FLAVOUR_PLUGIN]   = 1;
+    mCubeEffectNumber[EFFECT_FLAVOUR_PLUGIN]   = 2;
     mNodeEffectNumber[EFFECT_FLAVOUR_PLUGIN]   = 0;
-    mCubeEffectPosition[EFFECT_FLAVOUR_PLUGIN] = new int[] {6};
+    mCubeEffectPosition[EFFECT_FLAVOUR_PLUGIN] = new int[] {6,7};
     mCubeEffects[EFFECT_FLAVOUR_PLUGIN]        = new Effect[mCubeEffectPosition[EFFECT_FLAVOUR_PLUGIN].length];
 
+    mRnd.setSeed(System.currentTimeMillis());
+
+    DynamicQuat dq = new DynamicQuat(duration, 0.5f);
+    dq.setMode(Dynamic.MODE_PATH);
+    dq.add(new Static4D(0,0,0,1));
+    dq.add(generateNewRandomPoint());
+    dq.add(generateNewRandomPoint());
+    dq.add(generateNewRandomPoint());
+    dq.add(new Static4D(0,0,0,1));
+
+    mCubeEffects[EFFECT_FLAVOUR_PLUGIN][0] = new MatrixEffectQuaternion(dq, new Static3D(0,0,0));
+
     float Z = TEXTURE_SIZE/3;
 
     Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
@@ -48,7 +66,21 @@ public class ScrambleEffectRotations extends ScrambleEffect
     d0.add(new Static3D( 0, 0, 0));
     d0.add(new Static3D( 0, 0,-Z));
     d0.add(new Static3D( 0, 0, 0));
-    mCubeEffects[EFFECT_FLAVOUR_PLUGIN][0] = new MatrixEffectMove(d0);
+    mCubeEffects[EFFECT_FLAVOUR_PLUGIN][1] = new MatrixEffectMove(d0);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private Static4D generateNewRandomPoint()
+    {
+    float x = mRnd.nextFloat();
+    float y = mRnd.nextFloat();
+    float z = mRnd.nextFloat();
+    float w = mRnd.nextFloat();
+
+    float len = (float)Math.sqrt(x*x + y*y + z*z + w*w);
+
+    return new Static4D( x/len, y/len, z/len, w/len);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/magic/RubikActivity.java b/src/main/java/org/distorted/magic/RubikActivity.java
index 7778a659..eaa0105b 100644
--- a/src/main/java/org/distorted/magic/RubikActivity.java
+++ b/src/main/java/org/distorted/magic/RubikActivity.java
@@ -45,7 +45,7 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
 
     public static final int DEFAULT_SIZECHANGE_POS = 20;
     public static final int DEFAULT_UNSCRAMBLE_POS = 20;
-    public static final int DEFAULT_SCRAMBLE_POS   = 20;
+    public static final int DEFAULT_SCRAMBLE_POS   =100;
     public static final int DEFAULT_SIZECHANGE_TYPE= 1;
     public static final int DEFAULT_UNSCRAMBLE_TYPE= 1;
     public static final int DEFAULT_SCRAMBLE_TYPE  = 0;
diff --git a/src/main/java/org/distorted/magic/RubikCube.java b/src/main/java/org/distorted/magic/RubikCube.java
index 8d3ebd10..72a2af53 100644
--- a/src/main/java/org/distorted/magic/RubikCube.java
+++ b/src/main/java/org/distorted/magic/RubikCube.java
@@ -30,6 +30,7 @@ import org.distorted.library.effect.MatrixEffectQuaternion;
 import org.distorted.library.effect.MatrixEffectRotate;
 import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.effect.VertexEffectSink;
+import org.distorted.library.effectqueue.EffectQueue;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedNode;
 import org.distorted.library.main.DistortedTexture;
@@ -71,7 +72,7 @@ public class RubikCube extends DistortedNode
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    RubikCube(int size, Static4D quatC, Static4D quatA, DistortedTexture texture, MeshFlat mesh, DistortedEffects effects)
+    RubikCube(int size, Static4D quatCur, Static4D quatAcc, DistortedTexture texture, MeshFlat mesh, DistortedEffects effects)
       {
       super(texture,effects,mesh);
 
@@ -109,8 +110,8 @@ public class RubikCube extends DistortedNode
       VertexEffectSink        sinkEffect = new VertexEffectSink( new Static1D(getSinkStrength()), sinkCenter, region );
       MatrixEffectMove        moveEffect = new MatrixEffectMove(mMove);
       MatrixEffectScale      scaleEffect = new MatrixEffectScale(mScale);
-      MatrixEffectQuaternion quatCEffect = new MatrixEffectQuaternion(quatC, matrCenter);
-      MatrixEffectQuaternion quatAEffect = new MatrixEffectQuaternion(quatA, matrCenter);
+      MatrixEffectQuaternion quatCEffect = new MatrixEffectQuaternion(quatCur, matrCenter);
+      MatrixEffectQuaternion quatAEffect = new MatrixEffectQuaternion(quatAcc, matrCenter);
 
       MatrixEffectMove       nodeMoveEffect  = new MatrixEffectMove(mNodeMove);
       MatrixEffectScale      nodeScaleEffect = new MatrixEffectScale(mNodeScale);
@@ -224,6 +225,52 @@ public class RubikCube extends DistortedNode
               }
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public String print_effects()
+      {
+      String str="";
+
+      EffectQueue[] effects = mEffects[0][0][0].getQueues();
+      EffectQueue matrix      = effects[0];
+      EffectQueue vertex      = effects[1];
+      EffectQueue fragment    = effects[2];
+      EffectQueue postprocess = effects[3];
+
+      str+="MATRIX: ";
+      int m_len = matrix.getNumEffects();
+      for(int i=0; i<m_len; i++)
+        {
+        str+=(" "+matrix.getEffect(i).getName()+"("+matrix.getEffect(i).getID()+")" );
+        }
+      str+='\n';
+
+      str+="VERTEX: ";
+      int v_len = vertex.getNumEffects();
+      for(int i=0; i<v_len; i++)
+        {
+        str+=(" "+vertex.getEffect(i).getName()+"("+matrix.getEffect(i).getID()+")" );
+        }
+      str+='\n';
+
+      str+="FRAGMENT: ";
+      int f_len = fragment.getNumEffects();
+      for(int i=0; i<f_len; i++)
+        {
+        str+=(" "+fragment.getEffect(i).getName()+"("+matrix.getEffect(i).getID()+")" );
+        }
+      str+='\n';
+
+      str+="POSTPROCESS: ";
+      int p_len = postprocess.getNumEffects();
+      for(int i=0; i<p_len; i++)
+        {
+        str+=(" "+postprocess.getEffect(i).getName()+"("+matrix.getEffect(i).getID()+")" );
+        }
+      str+='\n';
+
+      return str;
+      }
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public int getNumEffects(EffectType type)
diff --git a/src/main/res/layout/settings.xml b/src/main/res/layout/settings.xml
index f1944e88..94db453e 100644
--- a/src/main/res/layout/settings.xml
+++ b/src/main/res/layout/settings.xml
@@ -105,6 +105,7 @@
         android:gravity="center|fill_horizontal"
         android:layout_marginLeft="10dp"
         android:layout_marginRight="10dp"
+        android:layout_marginBottom="10dp"
         android:background="@color/grey"
         android:orientation="vertical">
 
