commit 2890c5df6fec6fc4f89df08854695755f409bf36
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Mon Jun 12 11:15:12 2017 +0100

    Further progress with Apps.

diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java b/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
index 15956aa..f49d471 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
@@ -44,8 +44,6 @@ import org.distorted.library.main.MeshFlat;
 import org.distorted.library.main.MeshObject;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.main.DistortedEffects;
-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/flag/FlagRenderer.java b/src/main/java/org/distorted/examples/flag/FlagRenderer.java
index 20f882f..1e3ceae 100644
--- a/src/main/java/org/distorted/examples/flag/FlagRenderer.java
+++ b/src/main/java/org/distorted/examples/flag/FlagRenderer.java
@@ -24,16 +24,18 @@ import android.graphics.BitmapFactory;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
+import org.distorted.library.effect.EffectName;
+import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.effect.MatrixEffectQuaternion;
+import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.effect.VertexEffectWave;
 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.MeshCubes;
 import org.distorted.library.main.DistortedTexture;
-import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic;
 import org.distorted.library.type.Dynamic5D;
-import org.distorted.library.type.DynamicQuat;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 import org.distorted.library.type.Static5D;
@@ -52,10 +54,10 @@ class FlagRenderer implements GLSurfaceView.Renderer
     private DistortedEffects mEffects;
     private DistortedTexture mTexture;
     private DistortedScreen mScreen;
-    private DynamicQuat mQuatInt1, mQuatInt2;
     private Dynamic5D mWaveDyn;
     private Static5D mWaveSta1, mWaveSta2;
     private int mObjWidth, mObjHeight;
+    private Static3D mMove, mScale, mCenter;
 
     Static4D mQuat1, mQuat2;
     int mScreenMin;
@@ -83,16 +85,19 @@ class FlagRenderer implements GLSurfaceView.Renderer
       mQuat1 = new Static4D(           0,         0,           0,          1);  // unity quaternion
       mQuat2 = new Static4D(-0.25189602f,0.3546389f,0.009657208f,0.90038127f);  // something semi-random that looks good
 
-      mQuatInt1 = new DynamicQuat(0,0.5f);
-      mQuatInt2 = new DynamicQuat(0,0.5f);
-
-      mQuatInt1.add(mQuat1);
-      mQuatInt2.add(mQuat2);
-
       Static3D waveCenter = new Static3D(mObjWidth, mObjHeight/2, 0);  // middle of the right edge
       Static4D waveRegion = new Static4D(0,0,mObjWidth,mObjWidth);
 
-      mEffects.wave(mWaveDyn, waveCenter, waveRegion);
+      mEffects.apply( new VertexEffectWave(mWaveDyn, waveCenter, waveRegion) );
+
+      mMove  = new Static3D(0,0,0);
+      mScale = new Static3D(1,1,1);
+      mCenter= new Static3D(0,0,0);
+
+      mEffects.apply( new MatrixEffectMove(mMove));
+      mEffects.apply( new MatrixEffectScale(mScale));
+      mEffects.apply( new MatrixEffectQuaternion(mQuat1, mCenter) );
+      mEffects.apply( new MatrixEffectQuaternion(mQuat2, mCenter) );
 
       mScreen = new DistortedScreen(mView);
       mScreen.attach(mTexture,mEffects, new MeshCubes(50,30,1) );
@@ -149,26 +154,10 @@ class FlagRenderer implements GLSurfaceView.Renderer
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       {
       mScreenMin = width<height ? width:height;
-    	
-      mEffects.abortEffects(EffectTypes.MATRIX);
-      float factor;
-
-      if( width*mObjHeight > height*mObjWidth ) // screen is more 'horizontal' than the Object
-        {
-        factor = (0.8f*height)/mObjHeight;
-        }
-      else
-        {
-        factor = (0.8f*width)/mObjWidth;
-        }
-
-      mEffects.move( new Static3D( (width-factor*mObjWidth)/2 , (height-factor*mObjHeight)/2 , 0) );
-      mEffects.scale(factor);
-      Static3D center = new Static3D(mObjWidth/2,mObjHeight/2, 0);
-
-      mEffects.quaternion(mQuatInt1, center);
-      mEffects.quaternion(mQuatInt2, center);
-       
+      float factor = ( width*mObjHeight > height*mObjWidth ) ? (0.8f*height)/mObjHeight : (0.8f*width)/mObjWidth;
+      mMove.set((width-factor*mObjWidth)/2 , (height-factor*mObjHeight)/2 , 0);
+      mScale.set(factor,factor,factor);
+      mCenter.set(mObjWidth/2,mObjHeight/2, 0);
       mScreen.resize(width, height);
       }
 
@@ -194,7 +183,7 @@ class FlagRenderer implements GLSurfaceView.Renderer
       
       mTexture.setTexture(bitmap);
 
-      DistortedEffects.enableEffect(EffectNames.WAVE);
+      DistortedEffects.enableEffect(EffectName.WAVE);
 
       try
         {
diff --git a/src/main/java/org/distorted/examples/girl/GirlRenderer.java b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
index 8d66a80..48d7037 100644
--- a/src/main/java/org/distorted/examples/girl/GirlRenderer.java
+++ b/src/main/java/org/distorted/examples/girl/GirlRenderer.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.MatrixEffectMove;
+import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.effect.VertexEffectDistort;
+import org.distorted.library.effect.VertexEffectSink;
+import org.distorted.library.effect.VertexEffectSwirl;
 import org.distorted.library.main.Distorted;
 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.main.DistortedEffects;
-import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static1D;
@@ -56,6 +60,7 @@ class GirlRenderer implements GLSurfaceView.Renderer
     private Static3D v0,v1,v2,v3;
     private Static1D dBegin, dMiddle, dEnd, s0;
     private int bmpHeight, bmpWidth;
+    private Static3D mMove, mScale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -113,13 +118,16 @@ class GirlRenderer implements GLSurfaceView.Renderer
 
       mEffects = new DistortedEffects();
 
-      mEffects.sink( diSink, pLeft, sinkRegion );
-      mEffects.sink( diSink, pRight,sinkRegion );
+      mEffects.apply( new VertexEffectSink(diSink, pLeft, sinkRegion) );
+      mEffects.apply( new VertexEffectSink(diSink, pRight,sinkRegion) );
+      mEffects.apply( new VertexEffectDistort(diL, pLeft , Region) );
+      mEffects.apply( new VertexEffectDistort(diR, pRight, Region) );
+      mEffects.apply( new VertexEffectSwirl(diHips, pHips, HipsRegion) );
 
-      mEffects.distort(diL, pLeft , Region);
-      mEffects.distort(diR, pRight, Region);
-
-      mEffects.swirl(diHips, pHips, HipsRegion );
+      mMove = new Static3D(0,0,0);
+      mScale= new Static3D(1,1,1);
+      mEffects.apply(new MatrixEffectMove(mMove));
+      mEffects.apply(new MatrixEffectScale(mScale));
 
       mScreen = new DistortedScreen(mView);
       }
@@ -160,23 +168,21 @@ class GirlRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       { 
-      mEffects.abortEffects(EffectTypes.MATRIX);
-      
       if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
 
-        mEffects.move( new Static3D((width-w)/2,0,0) );
-        mEffects.scale(factor);
+        mMove.set((width-w)/2,0,0);
+        mScale.set(factor,factor,factor);
         }
       else
         {
         int h = (width*bmpHeight)/bmpWidth;
         float factor = (float)width/bmpWidth;
 
-        mEffects.move( new Static3D(0,(height-h)/2,0) );
-        mEffects.scale(factor);
+        mMove.set(0,(height-h)/2,0);
+        mScale.set(factor,factor,factor);
         }
       
       mScreen.resize(width, height);
@@ -213,9 +219,9 @@ class GirlRenderer implements GLSurfaceView.Renderer
       mScreen.detachAll();
       mScreen.attach(mTexture,mEffects,mMesh);
 
-      DistortedEffects.enableEffect(EffectNames.DISTORT);
-      DistortedEffects.enableEffect(EffectNames.SINK);
-      DistortedEffects.enableEffect(EffectNames.SWIRL);
+      DistortedEffects.enableEffect(EffectName.DISTORT);
+      DistortedEffects.enableEffect(EffectName.SINK);
+      DistortedEffects.enableEffect(EffectName.SWIRL);
 
       try
         {
diff --git a/src/main/java/org/distorted/examples/glow/GlowRenderer.java b/src/main/java/org/distorted/examples/glow/GlowRenderer.java
index 75d73d4..499af58 100644
--- a/src/main/java/org/distorted/examples/glow/GlowRenderer.java
+++ b/src/main/java/org/distorted/examples/glow/GlowRenderer.java
@@ -24,14 +24,18 @@ import android.graphics.BitmapFactory;
 import android.opengl.GLSurfaceView;
 
 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.MatrixEffectRotate;
+import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.effect.PostprocessEffectGlow;
 import org.distorted.library.main.Distorted;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedEffectsPostprocess;
 import org.distorted.library.main.DistortedNode;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.DistortedTexture;
-import org.distorted.library.EffectNames;
-import org.distorted.library.EffectTypes;
 import org.distorted.library.main.MeshFlat;
 import org.distorted.library.main.MeshObject;
 import org.distorted.library.message.EffectListener;
@@ -57,12 +61,13 @@ class GlowRenderer implements GLSurfaceView.Renderer,EffectListener
    private static final int NUM_LEAVES= colors.length/3;
    
    private GLSurfaceView mView;
-   private DistortedNode mRoot;
    private DistortedTexture mLeaf;
    private DistortedScreen mScreen;
    private DistortedEffectsPostprocess[] mLeafGlow = new DistortedEffectsPostprocess[NUM_LEAVES];
+   private PostprocessEffectGlow[] mGlow = new PostprocessEffectGlow[NUM_LEAVES];
    private int mRootW, mRootH;
    private int mGlowing;
+   private Static3D mMove, mScale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -78,31 +83,63 @@ class GlowRenderer implements GLSurfaceView.Renderer,EffectListener
       MeshObject mesh = new MeshFlat(1,1);
       DistortedEffects[] leafEffects = new DistortedEffects[NUM_LEAVES];
 
-      mRoot = new DistortedNode(surface, new DistortedEffects(), mesh);
+      DistortedNode root = new DistortedNode(surface, new DistortedEffects(), mesh);
      
       Static3D moveVector = new Static3D(0,LEAF_SIZE,0);
       Static1D chromaLevel= new Static1D(0.5f);
       Static3D center     = new Static3D(3*LEAF_SIZE/2, 3*LEAF_SIZE/2, 0);
       Static3D axis       = new Static3D(0,0,1);
 
+      MatrixEffectMove leafMove = new MatrixEffectMove(moveVector);
+
       for(int j=0; j<NUM_LEAVES; j++)
         {
         mLeafGlow[j] = new DistortedEffectsPostprocess();
         mLeafGlow[j].registerForMessages(this);
 
         leafEffects[j] = new DistortedEffects();
-        leafEffects[j].rotate( new Static1D(j*(360/NUM_LEAVES)), axis, center );
-        leafEffects[j].move(moveVector);
-        leafEffects[j].chroma( chromaLevel, new Static3D(colors[3*j],colors[3*j+1], colors[3*j+2]) );
+        leafEffects[j].apply( new MatrixEffectRotate(new Static1D(j*(360/NUM_LEAVES)), axis, center) );
+        leafEffects[j].apply(leafMove);
+        leafEffects[j].apply( new FragmentEffectChroma(chromaLevel, new Static3D(colors[3*j],colors[3*j+1], colors[3*j+2])) );
         DistortedNode node = new DistortedNode( mLeaf, leafEffects[j], mesh);
         node.setPostprocessEffects(mLeafGlow[j]);
-        mRoot.attach(node);
+        root.attach(node);
         }
 
       makeGlow(0);
 
       mScreen = new DistortedScreen(mView);
-      mScreen.attach(mRoot);
+      mScreen.attach(root);
+
+      mMove = new Static3D(0,0,0);
+      mScale= new Static3D(1,1,1);
+
+      Dynamic1D rot = new Dynamic1D(5000,0.0f);
+      rot.setMode(Dynamic1D.MODE_JUMP);
+      rot.add(new Static1D(  0));
+      rot.add(new Static1D(360));
+
+      DistortedEffects effects = root.getEffects();
+      effects.apply(new MatrixEffectMove(mMove));
+      effects.apply(new MatrixEffectScale(mScale));
+      effects.apply( new MatrixEffectRotate(rot, axis, center) );
+
+      Dynamic1D radius = new Dynamic1D(5000,1.0f);
+      Static1D startR  = new Static1D( 0);
+      Static1D endR    = new Static1D(50);
+      radius.add(startR);
+      radius.add(endR);
+
+      for(int leaf=0; leaf<NUM_LEAVES; leaf++)
+        {
+        Dynamic4D color  = new Dynamic4D(5000,1.0f);
+        Static4D startC  = new Static4D(colors[3*leaf],colors[3*leaf+1], colors[3*leaf+2], 0);
+        Static4D endC    = new Static4D(colors[3*leaf],colors[3*leaf+1], colors[3*leaf+2], 1);
+        color.add(startC);
+        color.add(endC);
+
+        mGlow[leaf] = new PostprocessEffectGlow(radius,color);
+        }
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -112,26 +149,13 @@ class GlowRenderer implements GLSurfaceView.Renderer,EffectListener
      //android.util.Log.e("glow", "glowing: "+leaf);
 
      mGlowing = leaf;
-
-     Dynamic1D radius = new Dynamic1D(5000,1.0f);
-     Static1D startR  = new Static1D( 0);
-     Static1D endR    = new Static1D(50);
-     radius.add(startR);
-     radius.add(endR);
-
-     Dynamic4D color  = new Dynamic4D(5000,1.0f);
-     Static4D startC  = new Static4D(colors[3*leaf],colors[3*leaf+1], colors[3*leaf+2], 0);
-     Static4D endC    = new Static4D(colors[3*leaf],colors[3*leaf+1], colors[3*leaf+2], 1);
-     color.add(startC);
-     color.add(endC);
-
-     mLeafGlow[leaf].glow( radius, color );
+     mLeafGlow[leaf].apply(mGlow[leaf]);
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // Glow finished. Make the next Leaf glow.
 
-   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)
      {
      switch(em)
        {
@@ -162,20 +186,8 @@ class GlowRenderer implements GLSurfaceView.Renderer,EffectListener
      int w = (int)(factor*mRootW);
      int h = (int)(factor*mRootH);
 
-     Dynamic1D rot = new Dynamic1D(5000,0.0f);
-     rot.setMode(Dynamic1D.MODE_JUMP);
-     rot.add(new Static1D(  0));
-     rot.add(new Static1D(360));
-
-     Static3D center = new Static3D(3*LEAF_SIZE/2, 3*LEAF_SIZE/2, 0);
-     Static3D axis   = new Static3D(0,0,1);
-
-     DistortedEffects effects = mRoot.getEffects();
-     effects.abortEffects(EffectTypes.MATRIX);
-     effects.move( new Static3D((width-w)/2 ,(height-h)/2, 0) );
-     effects.scale( factor );
-     effects.rotate( rot, axis, center );
-
+     mMove.set((width-w)/2 ,(height-h)/2, 0);
+     mScale.set( factor,factor,factor );
      mScreen.resize(width, height);
      }
 
@@ -201,8 +213,8 @@ class GlowRenderer implements GLSurfaceView.Renderer,EffectListener
       
      mLeaf.setTexture(leaf);
 
-     DistortedEffects.enableEffect(EffectNames.CHROMA);
-     DistortedEffects.enableEffect(EffectNames.GLOW);
+     DistortedEffects.enableEffect(EffectName.CHROMA);
+     DistortedEffects.enableEffect(EffectName.GLOW);
 
      try
        {
