commit 7abd1d0057695d369aa06509ea4e7efe2b9e98ce
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Fri Jun 24 14:05:30 2016 +0100

    make the 'Deform' app much more flexible (now we can mix effects atthe same time!)

diff --git a/src/main/java/org/distorted/examples/deform/DeformActivity.java b/src/main/java/org/distorted/examples/deform/DeformActivity.java
index 501cd5d..346b27c 100644
--- a/src/main/java/org/distorted/examples/deform/DeformActivity.java
+++ b/src/main/java/org/distorted/examples/deform/DeformActivity.java
@@ -21,6 +21,7 @@ package org.distorted.examples.deform;
 
 import org.distorted.library.Distorted;
 import org.distorted.examples.R;
+import org.distorted.library.EffectNames;
 
 import android.app.Activity;
 import android.opengl.GLSurfaceView;
@@ -35,10 +36,8 @@ import android.widget.SeekBar.OnSeekBarChangeListener;
 
 public class DeformActivity extends Activity implements OnSeekBarChangeListener
 {
-    private SeekBar barR;
     private TextView textR;
-    private RadioButton effect;
-    
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     @Override
@@ -46,8 +45,8 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
       {
       super.onCreate(icicle);
       setContentView(R.layout.deformlayout);
-       
-      barR = (SeekBar)findViewById(R.id.deformSeekRadius);
+
+      SeekBar barR = (SeekBar)findViewById(R.id.deformSeekRadius);
       barR.setOnSeekBarChangeListener(this); 
         
       textR = (TextView)findViewById(R.id.deformTextRadius);
@@ -55,10 +54,10 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
       barR.setProgress(50);
       
       textR.setText("Radius: 50");
-      
-      effect = (RadioButton)findViewById(R.id.deformDistortButton);
+
+      RadioButton effect = (RadioButton)findViewById(R.id.deformDistortButton);
       effect.setChecked(true);
-      DeformRenderer.setMode(DeformRenderer.MODE_DISTORT);
+      DeformRenderer.setMode(EffectNames.DISTORT);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -90,9 +89,7 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
     @Override
     protected void onDestroy() 
       {
-      android.util.Log.e("activity","onDestroy");  
-      
-      Distorted.onDestroy();  
+      Distorted.onDestroy();
       super.onDestroy();
       }
  
@@ -100,21 +97,21 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
     
     public void Distort(View v)
       {
-      DeformRenderer.setMode(DeformRenderer.MODE_DISTORT);
+      DeformRenderer.setMode(EffectNames.DISTORT);
       }     
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void Deform(View v)
       {
-      DeformRenderer.setMode(DeformRenderer.MODE_DEFORM);
+      DeformRenderer.setMode(EffectNames.DEFORM);
       }       
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void Shear(View v)
       {
-      DeformRenderer.setMode(DeformRenderer.MODE_SHEAR);
+      DeformRenderer.setMode(EffectNames.SHEAR);
       }       
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/deform/DeformRenderer.java b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
index 12f06a7..c6bebd2 100644
--- a/src/main/java/org/distorted/examples/deform/DeformRenderer.java
+++ b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
@@ -24,6 +24,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.library.Distorted;
 import org.distorted.library.DistortedBitmap;
+import org.distorted.library.EffectNames;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static3D;
@@ -40,10 +41,6 @@ import android.opengl.GLSurfaceView;
 
 class DeformRenderer implements GLSurfaceView.Renderer 
 {
-   public static final int MODE_DISTORT= 0;
-   public static final int MODE_DEFORM = 1;
-   public static final int MODE_SHEAR  = 2;
-    
    private static final int NUM_VECTORS = 8;
    private static final int NUMLINES = 10;
    private static final int NUMFRAMES =10;
@@ -52,9 +49,17 @@ class DeformRenderer implements GLSurfaceView.Renderer
    private DistortedBitmap fps;
    private DistortedBitmap stretch;
    private Static3D touchPoint;
-   private static Dynamic3D mReleasedDynamic;
-   private static Dynamic3D mMovingDynamic;
-   private static Static3D[] v;
+
+   private static Dynamic3D mReleasedDistortDynamic;
+   private static Dynamic3D mMovingDistortDynamic;
+   private static Static3D[] vDistort;
+   private static Dynamic3D mReleasedDeformDynamic;
+   private static Dynamic3D mMovingDeformDynamic;
+   private static Static3D[] vDeform;
+   private static Dynamic3D mReleasedShearDynamic;
+   private static Dynamic3D mMovingShearDynamic;
+   private static Static3D[] vShear;
+
    private static Static4D dr;
    private Canvas fpsCanvas;
    private Bitmap fpsBitmap, stretchBitmap;
@@ -65,11 +70,12 @@ class DeformRenderer implements GLSurfaceView.Renderer
    private long lastTime=0;
    private long[] durations;
    private int currDuration;
-   private long shearID=0;
-    
-   private static int mMode = MODE_DISTORT;
+
+   private static EffectNames mMode = EffectNames.DISTORT;
    private static boolean bitmapCreated = false;
-    
+
+   private static long mLastEffect = -1;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    public DeformRenderer(GLSurfaceView view) 
@@ -77,35 +83,67 @@ class DeformRenderer implements GLSurfaceView.Renderer
       mView = view;
       
       dr = new Static4D(0,0,0,0);
-     
-      mReleasedDynamic = new Dynamic3D(NUM_VECTORS*500, 0.5f);
-      mReleasedDynamic.setMode(Dynamic3D.MODE_PATH);
 
-      mMovingDynamic = new Dynamic3D(0,0.5f);
-      mMovingDynamic.setMode(Dynamic3D.MODE_PATH);
+      durations = new long[NUMFRAMES+1];
+      currDuration = 0;
+
+      for(int i=0; i<NUMFRAMES+1; i++)
+        {
+        durations[i]=0;
+        }
+
+      // DISTORT
+      mReleasedDistortDynamic = new Dynamic3D(NUM_VECTORS*500, 0.5f);
+      mReleasedDistortDynamic.setMode(Dynamic3D.MODE_PATH);
+      mMovingDistortDynamic = new Dynamic3D(0,0.5f);
+      mMovingDistortDynamic.setMode(Dynamic3D.MODE_PATH);
 
-      v = new Static3D[NUM_VECTORS];
+      vDistort = new Static3D[NUM_VECTORS];
 
       for(int i=0; i<NUM_VECTORS; i++)
         {
-        v[i] = new Static3D(0,0,0);
-        mReleasedDynamic.add(v[i]);
+        vDistort[i] = new Static3D(0,0,0);
+        mReleasedDistortDynamic.add(vDistort[i]);
         }
 
-      mMovingDynamic.add(v[0]);
+      mMovingDistortDynamic.add(vDistort[0]);
 
-      durations = new long[NUMFRAMES+1];
-      currDuration = 0;
-      
-      for(int i=0; i<NUMFRAMES+1; i++)
+      // Deform
+      mReleasedDeformDynamic = new Dynamic3D(NUM_VECTORS*500, 0.5f);
+      mReleasedDeformDynamic.setMode(Dynamic3D.MODE_PATH);
+      mMovingDeformDynamic = new Dynamic3D(0,0.5f);
+      mMovingDeformDynamic.setMode(Dynamic3D.MODE_PATH);
+
+      vDeform = new Static3D[NUM_VECTORS];
+
+      for(int i=0; i<NUM_VECTORS; i++)
         {
-        durations[i]=0;   
+        vDeform[i] = new Static3D(0,0,0);
+        mReleasedDeformDynamic.add(vDeform[i]);
         }
+
+      mMovingDeformDynamic.add(vDeform[0]);
+
+      // Shear
+      mReleasedShearDynamic = new Dynamic3D(NUM_VECTORS*500, 0.5f);
+      mReleasedShearDynamic.setMode(Dynamic3D.MODE_PATH);
+      mMovingShearDynamic = new Dynamic3D(0,0.5f);
+      mMovingShearDynamic.setMode(Dynamic3D.MODE_PATH);
+
+      vShear = new Static3D[NUM_VECTORS];
+
+      for(int i=0; i<NUM_VECTORS; i++)
+        {
+        vShear[i] = new Static3D(0,0,0);
+        mReleasedShearDynamic.add(vShear[i]);
+        }
+
+      mMovingShearDynamic.add(vShear[0]);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   public static void setMode(int mode)
+   public static void setMode(EffectNames mode)
       {
       mMode = mode;  
       }
@@ -166,7 +204,7 @@ class DeformRenderer implements GLSurfaceView.Renderer
         {
         stretch.abortEffects(EffectTypes.VERTEX);
         stretch.abortEffects(EffectTypes.FRAGMENT);
-        stretch.abortEffect(shearID);
+        stretch.abortEffects(EffectNames.SHEAR);
         }
       }
 
@@ -226,10 +264,6 @@ class DeformRenderer implements GLSurfaceView.Renderer
 
     public void down(int x, int y)
       {
-      stretch.abortEffects(EffectTypes.VERTEX);
-      stretch.abortEffects(EffectTypes.FRAGMENT);
-      stretch.abortEffect(shearID);
-
       int xt = x-scrWidth/4;
       int yt = y-scrHeight/4;
       
@@ -239,17 +273,18 @@ class DeformRenderer implements GLSurfaceView.Renderer
       if( yt>scrHeight/2 ) yt=scrHeight/2;
       
       touchPoint.set(xt,yt,0);
-      
-      v[0].set(0,0,0);
-      
+
       switch(mMode)
         {
-        case MODE_DISTORT: stretch.distort( mMovingDynamic, touchPoint, dr);
-                           break;
-        case MODE_DEFORM : stretch.deform( mMovingDynamic, touchPoint);
-                           break;
-        case MODE_SHEAR  : shearID = stretch.shear(mMovingDynamic, touchPoint);
-                           break;
+        case DISTORT: vDistort[0].set(0,0,0);
+                      mLastEffect = stretch.distort( mMovingDistortDynamic, touchPoint, dr);
+                      break;
+        case DEFORM : vDeform[0].set(0,0,0);
+                      mLastEffect = stretch.deform( mMovingDeformDynamic, touchPoint);
+                      break;
+        case SHEAR  : vShear[0].set(0,0,0);
+                      mLastEffect = stretch.shear(mMovingShearDynamic, touchPoint);
+                      break;
         }                   
       }
     
@@ -257,42 +292,48 @@ class DeformRenderer implements GLSurfaceView.Renderer
 
     public void move(int x, int y)
       {
-      float fx = x;
-      float fy = y;
-      
-      if( mMode==MODE_SHEAR )
+      switch(mMode)
         {
-        fx /= (scrWidth/2);
-        fy /= (scrHeight/2);
+        case DISTORT: vDistort[0].set(x,y);
+                      break;
+        case DEFORM:  vDeform[0].set(x,y);
+                      break;
+        case SHEAR:   vShear[0].set( (float)x/(scrWidth/2), (float)y/(scrHeight/2));
+                      break;
         }
-      
-      v[0].set(fx,fy);
       }
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void up()
       {
-      stretch.abortEffects(EffectTypes.VERTEX);
-      stretch.abortEffects(EffectTypes.FRAGMENT);
-      stretch.abortEffect(shearID);
-      
+      stretch.abortEffect(mLastEffect);
+
       float damp = -0.65f;
-      
-      for(int i=1; i<NUM_VECTORS-1; i++)
-        {
-        v[i].set( v[i-1].getX()*damp, v[i-1].getY()*damp );
-        }
-      v[NUM_VECTORS-1].set(0,0);
-      
+
       switch(mMode)
         {
-        case MODE_DISTORT: stretch.distort( mReleasedDynamic, touchPoint, dr);
-                           break;
-        case MODE_DEFORM : stretch.deform( mReleasedDynamic, touchPoint);
-                           break;
-        case MODE_SHEAR  : shearID = stretch.shear(mReleasedDynamic, touchPoint);
-                           break;
+        case DISTORT: for(int i=1; i<NUM_VECTORS-1; i++)
+                        {
+                        vDistort[i].set( vDistort[i-1].getX()*damp, vDistort[i-1].getY()*damp );
+                        }
+                      vDistort[NUM_VECTORS-1].set(0,0);
+                      stretch.distort( mReleasedDistortDynamic, touchPoint, dr);
+                      break;
+        case DEFORM : for(int i=1; i<NUM_VECTORS-1; i++)
+                        {
+                        vDeform[i].set( vDeform[i-1].getX()*damp, vDeform[i-1].getY()*damp );
+                        }
+                      vDeform[NUM_VECTORS-1].set(0,0);
+                      stretch.deform( mReleasedDeformDynamic, touchPoint);
+                      break;
+        case SHEAR  : for(int i=1; i<NUM_VECTORS-1; i++)
+                        {
+                        vShear[i].set( vShear[i-1].getX()*damp, vShear[i-1].getY()*damp );
+                        }
+                      vShear[NUM_VECTORS-1].set(0,0);
+                      stretch.shear(mReleasedShearDynamic, touchPoint);
+                      break;
         }      
       }
 
@@ -312,7 +353,4 @@ class DeformRenderer implements GLSurfaceView.Renderer
       
       lastTime = currentTime;   
       }
-    
-///////////////////////////////////////////////////////////////////////////////////////////////////
-    
 }
