commit 3543a3cf9be0f9b5c77f58b56f0b73bf824ce214
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun Nov 29 00:37:10 2020 +0100

    Put new things to the StackFrame.

diff --git a/src/main/java/org/distorted/library/effect/Effect.java b/src/main/java/org/distorted/library/effect/Effect.java
index 99e4666..c7a94f4 100644
--- a/src/main/java/org/distorted/library/effect/Effect.java
+++ b/src/main/java/org/distorted/library/effect/Effect.java
@@ -20,6 +20,7 @@
 package org.distorted.library.effect;
 
 import org.distorted.library.effectqueue.EffectQueue;
+import org.distorted.library.main.InternalStackFrameList;
 import org.distorted.library.message.EffectListener;
 
 import java.lang.reflect.Method;
@@ -44,8 +45,6 @@ public abstract class Effect
   private ArrayList<EffectListener> mListeners =null;
   private int mNumListeners=0;  // ==mListeners.length(), but we only create mListeners if the first one gets added
 
-  private static long mNextID = 0;
-
   private final static float[] mUnity= new float[MAX_UNITY_DIM*NUM_EFFECTS];
   private final static int[]   mUnityDim = new int[NUM_EFFECTS];
 
@@ -85,7 +84,7 @@ public abstract class Effect
 
     mUnityDim[n] = l;
 
-    mID = ((mNextID++)<<EffectType.LENGTH) + mType.ordinal();
+    mID = (InternalStackFrameList.getNextEffectID()<<EffectType.LENGTH) + mType.ordinal();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -96,8 +95,6 @@ public abstract class Effect
  */
   public static void onDestroy()
     {
-    mNextID = 0;
-
     for(int i=0; i<NUM_EFFECTS; i++) mEnabled[i] = false;
 
     MatrixEffect.destroyStatics();
diff --git a/src/main/java/org/distorted/library/main/DistortedEffects.java b/src/main/java/org/distorted/library/main/DistortedEffects.java
index 5c3fd28..e81b26f 100644
--- a/src/main/java/org/distorted/library/main/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/main/DistortedEffects.java
@@ -32,7 +32,6 @@ import org.distorted.library.effect.EffectType;
  */
 public class DistortedEffects
   {
-  private static long mNextID =0;
   private long mID;
   private EffectQueue[] mQueues;
 
@@ -53,7 +52,7 @@ public class DistortedEffects
  */
  public DistortedEffects()
     {
-    mID = ++mNextID;
+    mID = InternalStackFrameList.getNextEffectsID();
     mQueues = new EffectQueue[EffectType.LENGTH];
     EffectQueue.allocateQueues(mQueues,null,0);
     }
@@ -70,7 +69,7 @@ public class DistortedEffects
  */
   public DistortedEffects(DistortedEffects dc, int flags)
     {
-    mID = ++mNextID;
+    mID = InternalStackFrameList.getNextEffectsID();
     mQueues = new EffectQueue[EffectType.LENGTH];
     EffectQueue.allocateQueues(mQueues,dc.getQueues(),flags);
     }
diff --git a/src/main/java/org/distorted/library/main/DistortedLibrary.java b/src/main/java/org/distorted/library/main/DistortedLibrary.java
index 35e6d17..7e1efe6 100644
--- a/src/main/java/org/distorted/library/main/DistortedLibrary.java
+++ b/src/main/java/org/distorted/library/main/DistortedLibrary.java
@@ -1133,7 +1133,6 @@ public class DistortedLibrary
     if( InternalStackFrameList.isInitialized() )
       {
       InternalStackFrameList.onDestroy(id);
-      InternalNodeData.onDestroy();
       InternalMaster.onDestroy();
       InternalOutputSurface.onDestroy();
       EffectQueue.onDestroy();
diff --git a/src/main/java/org/distorted/library/main/InternalNodeData.java b/src/main/java/org/distorted/library/main/InternalNodeData.java
index d6d954a..9cdb58b 100644
--- a/src/main/java/org/distorted/library/main/InternalNodeData.java
+++ b/src/main/java/org/distorted/library/main/InternalNodeData.java
@@ -20,7 +20,6 @@
 package org.distorted.library.main;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
@@ -28,10 +27,7 @@ import java.util.HashMap;
  */
 class InternalNodeData
   {
-  private static HashMap<ArrayList<Long>, InternalNodeData> mMapNodeID = new HashMap<>();
-  private static long mNextNodeID =0;
-
-  private final ArrayList<Long> key;
+  private final ArrayList<Long> mKey;
   private int numPointingNodes;
   private long currTime;
 
@@ -40,54 +36,31 @@ class InternalNodeData
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private InternalNodeData(long id, ArrayList<Long> k)
+  InternalNodeData(long id, ArrayList<Long> k)
     {
     ID              = id;
-    key             = k;
+    mKey            = k;
     numPointingNodes= 1;
     currTime        =-1;
     mFBO            = null;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  static synchronized void onDestroy()
-    {
-    mNextNodeID = 0;
-    mMapNodeID.clear();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  static void debugMap()
-    {
-    InternalNodeData tmp;
-
-    for(ArrayList<Long> key: mMapNodeID.keySet())
-      {
-      tmp = mMapNodeID.get(key);
-      android.util.Log.e("NodeData", "NodeID: "+tmp.ID+" <-- "+key);
-      }
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   static InternalNodeData returnData(ArrayList<Long> list)
     {
-    InternalNodeData newData = mMapNodeID.get(list);
+    InternalNodeData data = InternalStackFrameList.getMapID(list);
 
-    if( newData!=null )
+    if( data!=null )
       {
-      newData.numPointingNodes++;
+      data.numPointingNodes++;
       }
     else
       {
-      newData = new InternalNodeData(++mNextNodeID,list);
-      mMapNodeID.put(list,newData);
+      data = InternalStackFrameList.putNewDataToMap(list);
       }
 
-    return newData;
+    return data;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -96,7 +69,7 @@ class InternalNodeData
     {
     if( --numPointingNodes==0 )
       {
-      mMapNodeID.remove(key);
+      InternalStackFrameList.removeKeyFromMap(mKey);
 
       if( mFBO!=null ) return true;
       }
diff --git a/src/main/java/org/distorted/library/main/InternalStackFrame.java b/src/main/java/org/distorted/library/main/InternalStackFrame.java
index 56a4b1a..7be306c 100644
--- a/src/main/java/org/distorted/library/main/InternalStackFrame.java
+++ b/src/main/java/org/distorted/library/main/InternalStackFrame.java
@@ -21,6 +21,7 @@ package org.distorted.library.main;
 
 import org.distorted.library.effect.EffectType;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
 
@@ -45,15 +46,28 @@ public class InternalStackFrame
   private static long mCommonNextClientID                   = 0;                  // InternalObject
   private static long mCommonNextSystemID                   = 0;                  // (postprocessing)
 
-  private LinkedList<InternalObject> mDoneList; //
-  private HashMap<Long,Job> mToDoMap;           //
-  private long mNextClientID;                   // InternalObject
-  private long mNextSystemID;                   //
-  private long mTaskId;                         //
+  //////////////////////////////////////////////////////////////////
+  private LinkedList<InternalObject> mDoneList;                   //
+  private HashMap<Long,Job> mToDoMap;                             //
+  private long mNextClientID;                                     // InternalObject
+  private long mNextSystemID;                                     //
+  private long mTaskId;                                           //
 
-  private boolean mInitialized;                 // DistortedLibrary
+  //////////////////////////////////////////////////////////////////
+  private boolean mInitialized;                                   // DistortedLibrary
 
-  private int[] mMax;                           // EffectQueue
+  //////////////////////////////////////////////////////////////////
+  private int[] mMax;                                             // EffectQueue
+
+  //////////////////////////////////////////////////////////////////
+  private long mNextEffectsID;                                    // DistortedEffects;
+
+  //////////////////////////////////////////////////////////////////
+  private long mNextEffectID;                                     // Effect;
+
+  //////////////////////////////////////////////////////////////////
+  private HashMap<ArrayList<Long>, InternalNodeData> mMapNodeID;  // InternalNodeData
+  private long mNextNodeID;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -61,8 +75,11 @@ public class InternalStackFrame
     {
     mDoneList     = new LinkedList<>();
     mToDoMap      = new HashMap<>();
+    mMapNodeID    = new HashMap<>();
+    mNextEffectsID= 0;
     mNextClientID = 0;
     mNextSystemID = 0;
+    mNextNodeID   = 0;
     mTaskId       = taskID;
     mMax          = new int[EffectType.LENGTH];
 
@@ -234,6 +251,20 @@ public class InternalStackFrame
     mInitialized = init;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  long getNextEffectsID()
+    {
+    return ++mNextEffectsID;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  long getNextEffectID()
+    {
+    return mNextEffectID++;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getMax(int index)
@@ -254,6 +285,29 @@ public class InternalStackFrame
     return false;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  InternalNodeData getMapID(ArrayList<Long> key)
+    {
+    return mMapNodeID.get(key);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  InternalNodeData putNewDataToMap(ArrayList<Long> key)
+    {
+    InternalNodeData data = new InternalNodeData(++mNextNodeID,key);
+    mMapNodeID.put(key,data);
+    return data;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void removeKeyFromMap(ArrayList<Long> key)
+    {
+    mMapNodeID.remove(key);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   void debugLists(String frameMarker)
@@ -290,4 +344,18 @@ public class InternalStackFrame
       job.object.print(job.action==InternalObject.JOB_CREATE ? " create":" delete");
       }
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void debugMap(String frameMarker)
+    {
+    android.util.Log.e("Object", frameMarker);
+    InternalNodeData tmp;
+
+    for(ArrayList<Long> key: mMapNodeID.keySet())
+      {
+      tmp = mMapNodeID.get(key);
+      android.util.Log.e("NodeData", "NodeID: "+tmp.ID+" <-- "+key);
+      }
+    }
   }
diff --git a/src/main/java/org/distorted/library/main/InternalStackFrameList.java b/src/main/java/org/distorted/library/main/InternalStackFrameList.java
index a1b6bfa..c3bbe15 100644
--- a/src/main/java/org/distorted/library/main/InternalStackFrameList.java
+++ b/src/main/java/org/distorted/library/main/InternalStackFrameList.java
@@ -152,6 +152,21 @@ public class InternalStackFrameList
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @SuppressWarnings("unused")
+  static void debugMap()
+    {
+    int num = mFrameList.size();
+    InternalStackFrame frame;
+
+    for(int i=0; i<num; i++)
+      {
+      frame = mFrameList.get(i);
+      frame.debugMap("frame "+i);
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // must be called from a thread holding OpenGL Context
 
@@ -200,6 +215,13 @@ public class InternalStackFrameList
     return mCurrentFrame;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static long getNextEffectsID()
+    {
+    return mCurrentFrame.getNextEffectsID();
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   static void setInitialized(boolean init)
@@ -207,8 +229,36 @@ public class InternalStackFrameList
     mCurrentFrame.setInitialized(init);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static InternalNodeData getMapID(ArrayList<Long> key)
+    {
+    return mCurrentFrame.getMapID(key);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static InternalNodeData putNewDataToMap(ArrayList<Long> key)
+    {
+    return mCurrentFrame.putNewDataToMap(key);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static void removeKeyFromMap(ArrayList<Long> key)
+    {
+    mCurrentFrame.removeKeyFromMap(key);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static long getNextEffectID()
+    {
+    return mCurrentFrame.getNextEffectID();
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static boolean isInitialized()
