commit 835b197e7b0aa47a7af7a709bc6c374ab174c93d
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri May 7 00:06:23 2021 +0200

    Move the information when was a EffectQueue last time evaluated from the EffectQueues all the way up to the Node which contains them.
    The point: we need to reset this time back to 0 every time we attach the Node (and thus start evaluating the Queues inside)

diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectScale.java b/src/main/java/org/distorted/library/effect/MatrixEffectScale.java
index a4c5a3d..d042c32 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectScale.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectScale.java
@@ -30,7 +30,7 @@ import org.distorted.library.type.Static3D;
  */
 public class MatrixEffectScale extends MatrixEffect
   {
-  private Data3D mScale;
+  private final Data3D mScale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/VertexEffectRotate.java b/src/main/java/org/distorted/library/effect/VertexEffectRotate.java
index 61995df..28eacb3 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectRotate.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectRotate.java
@@ -31,8 +31,8 @@ public class VertexEffectRotate extends VertexEffect
   {
   private static final EffectName NAME = EffectName.VERTEX_ROTATE;
 
-  private Data1D mAngle;
-  private Data3D mAxis, mCenter;
+  private final Data1D mAngle;
+  private final Data3D mAxis, mCenter;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueue.java b/src/main/java/org/distorted/library/effectqueue/EffectQueue.java
index 7e34c88..2f2bea8 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueue.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueue.java
@@ -49,7 +49,6 @@ public abstract class EffectQueue implements InternalMaster.Slave
   private static final int DETACH = 2;
   private static final int DETALL = 3;
 
-  long mTime;
   int mNumEffects;              // 'ToBe' will be more than mNumEffects if doWork() hasn't
   private int mNumEffectsToBe;  // added them yet (or less if it hasn't removed some yet)
   Effect[] mEffects;
@@ -85,7 +84,6 @@ public abstract class EffectQueue implements InternalMaster.Slave
   EffectQueue(int numFloatUniforms, int numIntUniforms, boolean useUBO, int index)
     {
     mCreated        = false;
-    mTime           = 0;
     mID             = 0;
     mNumEffects     = 0;
     mNumEffectsToBe = 0;
@@ -105,7 +103,6 @@ public abstract class EffectQueue implements InternalMaster.Slave
     if( !source.mCreated )
       {
       mCreated        = false;
-      mTime           = 0;
       mID             = 0;
       mNumEffects     = 0;
       mNumEffectsToBe = 0;
@@ -126,7 +123,6 @@ public abstract class EffectQueue implements InternalMaster.Slave
     else
       {
       mCreated        = true;
-      mTime           = source.mTime;
       mID             = source.mID;
       mNumEffects     = source.mNumEffects;
       mNumEffectsToBe = source.mNumEffectsToBe;
@@ -162,12 +158,12 @@ public abstract class EffectQueue implements InternalMaster.Slave
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public static void compute(EffectQueue[] queues, long currTime)
+  public static void compute(EffectQueue[] queues, long currTime, long step)
     {
-    ((EffectQueueMatrix     )queues[0]).compute(currTime);
-    ((EffectQueueVertex     )queues[1]).compute(currTime);
-    ((EffectQueueFragment   )queues[2]).compute(currTime);
-    ((EffectQueuePostprocess)queues[3]).compute(currTime);
+    ((EffectQueueMatrix     )queues[0]).compute(currTime,step);
+    ((EffectQueueVertex     )queues[1]).compute(currTime,step);
+    ((EffectQueueFragment   )queues[2]).compute(currTime,step);
+    ((EffectQueuePostprocess)queues[3]).compute(currTime,step);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.java b/src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.java
index 85f5518..436b8c9 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.java
@@ -63,14 +63,10 @@ class EffectQueueFragment extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
   
-  void compute(long currTime)
-    { 
-    if( currTime==mTime ) return;
-    if( mTime==0 ) mTime = currTime;
-
+  void compute(long currTime, long step)
+    {
     if( mNumEffects>0 )
       {
-      long step = (currTime-mTime);
       float[] array = mUBF.getBackingArray();
 
       for(int i=0; i<mNumEffects; i++)
@@ -81,8 +77,6 @@ class EffectQueueFragment extends EffectQueue
           }
         }
       }
-
-    mTime = currTime;  
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java b/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java
index 47af267..44ecbb2 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java
@@ -68,22 +68,20 @@ class EffectQueueMatrix extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void compute(long currTime)
+  void compute(long currTime, long step)
     {
-    if( currTime==mTime ) return;
-    if( mTime==0 ) mTime = currTime;
-    long step = (currTime-mTime);
-    float[] array = mUBF.getBackingArray();
-
-    for(int i=0; i<mNumEffects; i++)
+    if( mNumEffects>0 )
       {
-      if( mEffects[i].compute(array, NUM_FLOAT_UNIFORMS*i, currTime, step) )
+      float[] array = mUBF.getBackingArray();
+
+      for(int i=0; i<mNumEffects; i++)
         {
-        EffectMessageSender.newMessage(mEffects[i]);
+        if( mEffects[i].compute(array, NUM_FLOAT_UNIFORMS*i, currTime, step) )
+          {
+          EffectMessageSender.newMessage(mEffects[i]);
+          }
         }
       }
-     
-    mTime = currTime;  
     }  
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java
index 8941cbc..57d46a7 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java
@@ -76,12 +76,8 @@ public class EffectQueuePostprocess extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void compute(long currTime)
+  void compute(long currTime, long step)
     {
-    if( currTime==mTime ) return;
-    if( mTime==0 ) mTime = currTime;
-    long step = (currTime-mTime);
-
     mR = mG = mB = mA = 0.0f;
     mHalo = 0;
     int halo;
@@ -111,8 +107,6 @@ public class EffectQueuePostprocess extends EffectQueue
       mB = array[4];
       mA = array[5];
       }
-
-    mTime = currTime;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.java b/src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.java
index a63ab55..19cfbe1 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.java
@@ -74,14 +74,10 @@ public class EffectQueueVertex extends EffectQueue
  *
  * @y.exclude
  */
-  public void compute(long currTime)
+  public void compute(long currTime, long step)
     {
-    if( currTime==mTime ) return;
-    if( mTime==0 ) mTime = currTime;
-
     if( mNumEffects>0 )
       {
-      long step = (currTime-mTime);
       float[] array = mUBF.getBackingArray();
 
       for(int i=0; i<mNumEffects; i++)
@@ -94,8 +90,6 @@ public class EffectQueueVertex extends EffectQueue
 
       mUBF.invalidate();
       }
-
-    mTime = currTime;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/main/DistortedLibrary.java b/src/main/java/org/distorted/library/main/DistortedLibrary.java
index bd02d0a..74d9d0b 100644
--- a/src/main/java/org/distorted/library/main/DistortedLibrary.java
+++ b/src/main/java/org/distorted/library/main/DistortedLibrary.java
@@ -557,7 +557,7 @@ public class DistortedLibrary
 
     mFullProgram.useProgram();
     mesh.bindVertexAttribs(mFullProgram);
-    queue.compute(1);
+    queue.compute(1,0);
     queue.send(0.0f,mFullProgramH,3);
     mesh.send(mFullProgramH,3);
 
@@ -573,13 +573,13 @@ public class DistortedLibrary
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static void drawPrivOIT(DistortedEffects effects, MeshBase mesh, InternalOutputSurface surface, long currTime)
+  static void drawPrivOIT(DistortedEffects effects, MeshBase mesh, InternalOutputSurface surface, long currTime, long step)
     {
     if( mMainOITProgram!=null )
       {
       EffectQueue[] queues = effects.getQueues();
 
-      EffectQueue.compute(queues, currTime);
+      EffectQueue.compute(queues, currTime, step);
       GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
 
       mMainOITProgram.useProgram();
@@ -609,13 +609,13 @@ public class DistortedLibrary
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static void drawPriv(DistortedEffects effects, MeshBase mesh, InternalOutputSurface surface, long currTime)
+  static void drawPriv(DistortedEffects effects, MeshBase mesh, InternalOutputSurface surface, long currTime, long step)
     {
     if( mMainProgram!=null )
       {
       EffectQueue[] queues = effects.getQueues();
 
-      EffectQueue.compute(queues, currTime);
+      EffectQueue.compute(queues, currTime, step);
       GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
 
       mMainProgram.useProgram();
diff --git a/src/main/java/org/distorted/library/main/DistortedNode.java b/src/main/java/org/distorted/library/main/DistortedNode.java
index d5cf03c..65c6f2d 100644
--- a/src/main/java/org/distorted/library/main/DistortedNode.java
+++ b/src/main/java/org/distorted/library/main/DistortedNode.java
@@ -52,6 +52,7 @@ public class DistortedNode implements InternalChildrenList.Parent
   private int mFboW, mFboH, mFboDepthStencil;
   private boolean mRenderWayOIT;
   private float mFOV, mNear;
+  private long mLastTime;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -160,7 +161,9 @@ public class DistortedNode implements InternalChildrenList.Parent
       {
       mState.apply();
       GLES30.glDisable(GLES30.GL_BLEND);
-      DistortedLibrary.drawPriv(mEffects, mMesh, surface, currTime);
+      if( mLastTime==0 ) mLastTime=currTime;
+      DistortedLibrary.drawPriv(mEffects, mMesh, surface, currTime, (currTime-mLastTime));
+      mLastTime = currTime;
       GLES30.glEnable(GLES30.GL_BLEND);
       return 1;
       }
@@ -178,7 +181,9 @@ public class DistortedNode implements InternalChildrenList.Parent
     if( input.setAsInput() )
       {
       mState.apply();
-      DistortedLibrary.drawPrivOIT(mEffects, mMesh, surface, currTime);
+      if( mLastTime==0 ) mLastTime=currTime;
+      DistortedLibrary.drawPrivOIT(mEffects, mMesh, surface, currTime, (currTime-mLastTime));
+      mLastTime = currTime;
       return 1;
       }
 
@@ -195,7 +200,9 @@ public class DistortedNode implements InternalChildrenList.Parent
     if( input.setAsInput() )
       {
       mState.apply();
-      DistortedLibrary.drawPriv(mEffects, mMesh, surface, currTime);
+      if( mLastTime==0 ) mLastTime=currTime;
+      DistortedLibrary.drawPriv(mEffects, mMesh, surface, currTime, (currTime-mLastTime));
+      mLastTime = currTime;
       return 1;
       }
 
@@ -294,6 +301,7 @@ public class DistortedNode implements InternalChildrenList.Parent
  */
   public DistortedNode(InternalSurface surface, DistortedEffects effects, MeshBase mesh)
     {
+    mLastTime      = 0;
     mSurface       = surface;
     mEffects       = effects;
     mMesh          = mesh;
@@ -324,6 +332,7 @@ public class DistortedNode implements InternalChildrenList.Parent
  */
   public DistortedNode(DistortedNode node, int flags)
     {
+    mLastTime     = 0;
     mEffects      = new DistortedEffects(node.mEffects,flags);
     mMesh         = node.mMesh;
     mState        = new InternalRenderState();
diff --git a/src/main/java/org/distorted/library/main/DistortedScreen.java b/src/main/java/org/distorted/library/main/DistortedScreen.java
index 9007aa0..28cd1b0 100644
--- a/src/main/java/org/distorted/library/main/DistortedScreen.java
+++ b/src/main/java/org/distorted/library/main/DistortedScreen.java
@@ -174,7 +174,7 @@ public class DistortedScreen extends DistortedFramebuffer
 
     if( mDebugMode!=DEBUG_MODE_NONE && debugTexture.setAsInput())
       {
-      DistortedLibrary.drawPriv(debugEffects, debugMesh, this, time);
+      DistortedLibrary.drawPriv(debugEffects, debugMesh, this, time,0);
       }
 
     if( mQueueSize<=0 )
diff --git a/src/main/java/org/distorted/library/type/Dynamic3D.java b/src/main/java/org/distorted/library/type/Dynamic3D.java
index b0c0569..a01c2c7 100644
--- a/src/main/java/org/distorted/library/type/Dynamic3D.java
+++ b/src/main/java/org/distorted/library/type/Dynamic3D.java
@@ -29,7 +29,7 @@ import java.util.Vector;
 
 public class Dynamic3D extends Dynamic implements Data3D
   {
-  private Vector<Static3D> vv;
+  private final Vector<Static3D> vv;
   private Static3D prev, curr, next;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/uniformblock/UniformBlockAssociation.java b/src/main/java/org/distorted/library/uniformblock/UniformBlockAssociation.java
index 7133d18..938b522 100644
--- a/src/main/java/org/distorted/library/uniformblock/UniformBlockAssociation.java
+++ b/src/main/java/org/distorted/library/uniformblock/UniformBlockAssociation.java
@@ -74,10 +74,11 @@ public class UniformBlockAssociation
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // stride can be 0, if we just tried compiling a vertex shader which has NUM_VERTEX=0.
+// stride==1 we also don't like because then we have an exception ( stride*mMax-1 < stride*(mMax-1)+1 )
 
   public void correctStride(int stride)
     {
-    if( mStride != stride && stride!=0 )
+    if( mStride != stride && stride>1 )
       {
       int[] tmp = new int[stride*mMax];
 
