commit c828808dad3221dfcd21dd85e4f521a1d3568a5f
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Tue Jun 6 17:43:41 2017 +0100

    Progress with support for Effect classes.

diff --git a/src/main/java/org/distorted/library/effect/Effect.java b/src/main/java/org/distorted/library/effect/Effect.java
index 4e71f19..080ae83 100644
--- a/src/main/java/org/distorted/library/effect/Effect.java
+++ b/src/main/java/org/distorted/library/effect/Effect.java
@@ -26,7 +26,6 @@ public abstract class Effect
   private final long mID;
   private final int mType;
   private final int mName;
-  private final float[] mUnity;
   private final int mDimension;
   private final boolean mSupportsR;
   private final boolean mSupportsC;
@@ -102,13 +101,12 @@ public abstract class Effect
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  Effect(int type, int name, float[] unity, int dimension, boolean center, boolean region)
+  Effect(int type, int name, int dimension, boolean center, boolean region)
     {
     mID        = mNextID++;
 
     mName      = name;
     mType      = type;
-    mUnity     = unity;
     mDimension = dimension;
     mSupportsC = center;
     mSupportsR = region;
diff --git a/src/main/java/org/distorted/library/effect/FragmentEffect.java b/src/main/java/org/distorted/library/effect/FragmentEffect.java
index 875c1b1..fd3faa2 100644
--- a/src/main/java/org/distorted/library/effect/FragmentEffect.java
+++ b/src/main/java/org/distorted/library/effect/FragmentEffect.java
@@ -27,27 +27,61 @@ import org.distorted.library.type.Static;
 
 public abstract class FragmentEffect extends Effect
   {
-  static final int MAX = 5;
+  public static final int CHROMA            = 0;
+  public static final int SMOOTH_CHROMA     = 1;
+  public static final int ALPHA             = 2;
+  public static final int SMOOTH_ALPHA      = 3;
+  public static final int BRIGHTNESS        = 4;
+  public static final int SMOOTH_BRIGHTNESS = 5;
+  public static final int CONTRAST          = 6;
+  public static final int SMOOTH_CONTRAST   = 7;
+  public static final int SATURATION        = 8;
+  public static final int SMOOTH_SATURATION = 9;
+  public static final int NUM_EFFECTS       =10;
 
-  public static int CHROMA            = 0;
-  public static int SMOOTH_CHROMA     = 1;
-  public static int ALPHA             = 2;
-  public static int SMOOTH_ALPHA      = 3;
-  public static int BRIGHTNESS        = 4;
-  public static int SMOOTH_BRIGHTNESS = 5;
-  public static int CONTRAST          = 6;
-  public static int SMOOTH_CONTRAST   = 7;
-  public static int SATURATION        = 8;
-  public static int SMOOTH_SATURATION = 9;
+  static final int MAX = 5;
+  private static final int MAX_UNITY_DIM = 1;
 
   Dynamic mDynamic0, mDynamic1;
   Static mStatic0, mStatic1;
   Data4D mRegion;
 
+  private final static float[] mUnity    = new float[MAX_UNITY_DIM*NUM_EFFECTS];
+  private final static int[]   mUnityDim = new int[NUM_EFFECTS];
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public FragmentEffect(int name,float[] unity, int dimension, boolean center, boolean region)
     {
-    super(FRAGMENT,name,unity,dimension,center,region);
+    super(FRAGMENT,name,dimension,center,region);
+
+    for(int i=0; i<unity.length; i++)
+      {
+      mUnity[name*MAX_UNITY_DIM+i] = unity[i];
+      }
+
+    mUnityDim[name] = unity.length;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static boolean isUnity(int name, float[] buffer, int index)
+    {
+    switch(mUnityDim[name])
+      {
+      case 0: return true;
+      case 1: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ];
+      case 2: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1];
+      case 3: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1] &&
+                     buffer[index+2]==mUnity[MAX_UNITY_DIM*name+2];
+      case 4: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1] &&
+                     buffer[index+2]==mUnity[MAX_UNITY_DIM*name+2] &&
+                     buffer[index+3]==mUnity[MAX_UNITY_DIM*name+3];
+      }
+
+    return false;
     }
   }
\ No newline at end of file
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffect.java b/src/main/java/org/distorted/library/effect/MatrixEffect.java
index 6187351..5e68345 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffect.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffect.java
@@ -25,22 +25,56 @@ import org.distorted.library.type.*;
 
 public abstract class MatrixEffect extends Effect
   {
-  static final int MAX = 10;
-
   public static final int MOVE       = 0;
   public static final int SCALE      = 1;
   public static final int ROTATE     = 2;
   public static final int QUATERNION = 3;
   public static final int SHEAR      = 4;
+  public static final int NUM_EFFECTS= 5;
+
+  static final int MAX = 5;
+  private static final int MAX_UNITY_DIM = 3;
 
   Dynamic mDynamic0;
   Static  mStatic0, mStatic1;
   Data3D mCenter;
 
+  private final static float[] mUnity= new float[MAX_UNITY_DIM*NUM_EFFECTS];
+  private final static int[]   mUnityDim = new int[NUM_EFFECTS];
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public MatrixEffect(int name, float[] unity, int dimension, boolean center, boolean region)
     {
-    super(MATRIX,name,unity,dimension,center,region);
+    super(MATRIX,name,dimension,center,region);
+
+    for(int i=0; i<unity.length; i++)
+      {
+      mUnity[name*MAX_UNITY_DIM+i] = unity[i];
+      }
+
+    mUnityDim[name] = unity.length;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static boolean isUnity(int name, float[] buffer, int index)
+    {
+    switch(mUnityDim[name])
+      {
+      case 0: return true;
+      case 1: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ];
+      case 2: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1];
+      case 3: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1] &&
+                     buffer[index+2]==mUnity[MAX_UNITY_DIM*name+2];
+      case 4: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1] &&
+                     buffer[index+2]==mUnity[MAX_UNITY_DIM*name+2] &&
+                     buffer[index+3]==mUnity[MAX_UNITY_DIM*name+3];
+      }
+
+    return false;
     }
   }
diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffect.java b/src/main/java/org/distorted/library/effect/PostprocessEffect.java
index 497f0ae..1b10d48 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffect.java
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffect.java
@@ -26,18 +26,52 @@ import org.distorted.library.type.Static;
 
 public abstract class PostprocessEffect extends Effect
   {
-  static final int MAX = 5;
+  public static final int BLUR       =0;
+  public static final int GLOW       =1;
+  public static final int NUM_EFFECTS=2;
 
-  public static int BLUR = 0;
-  public static int GLOW = 1;
+  static final int MAX = 5;
+  private static final int MAX_UNITY_DIM = 1;
 
   Dynamic mDynamic0, mDynamic1;
   Static mStatic0, mStatic1;
 
+  private final static float[] mUnity= new float[MAX_UNITY_DIM*NUM_EFFECTS];
+  private final static int[]   mUnityDim = new int[NUM_EFFECTS];
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public PostprocessEffect(int name, float[] unity, int dimension, boolean center, boolean region)
     {
-    super(POSTPROCESS,name,unity,dimension,center,region);
+    super(POSTPROCESS,name,dimension,center,region);
+
+    for(int i=0; i<unity.length; i++)
+      {
+      mUnity[name*MAX_UNITY_DIM+i] = unity[i];
+      }
+
+    mUnityDim[name] = unity.length;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static boolean isUnity(int name, float[] buffer, int index)
+    {
+    switch(mUnityDim[name])
+      {
+      case 0: return true;
+      case 1: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ];
+      case 2: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1];
+      case 3: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1] &&
+                     buffer[index+2]==mUnity[MAX_UNITY_DIM*name+2];
+      case 4: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1] &&
+                     buffer[index+2]==mUnity[MAX_UNITY_DIM*name+2] &&
+                     buffer[index+3]==mUnity[MAX_UNITY_DIM*name+3];
+      }
+
+    return false;
     }
   }
\ No newline at end of file
diff --git a/src/main/java/org/distorted/library/effect/VertexEffect.java b/src/main/java/org/distorted/library/effect/VertexEffect.java
index 67a611b..8f03194 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffect.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffect.java
@@ -28,24 +28,58 @@ import org.distorted.library.type.Static;
 
 public abstract class VertexEffect extends Effect
   {
-  static final int MAX = 5;
+  public static final int DISTORT    =0;
+  public static final int DEFORM     =1;
+  public static final int SINK       =2;
+  public static final int PINCH      =3;
+  public static final int SWIRL      =4;
+  public static final int WAVE       =5;
+  public static final int NUM_EFFECTS=6;
 
-  public static int DISTORT = 0;
-  public static int DEFORM  = 1;
-  public static int SINK    = 2;
-  public static int PINCH   = 3;
-  public static int SWIRL   = 4;
-  public static int WAVE    = 5;
+  static final int MAX = 5;
+  private static final int MAX_UNITY_DIM = 3;
 
   Dynamic mDynamic0;
   Static mStatic0;
   Data3D mCenter;
   Data4D mRegion;
 
+  private final static float[] mUnity= new float[MAX_UNITY_DIM*NUM_EFFECTS];
+  private final static int[]   mUnityDim = new int[NUM_EFFECTS];
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public VertexEffect(int name, float[] unity, int dimension, boolean center, boolean region)
     {
-    super(VERTEX,name,unity,dimension,center,region);
+    super(VERTEX,name,dimension,center,region);
+
+    for(int i=0; i<unity.length; i++)
+      {
+      mUnity[name*MAX_UNITY_DIM+i] = unity[i];
+      }
+
+    mUnityDim[name] = unity.length;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static boolean isUnity(int name, float[] buffer, int index)
+    {
+    switch(mUnityDim[name])
+      {
+      case 0: return true;
+      case 1: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ];
+      case 2: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1];
+      case 3: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1] &&
+                     buffer[index+2]==mUnity[MAX_UNITY_DIM*name+2];
+      case 4: return buffer[index  ]==mUnity[MAX_UNITY_DIM*name  ] &&
+                     buffer[index+1]==mUnity[MAX_UNITY_DIM*name+1] &&
+                     buffer[index+2]==mUnity[MAX_UNITY_DIM*name+2] &&
+                     buffer[index+3]==mUnity[MAX_UNITY_DIM*name+3];
+      }
+
+    return false;
     }
   }
\ No newline at end of file
