commit 65d5505f6cc4d58b44fb40db19760bd1bfb71e8f
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Mon Nov 7 23:04:08 2016 +0000

    2 bugfixes:
    
    - in Dynamics, it has to be t<=0.5 (rather than t<0.5) (see comment in code)
    - in EffectQueueVertex, we need to postprocess() the last time, when effect is finished but not removed!

diff --git a/src/main/java/org/distorted/library/EffectQueueVertex.java b/src/main/java/org/distorted/library/EffectQueueVertex.java
index 61b876f..2754467 100644
--- a/src/main/java/org/distorted/library/EffectQueueVertex.java
+++ b/src/main/java/org/distorted/library/EffectQueueVertex.java
@@ -78,6 +78,8 @@ class EffectQueueVertex extends EffectQueue
         {
         if( mInter[0][i].interpolateMain(mUniforms ,NUM_UNIFORMS*i, mCurrentDuration[i], step) )
           {
+          postprocess(i);
+
           for(int j=0; j<mNumListeners; j++)
             EffectMessageSender.newMessage( mListeners.elementAt(j),
                                             EffectMessage.EFFECT_FINISHED,
diff --git a/src/main/java/org/distorted/library/type/Dynamic1D.java b/src/main/java/org/distorted/library/type/Dynamic1D.java
index 881fb1b..d197967 100644
--- a/src/main/java/org/distorted/library/type/Dynamic1D.java
+++ b/src/main/java/org/distorted/library/type/Dynamic1D.java
@@ -426,8 +426,8 @@ public class Dynamic1D extends Dynamic implements Data1D
                                 break;
                 case MODE_PATH: segment = (int)(2*t*(numPoints-1));
 
-                                if( t<0.5f )
-                                  {
+                                if( t<=0.5f )  // this has to be <= (otherwise when effect ends at t=0.5, then time=1.0
+                                  {            // and end position is slightly not equal to the end point => might not get autodeleted!
                                   time = 2*t*(numPoints-1);
                                   vecCurr = segment;
                                   }
@@ -456,8 +456,8 @@ public class Dynamic1D extends Dynamic implements Data1D
                     {
                     case MODE_LOOP: vecNext = vecCurr==numPoints-1 ? 0:vecCurr+1;
                                     break;
-                    case MODE_PATH: if( t<0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
-                                    else         vecNext = vecCurr==0 ? 1 : vecCurr-1;
+                    case MODE_PATH: if( t<=0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
+                                    else          vecNext = vecCurr==0 ? 1 : vecCurr-1;
                                     break;
                     case MODE_JUMP: vecNext = vecCurr==numPoints-1 ? 1:vecCurr+1;
                                     break;
diff --git a/src/main/java/org/distorted/library/type/Dynamic2D.java b/src/main/java/org/distorted/library/type/Dynamic2D.java
index bb2d464..d9e988f 100644
--- a/src/main/java/org/distorted/library/type/Dynamic2D.java
+++ b/src/main/java/org/distorted/library/type/Dynamic2D.java
@@ -459,8 +459,8 @@ public class Dynamic2D extends Dynamic implements Data2D
                                 break;
                 case MODE_PATH: segment = (int)(2*t*(numPoints-1));
 
-                                if( t<0.5f )
-                                  {
+                                if( t<=0.5f )  // this has to be <= (otherwise when effect ends at t=0.5, then time=1.0
+                                  {            // and end position is slightly not equal to the end point => might not get autodeleted!
                                   time = 2*t*(numPoints-1);
                                   vecCurr = segment;
                                   }
@@ -489,8 +489,8 @@ public class Dynamic2D extends Dynamic implements Data2D
                     {
                     case MODE_LOOP: vecNext = vecCurr==numPoints-1 ? 0:vecCurr+1;
                                     break;
-                    case MODE_PATH: if( t<0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
-                                    else         vecNext = vecCurr==0 ? 1 : vecCurr-1;
+                    case MODE_PATH: if( t<=0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
+                                    else          vecNext = vecCurr==0 ? 1 : vecCurr-1;
                                     break;
                     case MODE_JUMP: vecNext = vecCurr==numPoints-1 ? 1:vecCurr+1;
                                     break;
diff --git a/src/main/java/org/distorted/library/type/Dynamic3D.java b/src/main/java/org/distorted/library/type/Dynamic3D.java
index 32d448b..11215e4 100644
--- a/src/main/java/org/distorted/library/type/Dynamic3D.java
+++ b/src/main/java/org/distorted/library/type/Dynamic3D.java
@@ -490,8 +490,8 @@ private float oldTime;
                                 break;
                 case MODE_PATH: segment = (int)(2*t*(numPoints-1));
 
-                                if( t<0.5f )
-                                  {
+                                if( t<=0.5f )  // this has to be <= (otherwise when effect ends at t=0.5, then time=1.0
+                                  {            // and end position is slightly not equal to the end point => might not get autodeleted!
                                   time = 2*t*(numPoints-1);
                                   vecCurr = segment;
                                   }
@@ -520,8 +520,8 @@ private float oldTime;
                     {
                     case MODE_LOOP: vecNext = vecCurr==numPoints-1 ? 0:vecCurr+1;
                                     break;
-                    case MODE_PATH: if( t<0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
-                                    else         vecNext = vecCurr==0 ? 1 : vecCurr-1;
+                    case MODE_PATH: if( t<=0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
+                                    else          vecNext = vecCurr==0 ? 1 : vecCurr-1;
                                     break;
                     case MODE_JUMP: vecNext = vecCurr==numPoints-1 ? 1:vecCurr+1;
                                     break;
@@ -541,7 +541,7 @@ private float oldTime;
                 time = time-vecCurr;
             
                 tmp1 = vc.elementAt(vecCurr);
-               
+
                 if( vn!=null )
                   {
                   time = noise(time,vecCurr);
@@ -551,64 +551,6 @@ private float oldTime;
                   buffer[offset  ]= ((tmp1.a[0]*time+tmp1.b[0])*time+tmp1.c[0])*time+tmp1.d[0] + (baseV[1][0]*mFactor[0] + baseV[2][0]*mFactor[1]);
                   buffer[offset+1]= ((tmp1.a[1]*time+tmp1.b[1])*time+tmp1.c[1])*time+tmp1.d[1] + (baseV[1][1]*mFactor[0] + baseV[2][1]*mFactor[1]);
                   buffer[offset+2]= ((tmp1.a[2]*time+tmp1.b[2])*time+tmp1.c[2])*time+tmp1.d[2] + (baseV[1][2]*mFactor[0] + baseV[2][2]*mFactor[1]);
-/*
-                  float d0 = buffer[offset+0] - a0;
-                  float d1 = buffer[offset+1] - a1;
-                  float d2 = buffer[offset+2] - a2;
-
-                  float distSQ = d0*d0+d1*d1+d2*d2;
-
-                  if( distSQ>500.0f )
-                    {
-                    android.util.Log.e("dyn3D", "distSQ="+distSQ);
-                    android.util.Log.e("dyn3D", "factors old0="+f0+" new0="+mFactor[0]+" old1="+f1+" new1="+mFactor[1]);
-                    android.util.Log.e("dyn3D", "first  base: old ("+b00+","+b01+","+b02+") new ("+baseV[0][0]+","+baseV[0][1]+","+baseV[0][2]+")");
-                    android.util.Log.e("dyn3D", "second base: old ("+b10+","+b11+","+b12+") new ("+baseV[1][0]+","+baseV[1][1]+","+baseV[1][2]+")");
-                    android.util.Log.e("dyn3D", "third  base: old ("+b20+","+b21+","+b22+") new ("+baseV[2][0]+","+baseV[2][1]+","+baseV[2][2]+")");
-
-                    String s1= "velocity: old (";
-                    String s2= "acceleration: old (";
-
-                    for(int i=0; i<mDimension; i++)
-                      {
-                      s1 += (((3*tmp1.a[i]*oldTime+2*tmp1.b[i])*oldTime+tmp1.c[i])+(i==mDimension-1 ? ") new (":","));
-                      s2 += ( (6*tmp1.a[i]*oldTime+2*tmp1.b[i])                   +(i==mDimension-1 ? ") new (":","));
-                      }
-
-                    for(int i=0; i<mDimension; i++)
-                      {
-                      s1 += (((3*tmp1.a[i]*time+2*tmp1.b[i])*time+tmp1.c[i])+(i==mDimension-1 ? ")":","));
-                      s2 += ( (6*tmp1.a[i]*time+2*tmp1.b[i])                +(i==mDimension-1 ? ")":","));
-                      }
-
-                    android.util.Log.e("dyn3D", s1);
-                    android.util.Log.e("dyn3D", s2);
-
-                    computeOrthonormalBaseMoreDebug(oldTime,tmp1);
-                    computeOrthonormalBaseMoreDebug(   time,tmp1);
-                    }
-
-                  a0 = buffer[offset+0];
-                  a1 = buffer[offset+1];
-                  a2 = buffer[offset+2];
-
-                  f0 = mFactor[0];
-                  f1 = mFactor[1];
-
-                  b00 = baseV[0][0];
-                  b01 = baseV[0][1];
-                  b02 = baseV[0][2];
-
-                  b10 = baseV[1][0];
-                  b11 = baseV[1][1];
-                  b12 = baseV[1][2];
-
-                  b20 = baseV[2][0];
-                  b21 = baseV[2][1];
-                  b22 = baseV[2][2];
-
-                  oldTime = time;
-*/
                   }
                 else
                   {
diff --git a/src/main/java/org/distorted/library/type/Dynamic4D.java b/src/main/java/org/distorted/library/type/Dynamic4D.java
index 8ae0d42..4d2d6ec 100644
--- a/src/main/java/org/distorted/library/type/Dynamic4D.java
+++ b/src/main/java/org/distorted/library/type/Dynamic4D.java
@@ -506,8 +506,8 @@ public class Dynamic4D extends Dynamic implements Data4D
                                 break;
                 case MODE_PATH: segment = (int)(2*t*(numPoints-1));
 
-                                if( t<0.5f )
-                                  {
+                                if( t<=0.5f )  // this has to be <= (otherwise when effect ends at t=0.5, then time=1.0
+                                  {            // and end position is slightly not equal to the end point => might not get autodeleted!
                                   time = 2*t*(numPoints-1);
                                   vecCurr = segment;
                                   }
@@ -536,8 +536,8 @@ public class Dynamic4D extends Dynamic implements Data4D
                     {
                     case MODE_LOOP: vecNext = vecCurr==numPoints-1 ? 0:vecCurr+1;
                                     break;
-                    case MODE_PATH: if( t<0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
-                                    else         vecNext = vecCurr==0 ? 1 : vecCurr-1;
+                    case MODE_PATH: if( t<=0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
+                                    else          vecNext = vecCurr==0 ? 1 : vecCurr-1;
                                     break;
                     case MODE_JUMP: vecNext = vecCurr==numPoints-1 ? 1:vecCurr+1;
                                     break;
diff --git a/src/main/java/org/distorted/library/type/Dynamic5D.java b/src/main/java/org/distorted/library/type/Dynamic5D.java
index 28f6236..51ed65c 100644
--- a/src/main/java/org/distorted/library/type/Dynamic5D.java
+++ b/src/main/java/org/distorted/library/type/Dynamic5D.java
@@ -529,8 +529,8 @@ public class Dynamic5D extends Dynamic implements Data5D
                                 break;
                 case MODE_PATH: segment = (int)(2*t*(numPoints-1));
 
-                                if( t<0.5f )
-                                  {
+                                if( t<=0.5f )  // this has to be <= (otherwise when effect ends at t=0.5, then time=1.0
+                                  {            // and end position is slightly not equal to the end point => might not get autodeleted!
                                   time = 2*t*(numPoints-1);
                                   vecCurr = segment;
                                   }
@@ -559,8 +559,8 @@ public class Dynamic5D extends Dynamic implements Data5D
                     {
                     case MODE_LOOP: vecNext = vecCurr==numPoints-1 ? 0:vecCurr+1;
                                     break;
-                    case MODE_PATH: if( t<0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
-                                    else         vecNext = vecCurr==0 ? 1 : vecCurr-1;
+                    case MODE_PATH: if( t<=0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
+                                    else          vecNext = vecCurr==0 ? 1 : vecCurr-1;
                                     break;
                     case MODE_JUMP: vecNext = vecCurr==numPoints-1 ? 1:vecCurr+1;
                                     break;
