commit 8dfa45c49a10f1aa8accfc9f0d07681333535c94
Author: leszek <leszek@koltunski.pl>
Date:   Sun Jun 11 23:07:14 2017 +0100

    Some progress with Effect classes.
    
    10 apps compile now.

diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
index 08b2e55..d2c6287 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
@@ -27,13 +27,16 @@ import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.examples.R;
 
+import org.distorted.library.effect.EffectName;
+import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.effect.VertexEffectDistort;
+import org.distorted.library.effect.VertexEffectSink;
 import org.distorted.library.main.Distorted;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.main.DistortedEffects;
-import org.distorted.library.EffectNames;
 import org.distorted.library.main.MeshFlat;
-import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
@@ -55,7 +58,9 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
    private MeshFlat mMesh;
    private DistortedScreen mScreen;
    private int bmpHeight, bmpWidth;
-    
+   private Static3D mScale;
+   private Static3D[] mMove;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    DifferentBitmapsRenderer(GLSurfaceView v)
@@ -74,8 +79,24 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
 
       // Add the effects only to the first queue - all VERTEX and FRAGMENT effects are shared!
       // (Matrix effect cannot be shared as we have to display each Texture in a different location)
-      mEffects[0].sink( new Static1D(8), mPoint, new Static4D(0,0,80,80));  // enlarge the nose
-      mEffects[0].distort(dDistort,mPoint);                                 // keep moving the whole bitmap left and right.
+      VertexEffectSink sink = new VertexEffectSink(new Static1D(8), mPoint, new Static4D(0,0,80,80));
+      VertexEffectDistort distort = new VertexEffectDistort(dDistort,mPoint);
+      mEffects[0].apply(sink);    // enlarge the nose
+      mEffects[0].apply(distort); // keep moving the whole bitmap left and right.
+
+      // Now the Matrix effects
+      mScale = new Static3D(1,1,1);
+      MatrixEffectScale scaleEffect = new MatrixEffectScale(mScale);
+      mMove  = new Static3D[NUM];
+      MatrixEffectMove[] moveEffect = new MatrixEffectMove[NUM];
+
+      for(int i=0; i<NUM; i++)
+        {
+        mMove[i] = new Static3D(0,0,0);
+        moveEffect[i] = new MatrixEffectMove(mMove[i]);
+        mEffects[i].apply(moveEffect[i]);
+        mEffects[i].apply(scaleEffect);
+        }
 
       mScreen = new DistortedScreen(mView);
       mScreen.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
@@ -114,21 +135,16 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
-      {  
-      for(int i=NUM-1; i>=0; i--) 
-        {   
-        mEffects[i].abortEffects(EffectTypes.MATRIX);
-        }
-      
+      {
       if( (float)bmpHeight/(NUM*bmpWidth) > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
+        mScale.set(factor,factor,factor);
 
         for(int i=NUM-1; i>=0; i--) 
           {
-          mEffects[i].move( new Static3D((width-NUM*w)/2 +i*w ,0,0) );
-          mEffects[i].scale(factor);
+          mMove[i].set((width-NUM*w)/2 +i*w ,0,0);
           }
         }
       else
@@ -136,14 +152,15 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
         int w = width/NUM;  
         int h = (width*bmpHeight)/(bmpWidth*NUM);
         float factor = (float)width/(bmpWidth*NUM);
+        mScale.set(factor,factor,factor);
 
         for(int i=NUM-1; i>=0; i--) 
           {
-          mEffects[i].move( new Static3D(i*w,(height-h)/2,0) );
-          mEffects[i].scale(factor);
+          mMove[i].set(i*w,(height-h)/2,0);
           }
         }
-         
+
+
       mScreen.resize(width, height);
       }
 
@@ -175,8 +192,8 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
       mScreen.detachAll();
       for(int i=NUM-1; i>=0; i--) mScreen.attach(mTexture[i], mEffects[i], mMesh);
 
-      DistortedEffects.enableEffect(EffectNames.SINK);
-      DistortedEffects.enableEffect(EffectNames.DISTORT);
+      DistortedEffects.enableEffect(EffectName.SINK);
+      DistortedEffects.enableEffect(EffectName.DISTORT);
 
       try
         {
diff --git a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
index 6608169..4532251 100644
--- a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
@@ -27,13 +27,17 @@ import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.examples.R;
 
+import org.distorted.library.effect.EffectName;
+import org.distorted.library.effect.FragmentEffectChroma;
+import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.effect.VertexEffectDistort;
+import org.distorted.library.effect.VertexEffectSink;
 import org.distorted.library.main.Distorted;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedScreen;
-import org.distorted.library.EffectNames;
 import org.distorted.library.main.MeshFlat;
 import org.distorted.library.main.DistortedTexture;
-import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static1D;
@@ -56,7 +60,9 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
    private MeshFlat mMesh;
    private DistortedScreen mScreen;
    private int bmpHeight, bmpWidth;
-    
+   private Static3D mScale;
+   private Static3D[] mMove;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    DifferentEffectsRenderer(GLSurfaceView v)
@@ -84,15 +90,33 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
       sink.add(new Static1D( 1));
       sink.add(new Static1D(10));
 
-      mEffects[0].sink(sink, pLeft, RegionEye);
-      mEffects[0].sink(sink, pRight,RegionEye);
-      mEffects[1].distort(dyn, pNose1);
+      VertexEffectSink sinkL = new VertexEffectSink(sink, pLeft , RegionEye);
+      VertexEffectSink sinkR = new VertexEffectSink(sink, pRight, RegionEye);
+      VertexEffectDistort distort = new VertexEffectDistort(dyn,pNose1);
+
+      mEffects[0].apply(sinkL);
+      mEffects[0].apply(sinkR);
+      mEffects[1].apply(distort);
 
       Dynamic1D chromaDyn = new Dynamic1D(3000,0.0f);
       chromaDyn.add(new Static1D(0));
       chromaDyn.add(new Static1D(1));
 
-      mEffects[2].chroma(chromaDyn, new Static3D(0,1,0) );
+      FragmentEffectChroma chroma = new FragmentEffectChroma(chromaDyn, new Static3D(0,1,0));
+      mEffects[2].apply(chroma);
+
+      mScale = new Static3D(1,1,1);
+      MatrixEffectScale scaleEffect = new MatrixEffectScale(mScale);
+      mMove  = new Static3D[NUM];
+      MatrixEffectMove[] moveEffect = new MatrixEffectMove[NUM];
+
+      for(int i=0; i<NUM; i++)
+        {
+        mMove[i] = new Static3D(0,0,0);
+        moveEffect[i] = new MatrixEffectMove(mMove[i]);
+        mEffects[i].apply(moveEffect[i]);
+        mEffects[i].apply(scaleEffect);
+        }
 
       mScreen = new DistortedScreen(mView);
       }
@@ -108,32 +132,28 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
     
    public void onSurfaceChanged(GL10 glUnused, int width, int height)
      {
-     for(int i=NUM-1; i>=0; i--)
-       {
-       mEffects[i].abortEffects(EffectTypes.MATRIX);
-       }
-      
      if( (float)bmpHeight/(NUM*bmpWidth) > (float)height/width )
        {
        int w = (height*bmpWidth)/bmpHeight;
        float factor = (float)height/bmpHeight;
+       mScale.set(factor,factor,factor);
 
        for(int i=NUM-1; i>=0; i--)
          {
-         mEffects[i].move( new Static3D((width-NUM*w)/2 +i*w , 0, 0) );
-         mEffects[i].scale(factor);
+         mMove[i].set((width-NUM*w)/2 +i*w , 0, 0);
          }
+
        }
      else
        {
        int w = width/NUM;
        int h = (width*bmpHeight)/(bmpWidth*NUM);
        float factor = (float)width/(bmpWidth*NUM);
+       mScale.set(factor,factor,factor);
 
        for(int i=NUM-1; i>=0; i--)
          {
-         mEffects[i].move( new Static3D(i*w, (height-h)/2, 0) );
-         mEffects[i].scale(factor);
+         mMove[i].set(i*w, (height-h)/2, 0);
          }
        }
        
@@ -170,9 +190,9 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
      mScreen.detachAll();
      for(int i=NUM-1; i>=0; i--) mScreen.attach(mTexture, mEffects[i], mMesh);
 
-     DistortedEffects.enableEffect(EffectNames.SINK);
-     DistortedEffects.enableEffect(EffectNames.DISTORT);
-     DistortedEffects.enableEffect(EffectNames.CHROMA);
+     DistortedEffects.enableEffect(EffectName.SINK);
+     DistortedEffects.enableEffect(EffectName.DISTORT);
+     DistortedEffects.enableEffect(EffectName.CHROMA);
 
      try
        {
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
index a6e0bb6..6df918e 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
@@ -19,10 +19,11 @@
 
 package org.distorted.examples.effectqueue;
 
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.EffectName;
+import org.distorted.library.effect.EffectType;
 import org.distorted.library.main.Distorted;
 import org.distorted.examples.R;
-import org.distorted.library.EffectNames;
-import org.distorted.library.EffectTypes;
 
 import android.app.Activity;
 import android.opengl.GLSurfaceView;
@@ -44,12 +45,12 @@ import java.util.HashMap;
 public class EffectQueueActivity extends Activity implements AdapterView.OnItemSelectedListener
   {
   private Spinner mAdd, mID, mName, mType;
-  private static ArrayAdapter<Long> mAdapterID;
+  private static ArrayAdapter<Effect> mAdapterID;
 
   private int mPosID, mPosName, mPosType;
   private TableLayout mLayoutList;
 
-  private HashMap<Long,TableRow> mMap = new HashMap<>();
+  private HashMap<Effect,TableRow> mMap = new HashMap<>();
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -74,7 +75,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
     mName.setOnItemSelectedListener(this);
     mType.setOnItemSelectedListener(this);
 
-    ArrayList<Long> itemsID  = new ArrayList<>();
+    ArrayList<Effect> itemsEffect  = new ArrayList<>();
 
     String[] itemsName = new String[] { getText(R.string.distort   ).toString(),
                                         getText(R.string.sink      ).toString(),
@@ -84,7 +85,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
 
     String[] itemsType = new String[] {"VERTEX", "FRAGMENT"};
 
-    mAdapterID = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, itemsID);
+    mAdapterID = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, itemsEffect);
     mAdapterID.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
     mID.setAdapter(mAdapterID);
 
@@ -169,9 +170,9 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
     {
     try
       {
-      Long currID = (Long)mID.getItemAtPosition(mPosID);
+      Effect currEffect = (Effect)mID.getItemAtPosition(mPosID);
       EffectQueueSurfaceView v = (EffectQueueSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
-      v.getRenderer().getEffects().abortEffect(currID);
+      v.getRenderer().getEffects().abortEffect(currEffect);
       }
     catch(IndexOutOfBoundsException ex)
       {
@@ -183,63 +184,63 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
 
   public void removeByName(View view)
     {
-    EffectNames name;
+    EffectName name;
 
     switch(mPosName)
       {
-      case  0: name = EffectNames.DISTORT      ; break;
-      case  1: name = EffectNames.SINK         ; break;
-      case  2: name = EffectNames.SMOOTH_ALPHA ; break;
-      case  3: name = EffectNames.SATURATION   ; break;
-      case  4: name = EffectNames.SMOOTH_CHROMA; break;
-      default: name = EffectNames.CONTRAST     ;
+      case  0: name = EffectName.DISTORT      ; break;
+      case  1: name = EffectName.SINK         ; break;
+      case  2: name = EffectName.SMOOTH_ALPHA ; break;
+      case  3: name = EffectName.SATURATION   ; break;
+      case  4: name = EffectName.SMOOTH_CHROMA; break;
+      default: name = EffectName.CONTRAST     ;
       }
 
     EffectQueueSurfaceView v = (EffectQueueSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
-    v.getRenderer().getEffects().abortEffects(name);
+    v.getRenderer().getEffects().abortByName(name);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void removeByType(View view)
     {
-    EffectTypes type;
+    EffectType type;
 
     switch(mPosType)
       {
-      case  0: type = EffectTypes.VERTEX  ; break;
-      case  1: type = EffectTypes.FRAGMENT; break;
-      default: type = EffectTypes.MATRIX;
+      case  0: type = EffectType.VERTEX  ; break;
+      case  1: type = EffectType.FRAGMENT; break;
+      default: type = EffectType.MATRIX;
       }
 
     EffectQueueSurfaceView v = (EffectQueueSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
-    v.getRenderer().getEffects().abortEffects(type);
+    v.getRenderer().getEffects().abortByType(type);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void effectAdded(final long id, final EffectNames name, final EffectTypes type)
+  public void effectAdded(boolean success, final Effect effect)
     {
-    if( id>=0 )  // we really added a new effect
+    if( success )  // we really added a new effect
       {
-      mAdapterID.add(id);
+      mAdapterID.add(effect);
       mAdapterID.notifyDataSetChanged();
 
       TableRow tr = new TableRow(this);
       tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
 
       TextView b1 = new TextView(this);
-      b1.setText("ID: "+id);
+      b1.setText("ID: "+effect.getID());
       b1.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
       tr.addView(b1);
 
       TextView b2 = new TextView(this);
-      b2.setText(name.name());
+      b2.setText(effect.getName().name());
       b2.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
       tr.addView(b2);
 
       TextView b3 = new TextView(this);
-      b3.setText(type.name());
+      b3.setText(effect.getType().name());
       b3.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
       tr.addView(b3);
 
@@ -248,7 +249,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
       b4.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
       tr.addView(b4);
 
-      mMap.put(id,tr);
+      mMap.put(effect,tr);
 
       mLayoutList.addView(tr, new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT));
       }
@@ -260,16 +261,16 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void effectRemoved(final long id)
+  public void effectRemoved(final Effect effect)
     {
     runOnUiThread(new Runnable()
       {
       public void run()
         {
-        mAdapterID.remove(id);
+        mAdapterID.remove(effect);
         mAdapterID.notifyDataSetChanged();
 
-        TableRow row = mMap.remove(id);
+        TableRow row = mMap.remove(effect);
 
         if( row!=null )
           {
@@ -277,7 +278,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
           }
         else
           {
-          android.util.Log.e("EFFECTS2D", "Impossible: id="+id+" not in the map!");
+          android.util.Log.e("EFFECTS2D", "Impossible: id="+effect.getID()+" not in the map!");
           }
         }
       });
@@ -285,13 +286,13 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void effectFinished(final long id)
+  public void effectFinished(final Effect effect)
     {
     runOnUiThread(new Runnable()
       {
       public void run()
         {
-        TableRow row = mMap.get(id);
+        TableRow row = mMap.get(effect);
 
         if( row!=null )
           {
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
index 76830b5..454cc7c 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
@@ -28,13 +28,13 @@ import android.graphics.Paint;
 import android.graphics.Paint.Style;
 import android.opengl.GLSurfaceView;
 
+import org.distorted.library.effect.EffectName;
+import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.MeshFlat;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.main.Distorted;
-import org.distorted.library.EffectNames;
-import org.distorted.library.EffectTypes;
 import org.distorted.library.message.EffectListener;
 import org.distorted.library.message.EffectMessage;
 import org.distorted.library.type.Static3D;
@@ -50,6 +50,7 @@ class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
   private EffectQueueSurfaceView mView;
   private Paint mPaint;
   private int texWidth, texHeight;
+  private Static3D mScale;
 
   private DistortedTexture mTexture;
   private MeshFlat mMesh;
@@ -69,11 +70,13 @@ class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
       
     texWidth = BWID;
     texHeight= BHEI;
+    mScale = new Static3D(1,1,1);
+    MatrixEffectScale scaleEffect = new MatrixEffectScale(mScale);
 
     mMesh = new MeshFlat(80,80*texHeight/texWidth);
     mTexture = new DistortedTexture(texWidth,texHeight);
     mEffects = new DistortedEffects();
-
+    mEffects.apply(scaleEffect);
     mEffects.registerForMessages(this);
 
     mScreen = new DistortedScreen(mView);
@@ -107,11 +110,11 @@ class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
     mScreen.detachAll();
     mScreen.attach(mTexture,mEffects,mMesh);
 
-    DistortedEffects.enableEffect(EffectNames.DISTORT);
-    DistortedEffects.enableEffect(EffectNames.SINK);
-    DistortedEffects.enableEffect(EffectNames.SMOOTH_ALPHA);
-    DistortedEffects.enableEffect(EffectNames.SATURATION);
-    DistortedEffects.enableEffect(EffectNames.SMOOTH_CHROMA);
+    DistortedEffects.enableEffect(EffectName.DISTORT);
+    DistortedEffects.enableEffect(EffectName.SINK);
+    DistortedEffects.enableEffect(EffectName.SMOOTH_ALPHA);
+    DistortedEffects.enableEffect(EffectName.SATURATION);
+    DistortedEffects.enableEffect(EffectName.SMOOTH_CHROMA);
 
     try
       {
@@ -127,8 +130,7 @@ class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
 
   public void onSurfaceChanged(GL10 glUnused, int width, int height)
     {
-    mEffects.abortEffects(EffectTypes.MATRIX);
-    mEffects.scale( new Static3D((float)width/texWidth,(float)height/texHeight,1) );
+    mScale.set((float)width/texWidth,(float)height/texHeight,1);
     mScreen.resize(width,height);
     mView.setScreenSize(width,height);
     }
@@ -143,7 +145,7 @@ class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // the library sending messages to us. This is running on a library 'MessageSender' thread.
 
-  public void effectMessage(final EffectMessage em, final long effectID, final EffectNames effectName, final long objectID)
+  public void effectMessage(final EffectMessage em, final long effectID, final long objectID)
     {
     EffectQueueActivity act = (EffectQueueActivity)mView.getContext();
 
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
index 6a16433..742e4e8 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
@@ -24,8 +24,13 @@ import android.opengl.GLSurfaceView;
 import android.view.MotionEvent;
 import android.util.AttributeSet;
 
-import org.distorted.library.EffectNames;
-import org.distorted.library.EffectTypes;
+import org.distorted.library.effect.EffectName;
+import org.distorted.library.effect.EffectType;
+import org.distorted.library.effect.FragmentEffectAlpha;
+import org.distorted.library.effect.FragmentEffectChroma;
+import org.distorted.library.effect.FragmentEffectSaturation;
+import org.distorted.library.effect.VertexEffectDistort;
+import org.distorted.library.effect.VertexEffectSink;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
@@ -123,9 +128,8 @@ public class EffectQueueSurfaceView extends GLSurfaceView
     
   @Override public boolean onTouchEvent(MotionEvent event) 
     {
-    int action = event.getAction();
-    int x, y;
-    long id;
+    int x,y,action = event.getAction();
+    boolean success;
 
     switch(action)
       {
@@ -137,20 +141,25 @@ public class EffectQueueSurfaceView extends GLSurfaceView
 
                                     switch(mCurrentEffect)
                                       {
-                                      case 0: id = mRenderer.getEffects().distort(mInterD, mPoint, mRegionV);
-                                              act.effectAdded(id, EffectNames.DISTORT, EffectTypes.VERTEX);
+                                      case 0: VertexEffectDistort distort = new VertexEffectDistort(mInterD, mPoint, mRegionV);
+                                              success = mRenderer.getEffects().apply(distort);
+                                              act.effectAdded(success,distort);
                                               break;
-                                      case 1: id = mRenderer.getEffects().sink(mInterS, mPoint, mRegionV);
-                                              act.effectAdded(id, EffectNames.SINK, EffectTypes.VERTEX);
+                                      case 1: VertexEffectSink sink = new VertexEffectSink(mInterS, mPoint, mRegionV);
+                                              success = mRenderer.getEffects().apply(sink);
+                                              act.effectAdded(success,sink);
                                               break;
-                                      case 2: id = mRenderer.getEffects().alpha(mInterA, mRegionF, true);
-                                              act.effectAdded(id, EffectNames.ALPHA, EffectTypes.FRAGMENT);
+                                      case 2: FragmentEffectAlpha alpha = new FragmentEffectAlpha(mInterA, mRegionF, true);
+                                              success = mRenderer.getEffects().apply(alpha);
+                                              act.effectAdded(success,alpha);
                                               break;
-                                      case 3: id = mRenderer.getEffects().saturation(mInterB, mRegionF, false);
-                                              act.effectAdded(id, EffectNames.SATURATION, EffectTypes.FRAGMENT);
+                                      case 3: FragmentEffectSaturation saturation = new FragmentEffectSaturation(mInterB, mRegionF, false);
+                                              success = mRenderer.getEffects().apply(saturation);
+                                              act.effectAdded(success,saturation);
                                               break;
-                                      case 4: id = mRenderer.getEffects().chroma(mInterC, mRED, mRegionF, true);
-                                              act.effectAdded(id, EffectNames.CHROMA, EffectTypes.FRAGMENT);
+                                      case 4: FragmentEffectChroma chroma = new FragmentEffectChroma(mInterC, mRED, mRegionF, true);
+                                              success = mRenderer.getEffects().apply(chroma);
+                                              act.effectAdded(success,chroma);
                                               break;
                                       }
 
diff --git a/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java b/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java
index e136219..f77beb4 100644
--- a/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java
+++ b/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java
@@ -36,8 +36,6 @@ import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.MeshCubes;
 import org.distorted.library.main.MeshObject;
 import org.distorted.library.main.DistortedTexture;
-import org.distorted.library.EffectNames;
-import org.distorted.library.EffectTypes;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
index 98ef941..d1a4870 100644
--- a/src/main/java/org/distorted/examples/save/SaveRenderer.java
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -30,14 +30,14 @@ import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.examples.R;
 
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.VertexEffectSink;
 import org.distorted.library.main.Distorted;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.DistortedTexture;
-import org.distorted.library.EffectNames;
 import org.distorted.library.main.MeshFlat;
 import org.distorted.library.main.DistortedFramebuffer;
-import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static1D;
@@ -155,7 +155,7 @@ class SaveRenderer implements GLSurfaceView.Renderer
 
     if( isSaving )  // render to an offscreen buffer and read pixels
       {
-      mEffects.abortEffects(EffectTypes.MATRIX);
+      mEffects.abortByType(Effect.MATRIX);
       mEffects.scale(mScaleFactor);
       mOffscreen.render(time);
       applyMatrixEffects(scrWidth,scrHeight);
@@ -188,7 +188,7 @@ class SaveRenderer implements GLSurfaceView.Renderer
 
   private void applyMatrixEffects(int width, int height)
     {
-    mEffects.abortEffects(EffectTypes.MATRIX);
+    mEffects.abortByType(Effect.MATRIX);
 
     if( (float)bmpHeight/bmpWidth > (float)height/width )
       {
@@ -254,7 +254,7 @@ class SaveRenderer implements GLSurfaceView.Renderer
     mScreen.detachAll();
     mScreen.attach(mTexture,mEffects,mMesh);
 
-    DistortedEffects.enableEffect(EffectNames.SINK);
+    DistortedEffects.enableEffect(org.distorted.library.effect.VertexEffectSink.class);
 
     try
       {
