commit 4fd9efa1aa549c90a338f665bebc78a54871bd89
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue May 14 16:04:48 2019 +0100

    Add support for separate Cube and Node effects.

diff --git a/src/main/java/org/distorted/effect/AppearEffect.java b/src/main/java/org/distorted/effect/AppearEffect.java
index 6ccdc737..6c4e00f9 100644
--- a/src/main/java/org/distorted/effect/AppearEffect.java
+++ b/src/main/java/org/distorted/effect/AppearEffect.java
@@ -20,6 +20,7 @@
 package org.distorted.effect;
 
 import org.distorted.library.effect.Effect;
+import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.message.EffectListener;
 import org.distorted.magic.RubikCube;
@@ -65,20 +66,21 @@ public abstract class AppearEffect implements EffectListener
 
   private final int FAKE_EFFECT_ID = -1;
 
-  private int mCubeEffectNumber, mCubeEffectFinished, mCubeEffectReturned;
-
   private EffectListener mListener;
-  private DistortedScreen mScreen;
   private RubikCube mCube;
+  private int mCubeEffectNumber, mNodeEffectNumber, mEffectFinished, mEffectReturned;
 
+  DistortedScreen mScreen;
   Effect[] mCubeEffects;
   int[] mCubeEffectPosition;
+  Effect[] mNodeEffects;
+  int[] mNodeEffectPosition;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   AppearEffect()
     {
-    mCubeEffectReturned = 0;
+    mEffectReturned = 0;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -102,17 +104,34 @@ public abstract class AppearEffect implements EffectListener
 
       if( effectID == id )
         {
-        mCubeEffectReturned++;
-
-        if( mCubeEffectReturned == mCubeEffectFinished )
-          {
-          mListener.effectFinished(FAKE_EFFECT_ID);
-          }
-
+        effectReturned();
         mCube.remove(id);
         break;
         }
       }
+    for(int i=0; i<mNodeEffectNumber; i++)
+      {
+      long id = mNodeEffects[i].getID();
+
+      if( effectID == id )
+        {
+        effectReturned();
+        mCube.getEffects().abortById(id);
+        break;
+        }
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void effectReturned()
+    {
+    mEffectReturned++;
+
+    if( mEffectReturned == mEffectFinished )
+      {
+      mListener.effectFinished(FAKE_EFFECT_ID);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -123,15 +142,14 @@ public abstract class AppearEffect implements EffectListener
     mCube     = cube;
     mListener = listener;
 
-    mCubeEffectFinished = createEffects(duration);
+    mEffectFinished = createEffects(duration);
 
-    if( mCubeEffects!=null )
-      {
-      mCubeEffectNumber = mCubeEffects.length;
-      }
-    else
+    mCubeEffectNumber = ( mCubeEffects!=null ) ? mCubeEffects.length : 0;
+    mNodeEffectNumber = ( mNodeEffects!=null ) ? mNodeEffects.length : 0;
+
+    if( mCubeEffectNumber==0 && mNodeEffectNumber==0 )
       {
-      throw new RuntimeException("Appear Cube Effects not created!");
+      throw new RuntimeException("Cube and Node Effects both not created!");
       }
 
     for(int i=0; i<mCubeEffectNumber; i++)
@@ -140,6 +158,14 @@ public abstract class AppearEffect implements EffectListener
       mCubeEffects[i].notifyWhenFinished(this);
       }
 
+    DistortedEffects nodeEffects = mCube.getEffects();
+
+    for(int i=0; i<mNodeEffectNumber; i++)
+      {
+      nodeEffects.apply(mNodeEffects[i],mNodeEffectPosition[i]);
+      mNodeEffects[i].notifyWhenFinished(this);
+      }
+
     mScreen.attach(mCube);
 
     return FAKE_EFFECT_ID;
diff --git a/src/main/java/org/distorted/effect/AppearEffectMove.java b/src/main/java/org/distorted/effect/AppearEffectMove.java
index c69e3b9b..06e00be3 100644
--- a/src/main/java/org/distorted/effect/AppearEffectMove.java
+++ b/src/main/java/org/distorted/effect/AppearEffectMove.java
@@ -24,21 +24,23 @@ import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static3D;
 
-import static org.distorted.magic.RubikRenderer.TEXTURE_SIZE;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class AppearEffectMove extends AppearEffect
   {
   public int createEffects(int duration)
     {
-    mCubeEffectPosition = new int[] {6};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
+    int w = mScreen.getWidth();
+    int h = mScreen.getHeight();
+    int xmove = w/2 + (w<h?w:h)/2;
+
+    mNodeEffectPosition = new int[] {1};
+    mNodeEffects        = new Effect[mNodeEffectPosition.length];
 
-    Dynamic3D oldCube0 = new Dynamic3D(duration, 0.5f);
-    oldCube0.add(new Static3D(-TEXTURE_SIZE,0,0));
-    oldCube0.add(new Static3D(            0,0,0));
-    mCubeEffects[0] = new MatrixEffectMove(oldCube0);
+    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
+    d0.add(new Static3D(-xmove,0,0));
+    d0.add(new Static3D(     0,0,0));
+    mNodeEffects[0] = new MatrixEffectMove(d0);
 
     return 1;
     }
diff --git a/src/main/java/org/distorted/effect/AppearEffectNone.java b/src/main/java/org/distorted/effect/AppearEffectNone.java
index 89ede0f6..a3e93988 100644
--- a/src/main/java/org/distorted/effect/AppearEffectNone.java
+++ b/src/main/java/org/distorted/effect/AppearEffectNone.java
@@ -33,9 +33,9 @@ class AppearEffectNone extends AppearEffect
     mCubeEffectPosition = new int[] {-1};
     mCubeEffects        = new Effect[mCubeEffectPosition.length];
 
-    Dynamic3D oldCube0 = new Dynamic3D(1,0.5f);
-    oldCube0.add(new Static3D(0,0,0));
-    mCubeEffects[0] = new MatrixEffectMove(oldCube0);
+    Dynamic3D d0 = new Dynamic3D(1,0.5f);
+    d0.add(new Static3D(0,0,0));
+    mCubeEffects[0] = new MatrixEffectMove(d0);
 
     return 1;
     }
diff --git a/src/main/java/org/distorted/effect/AppearEffectScale.java b/src/main/java/org/distorted/effect/AppearEffectScale.java
index e288c9ff..40add6bd 100644
--- a/src/main/java/org/distorted/effect/AppearEffectScale.java
+++ b/src/main/java/org/distorted/effect/AppearEffectScale.java
@@ -33,10 +33,10 @@ class AppearEffectScale extends AppearEffect
     mCubeEffectPosition = new int[] {6};
     mCubeEffects        = new Effect[mCubeEffectPosition.length];
 
-    Dynamic3D oldCube0 = new Dynamic3D(duration, 0.5f);
-    oldCube0.add(new Static3D(0.01f, 0.01f, 0.01f));
-    oldCube0.add(new Static3D(1.00f, 1.00f, 1.00f));
-    mCubeEffects[0] = new MatrixEffectScale(oldCube0);
+    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
+    d0.add(new Static3D(0.01f, 0.01f, 0.01f));
+    d0.add(new Static3D(1.00f, 1.00f, 1.00f));
+    mCubeEffects[0] = new MatrixEffectScale(d0);
 
     return 1;
     }
diff --git a/src/main/java/org/distorted/effect/AppearEffectTransparency.java b/src/main/java/org/distorted/effect/AppearEffectTransparency.java
index f1d5192b..f4aff92f 100644
--- a/src/main/java/org/distorted/effect/AppearEffectTransparency.java
+++ b/src/main/java/org/distorted/effect/AppearEffectTransparency.java
@@ -33,10 +33,10 @@ class AppearEffectTransparency extends AppearEffect
     mCubeEffectPosition = new int[] {-1};
     mCubeEffects        = new Effect[mCubeEffectPosition.length];
 
-    Dynamic1D oldCube0 = new Dynamic1D(duration, 0.5f);
-    oldCube0.add(new Static1D(0.0f));
-    oldCube0.add(new Static1D(1.0f));
-    mCubeEffects[0] = new FragmentEffectAlpha(oldCube0);
+    Dynamic1D d0 = new Dynamic1D(duration, 0.5f);
+    d0.add(new Static1D(0.0f));
+    d0.add(new Static1D(1.0f));
+    mCubeEffects[0] = new FragmentEffectAlpha(d0);
 
     return 1;
     }
diff --git a/src/main/java/org/distorted/effect/DisappearEffect.java b/src/main/java/org/distorted/effect/DisappearEffect.java
index 4e19b874..3d09f315 100644
--- a/src/main/java/org/distorted/effect/DisappearEffect.java
+++ b/src/main/java/org/distorted/effect/DisappearEffect.java
@@ -20,6 +20,7 @@
 package org.distorted.effect;
 
 import org.distorted.library.effect.Effect;
+import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.message.EffectListener;
 import org.distorted.magic.RubikCube;
@@ -65,20 +66,21 @@ public abstract class DisappearEffect implements EffectListener
 
   private final int FAKE_EFFECT_ID = -2;
 
-  private int mCubeEffectNumber, mCubeEffectFinished, mCubeEffectReturned;
-
   private EffectListener mListener;
-  private DistortedScreen mScreen;
   private RubikCube mCube;
+  private int mCubeEffectNumber, mNodeEffectNumber, mEffectFinished, mEffectReturned;
 
+  DistortedScreen mScreen;
   Effect[] mCubeEffects;
   int[] mCubeEffectPosition;
+  Effect[] mNodeEffects;
+  int[] mNodeEffectPosition;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   DisappearEffect()
     {
-    mCubeEffectReturned = 0;
+    mEffectReturned = 0;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -102,22 +104,39 @@ public abstract class DisappearEffect implements EffectListener
 
       if( effectID == id )
         {
-        mCubeEffectReturned++;
-
-        if( mCubeEffectReturned == mCubeEffectFinished )
-          {
-          mListener.effectFinished(FAKE_EFFECT_ID);
-          }
-
-        if( mCubeEffectReturned == mCubeEffectNumber )
-          {
-          mScreen.detach(mCube);
-          }
-
+        effectReturned();
         mCube.remove(id);
         break;
         }
       }
+    for(int i=0; i<mNodeEffectNumber; i++)
+      {
+      long id = mNodeEffects[i].getID();
+
+      if( effectID == id )
+        {
+        effectReturned();
+        mCube.getEffects().abortById(id);
+        break;
+        }
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void effectReturned()
+    {
+    mEffectReturned++;
+
+    if( mEffectReturned == mEffectFinished )
+      {
+      mListener.effectFinished(FAKE_EFFECT_ID);
+      }
+
+    if( mEffectReturned == mCubeEffectNumber+mNodeEffectNumber )
+      {
+      mScreen.detach(mCube);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -128,15 +147,14 @@ public abstract class DisappearEffect implements EffectListener
     mCube     = cube;
     mListener = listener;
 
-    mCubeEffectFinished = createEffects(duration);
+    mEffectFinished = createEffects(duration);
 
-    if( mCubeEffects!=null )
-      {
-      mCubeEffectNumber = mCubeEffects.length;
-      }
-    else
+    mCubeEffectNumber = ( mCubeEffects!=null ) ? mCubeEffects.length : 0;
+    mNodeEffectNumber = ( mNodeEffects!=null ) ? mNodeEffects.length : 0;
+
+    if( mCubeEffectNumber==0 && mNodeEffectNumber==0 )
       {
-      throw new RuntimeException("Disappear Cube Effects not created!");
+      throw new RuntimeException("Cube and Node Effects both not created!");
       }
 
     for(int i=0; i<mCubeEffectNumber; i++)
@@ -145,6 +163,14 @@ public abstract class DisappearEffect implements EffectListener
       mCubeEffects[i].notifyWhenFinished(this);
       }
 
+    DistortedEffects nodeEffects = mCube.getEffects();
+
+    for(int i=0; i<mNodeEffectNumber; i++)
+      {
+      nodeEffects.apply(mNodeEffects[i],mNodeEffectPosition[i]);
+      mNodeEffects[i].notifyWhenFinished(this);
+      }
+
     return FAKE_EFFECT_ID;
     }
 
diff --git a/src/main/java/org/distorted/effect/DisappearEffectMove.java b/src/main/java/org/distorted/effect/DisappearEffectMove.java
index bfca298b..6f97b879 100644
--- a/src/main/java/org/distorted/effect/DisappearEffectMove.java
+++ b/src/main/java/org/distorted/effect/DisappearEffectMove.java
@@ -24,21 +24,23 @@ import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static3D;
 
-import static org.distorted.magic.RubikRenderer.TEXTURE_SIZE;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class DisappearEffectMove extends DisappearEffect
   {
   public int createEffects(int duration)
     {
-    mCubeEffectPosition = new int[] {6};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
+    int w = mScreen.getWidth();
+    int h = mScreen.getHeight();
+    int xmove = w/2 + (w<h?w:h)/2;
+
+    mNodeEffectPosition = new int[] {1};
+    mNodeEffects        = new Effect[mNodeEffectPosition.length];
 
-    Dynamic3D oldCube0 = new Dynamic3D(duration, 0.5f);
-    oldCube0.add(new Static3D(           0,0,0));
-    oldCube0.add(new Static3D(TEXTURE_SIZE,0,0));
-    mCubeEffects[0] = new MatrixEffectMove(oldCube0);
+    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
+    d0.add(new Static3D(    0,0,0));
+    d0.add(new Static3D(xmove,0,0));
+    mNodeEffects[0] = new MatrixEffectMove(d0);
 
     return 1;
     }
diff --git a/src/main/java/org/distorted/effect/DisappearEffectNone.java b/src/main/java/org/distorted/effect/DisappearEffectNone.java
index 79e75b89..49a4b42a 100644
--- a/src/main/java/org/distorted/effect/DisappearEffectNone.java
+++ b/src/main/java/org/distorted/effect/DisappearEffectNone.java
@@ -33,9 +33,9 @@ class DisappearEffectNone extends DisappearEffect
     mCubeEffectPosition = new int[] {-1};
     mCubeEffects        = new Effect[mCubeEffectPosition.length];
 
-    Dynamic3D oldCube0 = new Dynamic3D(1,0.5f);
-    oldCube0.add(new Static3D(0,0,0));
-    mCubeEffects[0] = new MatrixEffectMove(oldCube0);
+    Dynamic3D d0 = new Dynamic3D(1,0.5f);
+    d0.add(new Static3D(0,0,0));
+    mCubeEffects[0] = new MatrixEffectMove(d0);
 
     return 1;
     }
diff --git a/src/main/java/org/distorted/effect/DisappearEffectScale.java b/src/main/java/org/distorted/effect/DisappearEffectScale.java
index 5a4eb258..6b6bc3e8 100644
--- a/src/main/java/org/distorted/effect/DisappearEffectScale.java
+++ b/src/main/java/org/distorted/effect/DisappearEffectScale.java
@@ -33,10 +33,10 @@ class DisappearEffectScale extends DisappearEffect
     mCubeEffectPosition = new int[] {6};
     mCubeEffects        = new Effect[mCubeEffectPosition.length];
 
-    Dynamic3D oldCube0 = new Dynamic3D(duration, 0.5f);
-    oldCube0.add(new Static3D(1.00f, 1.00f, 1.00f));
-    oldCube0.add(new Static3D(0.01f, 0.01f, 0.01f));
-    mCubeEffects[0] = new MatrixEffectScale(oldCube0);
+    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
+    d0.add(new Static3D(1.00f, 1.00f, 1.00f));
+    d0.add(new Static3D(0.01f, 0.01f, 0.01f));
+    mCubeEffects[0] = new MatrixEffectScale(d0);
 
     return 1;
     }
diff --git a/src/main/java/org/distorted/effect/DisappearEffectTransparency.java b/src/main/java/org/distorted/effect/DisappearEffectTransparency.java
index 1501c4c5..b8f2c42d 100644
--- a/src/main/java/org/distorted/effect/DisappearEffectTransparency.java
+++ b/src/main/java/org/distorted/effect/DisappearEffectTransparency.java
@@ -33,10 +33,10 @@ class DisappearEffectTransparency extends DisappearEffect
     mCubeEffectPosition = new int[] {-1};
     mCubeEffects        = new Effect[mCubeEffectPosition.length];
 
-    Dynamic1D oldCube0 = new Dynamic1D(duration, 0.5f);
-    oldCube0.add(new Static1D(1.0f));
-    oldCube0.add(new Static1D(0.0f));
-    mCubeEffects[0] = new FragmentEffectAlpha(oldCube0);
+    Dynamic1D d0 = new Dynamic1D(duration, 0.5f);
+    d0.add(new Static1D(1.0f));
+    d0.add(new Static1D(0.0f));
+    mCubeEffects[0] = new FragmentEffectAlpha(d0);
 
     return 1;
     }
