commit f988589ec68f10fbabe19e76b799fa9db6cacfcd
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Sat Jun 18 23:58:01 2016 +0100

    Further reduce the distortedObject's API - now only 26 methods, 1/4 of the 104 before the reorganization.

diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 1cd1e6a..ad63d79 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -21,7 +21,7 @@
         <activity android:name=".fov.FOVActivity" />
         <activity android:name=".deform.DeformActivity" />    
         <activity android:name=".listener.ListenerActivity" />    
-        <activity android:name=".interpolator.InterpolatorActivity" />   
+        <activity android:name=".dynamic.DynamicActivity" />
         <activity android:name=".girl.GirlActivity" />   
         <activity android:name=".macroblock.MacroblockActivity" /> 
         <activity android:name=".movingeffects.MovingEffectsActivity" />    
diff --git a/src/main/java/org/distorted/examples/TableOfContents.java b/src/main/java/org/distorted/examples/TableOfContents.java
index 56e23ad..5ef20e3 100644
--- a/src/main/java/org/distorted/examples/TableOfContents.java
+++ b/src/main/java/org/distorted/examples/TableOfContents.java
@@ -39,7 +39,7 @@ import org.distorted.examples.sink.SinkActivity;
 import org.distorted.examples.fov.FOVActivity;
 import org.distorted.examples.deform.DeformActivity;
 import org.distorted.examples.listener.ListenerActivity;
-import org.distorted.examples.interpolator.InterpolatorActivity;
+import org.distorted.examples.dynamic.DynamicActivity;
 import org.distorted.examples.girl.GirlActivity;
 import org.distorted.examples.macroblock.MacroblockActivity;
 import org.distorted.examples.movingeffects.MovingEffectsActivity;
@@ -135,11 +135,11 @@ public class TableOfContents extends ListActivity
    
    {
       final Map<String, Object> item = new HashMap<>();
-      item.put(ITEM_IMAGE, R.drawable.icon_example_interpolator);
-      item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_interpolator));
-      item.put(ITEM_SUBTITLE, getText(R.string.example_interpolator_subtitle));
+      item.put(ITEM_IMAGE, R.drawable.icon_example_dynamic);
+      item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_dynamic));
+      item.put(ITEM_SUBTITLE, getText(R.string.example_dynamic_subtitle));
       data.add(item);
-      activityMapping.put(i++, InterpolatorActivity.class);
+      activityMapping.put(i++, DynamicActivity.class);
    }
    
    {
diff --git a/src/main/java/org/distorted/examples/bean/BeanRenderer.java b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
index 4517e26..ec3a36c 100644
--- a/src/main/java/org/distorted/examples/bean/BeanRenderer.java
+++ b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
@@ -28,7 +28,6 @@ import javax.microedition.khronos.opengles.GL10;
 import org.distorted.examples.R;
 
 import org.distorted.library.EffectTypes;
-import org.distorted.library.type.Dynamic2D;
 import org.distorted.library.Distorted;
 import org.distorted.library.DistortedBitmap;
 import org.distorted.library.type.Dynamic3D;
@@ -64,14 +63,9 @@ class BeanRenderer implements GLSurfaceView.Renderer
       rLeft = new Static4D(-9,-31,35,35);
       rRight= new Static4D(-9,-31,35,35);
      
-      dLeft = new Dynamic3D();
-      dRight= new Dynamic3D();
-     
-      dLeft.setCount(0.0f);
-      dRight.setCount(0.0f);
-      dLeft.setDuration(1500);
-      dRight.setDuration(1500);
-      
+      dLeft = new Dynamic3D(1500,0.0f);
+      dRight= new Dynamic3D(1500,0.0f);
+
       Static3D p1 = new Static3D(  0,  0, 0);
       Static3D p2 = new Static3D(-10,-34, 0);
       
@@ -112,7 +106,7 @@ class BeanRenderer implements GLSurfaceView.Renderer
         float factor = (float)height/bmpHeight;
 
         mBean.move( new Static3D((width-w)/2,0,0) );
-        mBean.scale( new Static3D(factor,factor,factor) );
+        mBean.scale(factor);
         }
       else
         {
@@ -120,7 +114,7 @@ class BeanRenderer implements GLSurfaceView.Renderer
         float factor = (float)width/bmpWidth;
 
         mBean.move( new Static3D(0,(height-h)/2,0) );
-        mBean.scale( new Static3D(factor,factor,factor) );
+        mBean.scale(factor);
         }
       
       Distorted.onSurfaceChanged(width, height); 
diff --git a/src/main/java/org/distorted/examples/check/CheckRenderer.java b/src/main/java/org/distorted/examples/check/CheckRenderer.java
index f498aed..44a5543 100644
--- a/src/main/java/org/distorted/examples/check/CheckRenderer.java
+++ b/src/main/java/org/distorted/examples/check/CheckRenderer.java
@@ -89,7 +89,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
         float factor = (float)height/bmpHeight;
 
         mSuccess.move( new Static3D((width-w)/2,0,0) );
-        mSuccess.scale( new Static3D(factor,factor,factor) );
+        mSuccess.scale(factor);
         }
       else
         {
@@ -97,7 +97,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
         float factor = (float)width/bmpWidth;
 
         mSuccess.move( new Static3D(0,(height-h)/2,0) );
-        mSuccess.scale( new Static3D(factor,factor,factor) );
+        mSuccess.scale(factor);
         }
       
       Distorted.onSurfaceChanged(width, height);
@@ -134,17 +134,13 @@ class CheckRenderer implements GLSurfaceView.Renderer
       // Even if adding some of the Effects fails, the App will still start - you just won't see
       // the effects that failed to add.
 
-      Dynamic2D dSwirl = new Dynamic2D();
-      dSwirl.setCount(0.0f);
-      dSwirl.setDuration(2000);
+      Dynamic2D dSwirl = new Dynamic2D(2000,0.0f);
       dSwirl.add(new Static2D(        0, bmpHeight/2));
       dSwirl.add(new Static2D( bmpWidth, bmpHeight/2));
 
       mSuccess.swirl( new Static1D(30), dSwirl, new Static4D( 0,0,40,40) );
 
-      Dynamic3D dDeform = new Dynamic3D();
-      dDeform.setCount(0.0f);
-      dDeform.setDuration(2000);
+      Dynamic3D dDeform = new Dynamic3D(2000,0.0f);
       dDeform.add(new Static3D( 0,         0,0));
       dDeform.add(new Static3D( 0,-bmpHeight,0));
 
@@ -152,9 +148,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
 
       // Now try adding 1 Fragment Effect. Likewise, will fail if maxFragmentEffects is <1.
       Static3D color = new Static3D(1,0,0);
-      Dynamic1D inter = new Dynamic1D();
-      inter.setCount(0.0f);
-      inter.setDuration(2000);
+      Dynamic1D inter = new Dynamic1D(2000,0.0f);
       inter.add(new Static1D(0));
       inter.add(new Static1D(1));
 
diff --git a/src/main/java/org/distorted/examples/cubes/CubesRenderer.java b/src/main/java/org/distorted/examples/cubes/CubesRenderer.java
index 889a206..03bc797 100644
--- a/src/main/java/org/distorted/examples/cubes/CubesRenderer.java
+++ b/src/main/java/org/distorted/examples/cubes/CubesRenderer.java
@@ -105,7 +105,7 @@ class CubesRenderer implements GLSurfaceView.Renderer
         float factor = (float)height/(mRows*SIZE);
 
         mCubes.move( new Static3D((width-w)/2,0,0) );
-        mCubes.scale( new Static3D(factor,factor,factor) );
+        mCubes.scale(factor);
         }  
       else
         {   
@@ -113,7 +113,7 @@ class CubesRenderer implements GLSurfaceView.Renderer
         float factor = (float)width/(mCols*SIZE);
 
         mCubes.move( new Static3D(0,(height-h)/2,0) );
-        mCubes.scale( new Static3D(factor,factor,factor) );
+        mCubes.scale(factor);
         }
     
       Static3D center = new Static3D(mCols*SIZE/2,mRows*SIZE/2, 0);
diff --git a/src/main/java/org/distorted/examples/deform/DeformRenderer.java b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
index 857690e..e2c93ce 100644
--- a/src/main/java/org/distorted/examples/deform/DeformRenderer.java
+++ b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
@@ -78,15 +78,11 @@ class DeformRenderer implements GLSurfaceView.Renderer
       
       dr = new Static4D(0,0,0,0);
      
-      mReleasedDynamic = new Dynamic3D();
+      mReleasedDynamic = new Dynamic3D(NUM_VECTORS*500, 0.5f);
       mReleasedDynamic.setMode(Dynamic3D.MODE_PATH);
-      mReleasedDynamic.setCount(0.5f);
-      mReleasedDynamic.setDuration(NUM_VECTORS*500);
 
-      mMovingDynamic = new Dynamic3D();
+      mMovingDynamic = new Dynamic3D(0,0.5f);
       mMovingDynamic.setMode(Dynamic3D.MODE_PATH);
-      mMovingDynamic.setCount(0.5f);
-      mMovingDynamic.setDuration(0);
 
       v = new Static3D[NUM_VECTORS];
 
diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
index 0ee5b69..bb4bf49 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
@@ -30,7 +30,6 @@ import org.distorted.examples.R;
 import org.distorted.library.Distorted;
 import org.distorted.library.DistortedBitmap;
 import org.distorted.library.EffectTypes;
-import org.distorted.library.type.Dynamic2D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static2D;
@@ -62,9 +61,7 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
       mView = v;
      
       // create shared effects - enlarge the nose and keep moving the whole bitmap left and right.
-      dDistort = new Dynamic3D();
-      dDistort.setCount(0.0f);
-      dDistort.setDuration(3000);
+      dDistort = new Dynamic3D(3000,0.0f);
       vec = new Static3D[2];
       vec[0] = new Static3D( 25,0,0);
       vec[1] = new Static3D(-25,0,0);
@@ -121,12 +118,11 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
-        Static3D scale = new Static3D(factor,factor,factor);
 
         for(int i=NUM-1; i>=0; i--) 
           {
           bmp[i].move( new Static3D((width-NUM*w)/2 +i*w ,0,0) );
-          bmp[i].scale(scale);
+          bmp[i].scale(factor);
           }
         }
       else
@@ -134,12 +130,11 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
         int w = width/NUM;  
         int h = (width*bmpHeight)/(bmpWidth*NUM);
         float factor = (float)width/(bmpWidth*NUM);
-        Static3D scale = new Static3D(factor,factor,factor);
 
         for(int i=NUM-1; i>=0; i--) 
           {
           bmp[i].move( new Static3D(i*w,(height-h)/2,0) );
-          bmp[i].scale(scale);
+          bmp[i].scale(factor);
           }
         }
          
diff --git a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
index 9b55eee..a820bdf 100644
--- a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
@@ -68,9 +68,7 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
       RegionEye = new Static4D(0,0,60,60);
       
       // bmp[1] effects
-      mDI = new Dynamic3D();
-      mDI.setCount(0.0f);
-      mDI.setDuration(1000);
+      mDI = new Dynamic3D(1000,0.0f);
       vec = new Static3D[2];
       vec[0] = new Static3D( 50,0,0);
       vec[1] = new Static3D(-50,0,0);
@@ -106,12 +104,11 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
-        Static3D scaleFactor = new Static3D(factor,factor,factor);
 
         for(int i=NUM-1; i>=0; i--) 
           {
           bmp[i].move( new Static3D((width-NUM*w)/2 +i*w , 0, 0) );
-          bmp[i].scale(scaleFactor);
+          bmp[i].scale(factor);
           }
         }
       else
@@ -119,12 +116,11 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
         int w = width/NUM;  
         int h = (width*bmpHeight)/(bmpWidth*NUM);
         float factor = (float)width/(bmpWidth*NUM);
-        Static3D scaleFactor = new Static3D(factor,factor,factor);
 
         for(int i=NUM-1; i>=0; i--) 
           {
           bmp[i].move( new Static3D(i*w, (height-h)/2, 0) );
-          bmp[i].scale(scaleFactor);
+          bmp[i].scale(factor);
           }
         }
        
@@ -162,9 +158,7 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
       // setting the bitmap once is enough; others are cloned!
       bmp[0].setBitmap(bitmap);
 
-      Dynamic1D sink = new Dynamic1D();
-      sink.setDuration(2000);
-      sink.setCount(0);
+      Dynamic1D sink = new Dynamic1D(2000,0.0f);
       sink.add(new Static1D( 1));
       sink.add(new Static1D(10));
 
@@ -172,9 +166,7 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
       bmp[0].sink(sink, pRight,RegionEye);
       bmp[1].distort(mDI, pNose1);
 
-      Dynamic1D macroblockDyn = new Dynamic1D();
-      macroblockDyn.setDuration(3000);
-      macroblockDyn.setCount(0);
+      Dynamic1D macroblockDyn = new Dynamic1D(3000,0.0f);
       macroblockDyn.add(new Static1D(1));
       macroblockDyn.add(new Static1D(50));
 
diff --git a/src/main/java/org/distorted/examples/dynamic/DynamicActivity.java b/src/main/java/org/distorted/examples/dynamic/DynamicActivity.java
new file mode 100644
index 0000000..c86e339
--- /dev/null
+++ b/src/main/java/org/distorted/examples/dynamic/DynamicActivity.java
@@ -0,0 +1,178 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2016 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted is free software: you can redistribute it and/or modify                             //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted is distributed in the hope that it will be useful,                                  //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.examples.dynamic;
+
+import org.distorted.library.Distorted;
+import org.distorted.library.type.Dynamic1D;
+import org.distorted.examples.R;
+
+import android.app.Activity;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.SeekBar;
+import android.widget.TextView;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+
+///////////////////////////////////////////////////////////////////
+
+public class DynamicActivity extends Activity implements OnSeekBarChangeListener
+    {
+    private SeekBar barD, barN;
+    private TextView textD, textN;
+   
+///////////////////////////////////////////////////////////////////
+    @Override
+    protected void onCreate(Bundle savedInstanceState) 
+      {
+      super.onCreate(savedInstanceState);
+      setContentView(R.layout.interpolatorlayout);
+      
+      barD = (SeekBar)findViewById(R.id.interpolatorSeekDuration);
+      barD.setOnSeekBarChangeListener(this); 
+      textD = (TextView)findViewById(R.id.interpolatorTextDuration);
+      
+      barN = (SeekBar)findViewById(R.id.interpolatorSeekNoise);
+      barN.setOnSeekBarChangeListener(this); 
+      textN = (TextView)findViewById(R.id.interpolatorTextNoise);
+      
+      barD.setProgress(50);
+      textD.setText("Duration: 10 s");
+      
+      barN.setProgress(0);
+      textN.setText("Noise: 0.0");
+      }
+
+///////////////////////////////////////////////////////////////////
+    @Override
+    protected void onResume() 
+      {
+      super.onResume();
+      
+      GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.interpolatorSurfaceView);
+      mView.onResume();
+      }
+
+///////////////////////////////////////////////////////////////////
+    @Override
+    protected void onPause() 
+      {
+      GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.interpolatorSurfaceView);
+      mView.onPause();
+         
+      super.onPause();
+      }
+    
+///////////////////////////////////////////////////////////////////
+    @Override
+    public void onStop()
+      {
+      super.onStop();
+      }
+
+///////////////////////////////////////////////////////////////////
+    @Override
+    public void onDestroy()
+      {  
+      Distorted.onDestroy();
+      super.onDestroy();
+      }     
+ 
+///////////////////////////////////////////////////////////////////
+    
+    public void Loop(View v)
+      {
+      DynamicSurfaceView.setMode(Dynamic1D.MODE_LOOP);
+      }     
+    
+///////////////////////////////////////////////////////////////////
+
+    public void Path(View v)
+      {
+      DynamicSurfaceView.setMode(Dynamic1D.MODE_PATH);
+      }  
+
+///////////////////////////////////////////////////////////////////
+
+    public void Jump(View v)
+      {
+      DynamicSurfaceView.setMode(Dynamic1D.MODE_JUMP);
+      }  
+    
+///////////////////////////////////////////////////////////////////
+
+    public void Dim1D(View v)
+      {
+      DynamicSurfaceView.setDimension(DynamicSurfaceView.DIM_1D);
+      }  
+
+///////////////////////////////////////////////////////////////////
+
+    public void Dim2D(View v)
+      {
+      DynamicSurfaceView.setDimension(DynamicSurfaceView.DIM_2D);
+      }  
+    
+///////////////////////////////////////////////////////////////////
+
+    public void Dim3DXY(View v)
+      {
+      DynamicSurfaceView.setDimension(DynamicSurfaceView.DIM_3DXY);
+      }  
+
+///////////////////////////////////////////////////////////////////
+
+    public void Dim3DXZ(View v)
+      {
+      DynamicSurfaceView.setDimension(DynamicSurfaceView.DIM_3DXZ);
+      }  
+    
+///////////////////////////////////////////////////////////////////
+    
+    public void onProgressChanged(SeekBar bar, int progress, boolean fromUser) 
+      {
+      float v, t; 
+      int i;
+      
+      switch (bar.getId()) 
+        {
+        case R.id.interpolatorSeekDuration: v = progress*200;
+                                            i = (int)(v/100);
+                                            t = i/10.0f;
+                                            DynamicSurfaceView.setDuration((int)v);
+                                            textD.setText("Duration: "+(int)t+" s");
+                                            break;
+        case R.id.interpolatorSeekNoise   : DynamicSurfaceView.setNoise(progress/100.0f);
+                                            textN.setText("Noise: "+(progress/100.f));
+                                            break;
+        }
+      }
+
+///////////////////////////////////////////////////////////////////
+
+    public void onStartTrackingTouch(SeekBar bar) { }
+    
+///////////////////////////////////////////////////////////////////
+
+    public void onStopTrackingTouch(SeekBar bar)  { }
+    
+///////////////////////////////////////////////////////////////////
+// end of file
+}
diff --git a/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java b/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java
new file mode 100644
index 0000000..e46e3e7
--- /dev/null
+++ b/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java
@@ -0,0 +1,110 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2016 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted is free software: you can redistribute it and/or modify                             //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted is distributed in the hope that it will be useful,                                  //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.examples.dynamic;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Paint.Style;
+import android.opengl.GLES20;
+import android.opengl.GLSurfaceView;
+
+import org.distorted.library.DistortedBitmap;
+import org.distorted.library.Distorted;
+import org.distorted.library.EffectTypes;
+import org.distorted.library.type.Static3D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class DynamicRenderer implements GLSurfaceView.Renderer
+   {  
+   public static final int BWID = 300;
+   public static final int BHEI = 400;
+   
+   private GLSurfaceView mView;
+   private DistortedBitmap mBackground;
+   private Canvas mCanvas;
+   private Bitmap mBitmap;
+   private Paint mPaint;
+   private int texWidth, texHeight;
+    
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public DynamicRenderer(GLSurfaceView v)
+     {    
+     mPaint = new Paint();
+     mPaint.setAntiAlias(true);
+     mPaint.setFakeBoldText(true);
+     mPaint.setColor(0xff447da7);
+     mPaint.setStyle(Style.FILL);
+      
+     mView = v;
+      
+     texWidth = BWID;
+     texHeight= BHEI;
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+   
+   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
+     {   
+     mBackground = new DistortedBitmap(texWidth,texHeight, 2);    
+     mBitmap = Bitmap.createBitmap(texWidth,texHeight, Bitmap.Config.ARGB_8888);
+     mCanvas = new Canvas(mBitmap);
+     
+     try
+        {
+        Distorted.onSurfaceCreated(mView.getContext());
+        }
+      catch(Exception ex)
+        {
+        android.util.Log.e("Renderer", ex.getMessage() );
+        }
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void onSurfaceChanged(GL10 glUnused, int width, int height)
+     {
+     mBackground.abortEffects(EffectTypes.MATRIX);
+     mBackground.scale( new Static3D((float)width/texWidth,(float)height/texHeight,1) );
+     Distorted.onSurfaceChanged(width, height);
+     DynamicSurfaceView.setScreenSize(width,height);
+     }
+   
+///////////////////////////////////////////////////////////////////////////////////////////////////
+   
+   public void onDrawFrame(GL10 glUnused)
+     {   
+     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);               
+       
+     long time = System.currentTimeMillis();
+      
+     mCanvas.drawRect(0, 0, texWidth, texHeight, mPaint);
+     DynamicSurfaceView.drawCurve(mCanvas,time);
+     mBackground.setBitmap(mBitmap);
+     mBackground.draw(time);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+  }
diff --git a/src/main/java/org/distorted/examples/dynamic/DynamicSurfaceView.java b/src/main/java/org/distorted/examples/dynamic/DynamicSurfaceView.java
new file mode 100644
index 0000000..c564747
--- /dev/null
+++ b/src/main/java/org/distorted/examples/dynamic/DynamicSurfaceView.java
@@ -0,0 +1,438 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2016 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted is free software: you can redistribute it and/or modify                             //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted is distributed in the hope that it will be useful,                                  //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.examples.dynamic;
+
+import android.content.Context;
+import android.opengl.GLSurfaceView;
+import android.os.Build;
+import android.view.MotionEvent;
+import android.util.AttributeSet;
+import android.graphics.Canvas;
+import android.graphics.Paint.Style;
+import android.graphics.Paint;
+
+import org.distorted.library.type.Dynamic1D;
+import org.distorted.library.type.Dynamic2D;
+import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Static1D;
+import org.distorted.library.type.Static2D;
+import org.distorted.library.type.Static3D;
+
+///////////////////////////////////////////////////////////////////
+
+public class DynamicSurfaceView extends GLSurfaceView
+    {
+    public static final int DIM_1D   = 0; 
+    public static final int DIM_2D   = 1; 
+    public static final int DIM_3DXY = 2; 
+    public static final int DIM_3DXZ = 3; 
+   
+    private static final int NUM_INTERPOLATIONS= 100;
+    private static final int MAX_VECTORS       =   6;
+   
+    private DynamicRenderer mRenderer;
+    private static int xDown,yDown;
+    private static int mScrW, mScrH;
+   
+    private static Dynamic1D di1D;
+    private static Dynamic2D di2D;
+    private static Dynamic3D di3D;
+    
+    private static Paint mPaint;
+    private static int moving;
+    private static Object lock = new Object();
+    private static long mTime = 0;
+    private static int mDuration;
+    private static float mPosition;
+    private static float mNoise;
+    
+    private static int currentDim = DIM_2D;
+    
+    private static Static1D p1D;
+    private static Static2D p2D;
+    private static Static3D p3D;
+    
+    private static float[] mDrawCoord = new float[3];
+      
+///////////////////////////////////////////////////////////////////
+    
+    public DynamicSurfaceView(Context c, AttributeSet attrs)
+      {
+      super(c, attrs);
+      
+      mPaint = new Paint();
+      mPaint.setStyle(Style.FILL);
+      mPaint.setAntiAlias(true);
+      
+      moving    = -1;
+      mDuration = 10000;
+      mPosition = 0;
+      mNoise    = 0.0f;
+      
+      di1D = new Dynamic1D(mDuration,0.5f);
+      di1D.setNoise(mNoise);
+      
+      di2D = new Dynamic2D(mDuration,0.5f);
+      di2D.setNoise(mNoise);
+      
+      di3D = new Dynamic3D(mDuration,0.5f);
+      di3D.setNoise(mNoise);
+        
+      if(!isInEditMode())
+        {
+        setFocusable(true);
+        setFocusableInTouchMode(true);
+        
+        setEGLContextClientVersion(2);
+        
+        if( Build.FINGERPRINT.startsWith("generic") ) // when running on the emulator, insert a magic line that is
+          {                                           // supposed to cure the 'no config chosen' crash on emulator startup
+          setEGLConfigChooser(8, 8, 8, 8, 16, 0);   
+          }
+        
+        mRenderer = new DynamicRenderer(this);
+        setRenderer(mRenderer);
+        }
+      }
+
+///////////////////////////////////////////////////////////////////
+
+    public static void setMode(int mode)
+      {
+      di1D.setMode(mode);  
+      di2D.setMode(mode);
+      di3D.setMode(mode);
+      }
+      
+///////////////////////////////////////////////////////////////////
+    
+    public static void setScreenSize(int width, int height)
+      {
+      mScrW = width;
+      mScrH = height;
+      }
+
+///////////////////////////////////////////////////////////////////
+
+    public static void setDuration(int duration)
+      {
+      mDuration = duration;
+      
+      di1D.setDuration(duration);
+      di2D.setDuration(duration);
+      di3D.setDuration(duration);
+      }
+
+///////////////////////////////////////////////////////////////////
+
+    public static void setNoise(float noise)
+      {
+      mNoise = noise;
+      
+      di1D.setNoise(noise);
+      di2D.setNoise(noise);
+      di3D.setNoise(noise);
+      }
+    
+///////////////////////////////////////////////////////////////////
+
+    public static void setDimension(int dim)
+      {
+      if( currentDim != dim )
+        {
+        if( !(currentDim==DIM_3DXY && dim==DIM_3DXZ) && !(currentDim==DIM_3DXZ && dim==DIM_3DXY) )
+          {
+          synchronized(lock)
+            {
+            di1D.removeAll();
+            di2D.removeAll();
+            di3D.removeAll();
+            }
+          }
+      
+        currentDim = dim;
+        }
+      }
+    
+///////////////////////////////////////////////////////////////////
+    
+    public static void drawCurve(Canvas c, long time)
+      {
+      mPosition += (mTime>0 && mDuration>0) ? ((float)(time-mTime)*NUM_INTERPOLATIONS/mDuration) : 0; 
+         
+      synchronized(lock)
+        {
+        switch(currentDim)
+          {
+          case DIM_1D: drawCurve1D(c,time); break;
+          case DIM_2D: drawCurve2D(c,time); break;
+          default    : drawCurve3D(c,time); break;
+          }
+        }
+      
+      mTime = time;
+      }
+
+///////////////////////////////////////////////////////////////////
+      
+    private static void drawCurve1D(Canvas c, long time)
+      {
+      int len = di1D.getNumPoints();   
+        
+      mPaint.setColor(0xff000000);
+      
+      c.drawLine(0, DynamicRenderer.BHEI/2, DynamicRenderer.BWID, DynamicRenderer.BHEI/2, mPaint);
+      c.drawText("x", 0.95f* DynamicRenderer.BWID, 0.55f* DynamicRenderer.BHEI , mPaint);
+      
+      if( len>=2 )
+        {
+        for(int i=0; i<NUM_INTERPOLATIONS; i++) 
+          {
+          int color = i<=mPosition ? 0xff - ((int)mPosition                   -i)*0xff/(NUM_INTERPOLATIONS-1)  
+                                   : 0xff - ((int)mPosition+NUM_INTERPOLATIONS-i)*0xff/(NUM_INTERPOLATIONS-1);
+         
+          mPaint.setColor( 0xffffff + ((color&0xff)<<24) ); 
+          di1D.interpolate(mDrawCoord,0, (float)i/NUM_INTERPOLATIONS);
+          c.drawCircle(mDrawCoord[0], DynamicRenderer.BHEI/2 , 2.0f, mPaint );
+          }
+        }
+     
+      mPaint.setColor(0xffff0000);
+      
+      for(int curr=0; curr<len; curr++)
+        {      
+        p1D = di1D.getPoint(curr);
+        c.drawCircle(p1D.getX(), DynamicRenderer.BHEI/2 , 5.0f, mPaint);
+        }   
+      }
+    
+///////////////////////////////////////////////////////////////////
+      
+    private static void drawCurve2D(Canvas c, long time)
+      {
+      int len = di2D.getNumPoints();   
+        
+      mPaint.setColor(0xff000000);
+      
+      c.drawLine(0, DynamicRenderer.BHEI/2, DynamicRenderer.BWID, DynamicRenderer.BHEI/2, mPaint);
+      c.drawLine(DynamicRenderer.BWID/2, 0, DynamicRenderer.BWID/2, DynamicRenderer.BHEI, mPaint);
+      
+      c.drawText("x", 0.95f* DynamicRenderer.BWID, 0.55f* DynamicRenderer.BHEI , mPaint);
+      c.drawText("y", 0.55f* DynamicRenderer.BWID, 0.05f* DynamicRenderer.BHEI , mPaint);
+      
+      if( len>=2 )
+        {
+        for(int i=0; i<NUM_INTERPOLATIONS; i++) 
+          {
+          int color = i<=mPosition ? 0xff - ((int)mPosition                   -i)*0xff/(NUM_INTERPOLATIONS-1)  
+                                   : 0xff - ((int)mPosition+NUM_INTERPOLATIONS-i)*0xff/(NUM_INTERPOLATIONS-1);
+         
+          mPaint.setColor( 0xffffff + ((color&0xff)<<24) ); 
+          di2D.interpolate(mDrawCoord,0, (float)i/NUM_INTERPOLATIONS);
+          c.drawCircle(mDrawCoord[0], mDrawCoord[1], 2.0f, mPaint );
+          }
+        }
+     
+      mPaint.setColor(0xffff0000);
+      
+      for(int curr=0; curr<len; curr++)
+        {      
+        p2D = di2D.getPoint(curr);
+        c.drawCircle(p2D.getX(),p2D.getY(), 5.0f, mPaint);
+        }
+      }
+
+///////////////////////////////////////////////////////////////////
+      
+    private static void drawCurve3D(Canvas c, long time)
+      {
+      int len = di3D.getNumPoints();   
+      
+      mPaint.setColor(0xff000000);
+      
+      c.drawLine(0, DynamicRenderer.BHEI/2, DynamicRenderer.BWID, DynamicRenderer.BHEI/2, mPaint);
+      c.drawLine(DynamicRenderer.BWID/2, 0, DynamicRenderer.BWID/2, DynamicRenderer.BHEI, mPaint);
+      
+      c.drawText("x", 0.95f* DynamicRenderer.BWID, 0.55f* DynamicRenderer.BHEI , mPaint);
+      c.drawText( currentDim==DIM_3DXY ? "y" : "z", 0.55f* DynamicRenderer.BWID, 0.05f* DynamicRenderer.BHEI , mPaint);
+      
+      if( len>=2 )
+        {
+        for(int i=0; i<NUM_INTERPOLATIONS; i++) 
+          {
+          int color = i<=mPosition ? 0xff - ((int)mPosition                   -i)*0xff/(NUM_INTERPOLATIONS-1)  
+                                   : 0xff - ((int)mPosition+NUM_INTERPOLATIONS-i)*0xff/(NUM_INTERPOLATIONS-1);
+         
+          mPaint.setColor( 0xffffff + ((color&0xff)<<24) ); 
+          di3D.interpolate(mDrawCoord,0, (float)i/NUM_INTERPOLATIONS);
+          c.drawCircle(mDrawCoord[0], mDrawCoord[currentDim==DIM_3DXY ? 1:2], 2.0f, mPaint );
+          }
+        }
+     
+      mPaint.setColor(0xffff0000);
+      
+      for(int curr=0; curr<len; curr++)
+        {      
+        p3D = di3D.getPoint(curr);
+        c.drawCircle(p3D.getX(), currentDim==DIM_3DXY ? p3D.getY():p3D.getZ(), 5.0f, mPaint);
+        }   
+      }
+    
+///////////////////////////////////////////////////////////////////
+
+    private void addNewPoint(int x, int y)
+      {
+      float gx,gy,gz;
+      int len;
+      
+      switch(currentDim)
+        {
+        case DIM_1D: len = di1D.getNumPoints();
+                
+                     for(int g=0; g<len; g++)
+                       {
+                       p1D = di1D.getPoint(g);  
+                       gx = p1D.getX();
+                                    
+                       if( (xDown-gx)*(xDown-gx) < (DynamicRenderer.BHEI)*(DynamicRenderer.BHEI)/100 )
+                         {
+                         moving = g;
+                         break;
+                         }
+                       }
+                     if( moving<0 )
+                       {
+                       synchronized(lock)
+                         {
+                         if( len>=MAX_VECTORS ) di1D.removeAll();
+                         di1D.add(new Static1D(xDown));
+                         }
+                       }
+                     break;
+        case DIM_2D: len = di2D.getNumPoints();
+                                 
+                     for(int g=0; g<len; g++)
+                       {
+                       p2D = di2D.getPoint(g);  
+                       gx = p2D.getX();
+                       gy = p2D.getY();
+                                    
+                       if( (xDown-gx)*(xDown-gx) + (yDown-gy)*(yDown-gy) < (DynamicRenderer.BHEI)*(DynamicRenderer.BHEI)/100 )
+                         {
+                         moving = g;
+                         break;
+                         }
+                       }
+                     if( moving<0 )
+                       {
+                       synchronized(lock)
+                         {
+                         if( len>=MAX_VECTORS ) di2D.removeAll();
+                         di2D.add(new Static2D(xDown,yDown));
+                         }
+                       }
+                     break;
+        default    : len = di3D.getNumPoints();
+                                 
+                     for(int g=0; g<len; g++)
+                       {
+                       p3D = di3D.getPoint(g);  
+                       gx = p3D.getX();
+                       gy = p3D.getY();
+                       gz = p3D.getZ();
+                               
+                     if( currentDim==DIM_3DXY )
+                       {
+                       if( (xDown-gx)*(xDown-gx) + (yDown-gy)*(yDown-gy) < (DynamicRenderer.BHEI)*(DynamicRenderer.BHEI)/100 )
+                         {
+                         moving = g;
+                         break;
+                         }
+                       }
+                     if( currentDim==DIM_3DXZ )
+                       {
+                       if( (xDown-gx)*(xDown-gx) + (yDown-gz)*(yDown-gz) < (DynamicRenderer.BHEI)*(DynamicRenderer.BHEI)/100 )
+                         {
+                         moving = g;
+                         break;
+                         }
+                       }
+                     }
+                   if( moving<0 )
+                     { 
+                     synchronized(lock)
+                       {
+                       if( len>=MAX_VECTORS ) di3D.removeAll();
+                    
+                       if( currentDim==DIM_3DXY )
+                         {
+                         di3D.add(new Static3D(xDown,yDown, DynamicRenderer.BHEI/2));
+                         }
+                       if( currentDim==DIM_3DXZ )
+                         {
+                         di3D.add(new Static3D(xDown, DynamicRenderer.BHEI/2,yDown));
+                         }
+                       }
+                     }
+                   break; 
+        }
+      }
+    
+///////////////////////////////////////////////////////////////////
+    
+    @Override public boolean onTouchEvent(MotionEvent event) 
+      {
+      int action = event.getAction();
+          
+      switch(action)
+        {
+        case MotionEvent.ACTION_DOWN: xDown = (int)event.getX()* DynamicRenderer.BWID/mScrW;
+                                      yDown = (int)event.getY()* DynamicRenderer.BHEI/mScrH;
+                                      
+                                      addNewPoint(xDown,yDown);
+                                    
+                                      break;
+        case MotionEvent.ACTION_MOVE: if( moving>=0 )
+                                        {
+                                        xDown = (int)event.getX()* DynamicRenderer.BWID/mScrW;
+                                        yDown = (int)event.getY()* DynamicRenderer.BHEI/mScrH;
+                                        
+                                        switch(currentDim)
+                                          {
+                                          case DIM_1D  : di1D.setPoint(moving, xDown); 
+                                                         break;
+                                          case DIM_2D  : di2D.setPoint(moving, xDown, yDown);
+                                                         break;
+                                          case DIM_3DXY: di3D.setPoint(moving, xDown, yDown, (int)di3D.getPoint(moving).getZ());
+                                                         break;
+                                          case DIM_3DXZ: di3D.setPoint(moving, xDown, (int)di3D.getPoint(moving).getY(), yDown);
+                                                         break;
+                                          }
+                                        }                           
+                                      break;
+        case MotionEvent.ACTION_UP  : moving = -1;
+                                      break;
+        }
+            
+      return true;
+      }
+ 
+///////////////////////////////////////////////////////////////////
+  }
diff --git a/src/main/java/org/distorted/examples/fbo/FBORenderer.java b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
index 66ce464..a242ec2 100644
--- a/src/main/java/org/distorted/examples/fbo/FBORenderer.java
+++ b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
@@ -80,15 +80,15 @@ class FBORenderer implements GLSurfaceView.Renderer
         float factor = (float)height/lisaHeight;
 
         mLisa.move( new Static3D((width-w)/2,0,0) );
-        mLisa.scale( new Static3D(factor,factor,factor));
+        mLisa.scale(factor);
         }
       else
         {
         int h = (width*lisaHeight)/lisaWidth;
         float factor = (float)width/lisaWidth;
 
-        mLisa.move(  new Static3D(0,(height-h)/2,0) );
-        mLisa.scale( new Static3D(factor,factor,factor) );
+        mLisa.move( new Static3D(0,(height-h)/2,0) );
+        mLisa.scale(factor);
         }
       
       Distorted.onSurfaceChanged(width, height); 
@@ -133,19 +133,15 @@ class FBORenderer implements GLSurfaceView.Renderer
       float factor = lisaWidth/(1.5f*textWidth);
 
       mText.move( new Static3D(lisaWidth/6,lisaHeight/3,0) );
-      mText.scale( new Static3D(factor,factor,factor) );
+      mText.scale(factor);
 
-      Dynamic1D sinkDyn = new Dynamic1D();
-      sinkDyn.setDuration(5000);
-      sinkDyn.setCount(0);
+      Dynamic1D sinkDyn = new Dynamic1D(5000,0.0f);
       sinkDyn.add(new Static1D(1.0f));
       sinkDyn.add(new Static1D(0.5f));
 
       mText.sink(sinkDyn, new Static2D(textWidth/2,textHeight/2));
 
-      Dynamic1D macroblockDyn = new Dynamic1D();
-      macroblockDyn.setDuration(10000);
-      macroblockDyn.setCount(0);
+      Dynamic1D macroblockDyn = new Dynamic1D(10000,0.0f);
       macroblockDyn.add(new Static1D(1));
       macroblockDyn.add(new Static1D(5));
 
diff --git a/src/main/java/org/distorted/examples/girl/GirlRenderer.java b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
index 2690909..7cfe176 100644
--- a/src/main/java/org/distorted/examples/girl/GirlRenderer.java
+++ b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
@@ -74,27 +74,20 @@ class GirlRenderer implements GLSurfaceView.Renderer
       pLeft = new Static2D(132, 264);
       pRight= new Static2D(247, 264);
       
-      // Make the boobs bigger
+      // Size
       sinkRegion = new Static4D(0,0,60,60);
       
       s0 = new Static1D(boobsSink);
       
-      diSink = new Dynamic1D();
-      diSink.setCount(0.5f);
-      diSink.setDuration(0);
+      diSink = new Dynamic1D(0,0.5f);
       diSink.add(s0);
       
-      // Boobs Movement
+      // Upper Movement
       Region = new Static4D(0,0,45,45);
       
-      diL = new Dynamic3D();
-      diR = new Dynamic3D();
-      
-      diL.setCount(0.0f);
-      diR.setCount(0.0f);
-      diL.setDuration(1000);
-      diR.setDuration(1000);
-      
+      diL = new Dynamic3D(1000,0.0f);
+      diR = new Dynamic3D(1000,0.0f);
+
       v0 = new Static3D( 0,-boobsSwing, 0);
       v1 = new Static3D( boobsSwing, 0, 0);
       v2 = new Static3D( 0, boobsSwing, 0);
@@ -110,18 +103,16 @@ class GirlRenderer implements GLSurfaceView.Renderer
       diR.add(v2);
       diR.add(v1);
       
-      // Movement of the hips
+      // Lower Movement
       pHips = new Static2D(216,505);
       HipsRegion = new Static4D(0,0,120,120);
-      diHips = new Dynamic1D();
+      diHips = new Dynamic1D(1000,0.0f);
       
       d0 = new Static1D(-hipsSwirl);
       d1 = new Static1D(+hipsSwirl);
       
       diHips.add(d0);
       diHips.add(d1);
-      diHips.setDuration(1000);
-      diHips.setCount(0.0f);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -175,7 +166,7 @@ class GirlRenderer implements GLSurfaceView.Renderer
         float factor = (float)height/bmpHeight;
 
         mGirl.move( new Static3D((width-w)/2,0,0) );
-        mGirl.scale( new Static3D(factor,factor,factor) );
+        mGirl.scale(factor);
         }
       else
         {
@@ -183,7 +174,7 @@ class GirlRenderer implements GLSurfaceView.Renderer
         float factor = (float)width/bmpWidth;
 
         mGirl.move( new Static3D(0,(height-h)/2,0) );
-        mGirl.scale( new Static3D(factor,factor,factor) );
+        mGirl.scale(factor);
         }
       
       Distorted.onSurfaceChanged(width, height); 
diff --git a/src/main/java/org/distorted/examples/interpolator/InterpolatorActivity.java b/src/main/java/org/distorted/examples/interpolator/InterpolatorActivity.java
deleted file mode 100644
index 4ab34f9..0000000
--- a/src/main/java/org/distorted/examples/interpolator/InterpolatorActivity.java
+++ /dev/null
@@ -1,178 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2016 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted is free software: you can redistribute it and/or modify                             //
-// it under the terms of the GNU General Public License as published by                          //
-// the Free Software Foundation, either version 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted is distributed in the hope that it will be useful,                                  //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
-// GNU General Public License for more details.                                                  //
-//                                                                                               //
-// You should have received a copy of the GNU General Public License                             //
-// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.examples.interpolator;
-
-import org.distorted.library.Distorted;
-import org.distorted.library.type.Dynamic1D;
-import org.distorted.examples.R;
-
-import android.app.Activity;
-import android.opengl.GLSurfaceView;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.SeekBar;
-import android.widget.TextView;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-
-///////////////////////////////////////////////////////////////////
-
-public class InterpolatorActivity extends Activity implements OnSeekBarChangeListener
-    {
-    private SeekBar barD, barN;
-    private TextView textD, textN;
-   
-///////////////////////////////////////////////////////////////////
-    @Override
-    protected void onCreate(Bundle savedInstanceState) 
-      {
-      super.onCreate(savedInstanceState);
-      setContentView(R.layout.interpolatorlayout);
-      
-      barD = (SeekBar)findViewById(R.id.interpolatorSeekDuration);
-      barD.setOnSeekBarChangeListener(this); 
-      textD = (TextView)findViewById(R.id.interpolatorTextDuration);
-      
-      barN = (SeekBar)findViewById(R.id.interpolatorSeekNoise);
-      barN.setOnSeekBarChangeListener(this); 
-      textN = (TextView)findViewById(R.id.interpolatorTextNoise);
-      
-      barD.setProgress(50);
-      textD.setText("Duration: 10 s");
-      
-      barN.setProgress(0);
-      textN.setText("Noise: 0.0");
-      }
-
-///////////////////////////////////////////////////////////////////
-    @Override
-    protected void onResume() 
-      {
-      super.onResume();
-      
-      GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.interpolatorSurfaceView);
-      mView.onResume();
-      }
-
-///////////////////////////////////////////////////////////////////
-    @Override
-    protected void onPause() 
-      {
-      GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.interpolatorSurfaceView);
-      mView.onPause();
-         
-      super.onPause();
-      }
-    
-///////////////////////////////////////////////////////////////////
-    @Override
-    public void onStop()
-      {
-      super.onStop();
-      }
-
-///////////////////////////////////////////////////////////////////
-    @Override
-    public void onDestroy()
-      {  
-      Distorted.onDestroy();
-      super.onDestroy();
-      }     
- 
-///////////////////////////////////////////////////////////////////
-    
-    public void Loop(View v)
-      {
-      InterpolatorSurfaceView.setMode(Dynamic1D.MODE_LOOP);
-      }     
-    
-///////////////////////////////////////////////////////////////////
-
-    public void Path(View v)
-      {
-      InterpolatorSurfaceView.setMode(Dynamic1D.MODE_PATH);
-      }  
-
-///////////////////////////////////////////////////////////////////
-
-    public void Jump(View v)
-      {
-      InterpolatorSurfaceView.setMode(Dynamic1D.MODE_JUMP);
-      }  
-    
-///////////////////////////////////////////////////////////////////
-
-    public void Dim1D(View v)
-      {
-      InterpolatorSurfaceView.setDimension(InterpolatorSurfaceView.DIM_1D);
-      }  
-
-///////////////////////////////////////////////////////////////////
-
-    public void Dim2D(View v)
-      {
-      InterpolatorSurfaceView.setDimension(InterpolatorSurfaceView.DIM_2D);
-      }  
-    
-///////////////////////////////////////////////////////////////////
-
-    public void Dim3DXY(View v)
-      {
-      InterpolatorSurfaceView.setDimension(InterpolatorSurfaceView.DIM_3DXY);
-      }  
-
-///////////////////////////////////////////////////////////////////
-
-    public void Dim3DXZ(View v)
-      {
-      InterpolatorSurfaceView.setDimension(InterpolatorSurfaceView.DIM_3DXZ);
-      }  
-    
-///////////////////////////////////////////////////////////////////
-    
-    public void onProgressChanged(SeekBar bar, int progress, boolean fromUser) 
-      {
-      float v, t; 
-      int i;
-      
-      switch (bar.getId()) 
-        {
-        case R.id.interpolatorSeekDuration: v = progress*200;
-                                            i = (int)(v/100);
-                                            t = i/10.0f;
-                                            InterpolatorSurfaceView.setDuration((int)v);
-                                            textD.setText("Duration: "+(int)t+" s");
-                                            break;
-        case R.id.interpolatorSeekNoise   : InterpolatorSurfaceView.setNoise(progress/100.0f);
-                                            textN.setText("Noise: "+(progress/100.f));
-                                            break;
-        }
-      }
-
-///////////////////////////////////////////////////////////////////
-
-    public void onStartTrackingTouch(SeekBar bar) { }
-    
-///////////////////////////////////////////////////////////////////
-
-    public void onStopTrackingTouch(SeekBar bar)  { }
-    
-///////////////////////////////////////////////////////////////////
-// end of file
-}
diff --git a/src/main/java/org/distorted/examples/interpolator/InterpolatorRenderer.java b/src/main/java/org/distorted/examples/interpolator/InterpolatorRenderer.java
deleted file mode 100644
index 2205747..0000000
--- a/src/main/java/org/distorted/examples/interpolator/InterpolatorRenderer.java
+++ /dev/null
@@ -1,110 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2016 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted is free software: you can redistribute it and/or modify                             //
-// it under the terms of the GNU General Public License as published by                          //
-// the Free Software Foundation, either version 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted is distributed in the hope that it will be useful,                                  //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
-// GNU General Public License for more details.                                                  //
-//                                                                                               //
-// You should have received a copy of the GNU General Public License                             //
-// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.examples.interpolator;
-
-import javax.microedition.khronos.egl.EGLConfig;
-import javax.microedition.khronos.opengles.GL10;
-
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint.Style;
-import android.opengl.GLES20;
-import android.opengl.GLSurfaceView;
-
-import org.distorted.library.DistortedBitmap;
-import org.distorted.library.Distorted;
-import org.distorted.library.EffectTypes;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class InterpolatorRenderer implements GLSurfaceView.Renderer 
-   {  
-   public static final int BWID = 300;
-   public static final int BHEI = 400;
-   
-   private GLSurfaceView mView;
-   private DistortedBitmap mBackground;
-   private Canvas mCanvas;
-   private Bitmap mBitmap;
-   private Paint mPaint;
-   private int texWidth, texHeight;
-    
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-   public InterpolatorRenderer(GLSurfaceView v)
-     {    
-     mPaint = new Paint();
-     mPaint.setAntiAlias(true);
-     mPaint.setFakeBoldText(true);
-     mPaint.setColor(0xff447da7);
-     mPaint.setStyle(Style.FILL);
-      
-     mView = v;
-      
-     texWidth = BWID;
-     texHeight= BHEI;
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-   
-   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
-     {   
-     mBackground = new DistortedBitmap(texWidth,texHeight, 2);    
-     mBitmap = Bitmap.createBitmap(texWidth,texHeight, Bitmap.Config.ARGB_8888);
-     mCanvas = new Canvas(mBitmap);
-     
-     try
-        {
-        Distorted.onSurfaceCreated(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Renderer", ex.getMessage() );
-        }
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-   public void onSurfaceChanged(GL10 glUnused, int width, int height)
-     {
-     mBackground.abortEffects(EffectTypes.MATRIX);
-     mBackground.scale( new Static3D((float)width/texWidth,(float)height/texHeight,1) );
-     Distorted.onSurfaceChanged(width, height);
-     InterpolatorSurfaceView.setScreenSize(width,height);
-     }
-   
-///////////////////////////////////////////////////////////////////////////////////////////////////
-   
-   public void onDrawFrame(GL10 glUnused)
-     {   
-     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);               
-       
-     long time = System.currentTimeMillis();
-      
-     mCanvas.drawRect(0, 0, texWidth, texHeight, mPaint);
-     InterpolatorSurfaceView.drawCurve(mCanvas,time);
-     mBackground.setBitmap(mBitmap);
-     mBackground.draw(time);
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-  }
diff --git a/src/main/java/org/distorted/examples/interpolator/InterpolatorSurfaceView.java b/src/main/java/org/distorted/examples/interpolator/InterpolatorSurfaceView.java
deleted file mode 100644
index 267c8d3..0000000
--- a/src/main/java/org/distorted/examples/interpolator/InterpolatorSurfaceView.java
+++ /dev/null
@@ -1,441 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2016 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted is free software: you can redistribute it and/or modify                             //
-// it under the terms of the GNU General Public License as published by                          //
-// the Free Software Foundation, either version 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted is distributed in the hope that it will be useful,                                  //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
-// GNU General Public License for more details.                                                  //
-//                                                                                               //
-// You should have received a copy of the GNU General Public License                             //
-// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.examples.interpolator;
-
-import android.content.Context;
-import android.opengl.GLSurfaceView;
-import android.os.Build;
-import android.view.MotionEvent;
-import android.util.AttributeSet;
-import android.graphics.Canvas;
-import android.graphics.Paint.Style;
-import android.graphics.Paint;
-
-import org.distorted.library.type.Dynamic1D;
-import org.distorted.library.type.Dynamic2D;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static1D;
-import org.distorted.library.type.Static2D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////
-
-public class InterpolatorSurfaceView extends GLSurfaceView
-    {
-    public static final int DIM_1D   = 0; 
-    public static final int DIM_2D   = 1; 
-    public static final int DIM_3DXY = 2; 
-    public static final int DIM_3DXZ = 3; 
-   
-    private static final int NUM_INTERPOLATIONS= 100;
-    private static final int MAX_VECTORS       =   6;
-   
-    private InterpolatorRenderer mRenderer;
-    private static int xDown,yDown;
-    private static int mScrW, mScrH;
-   
-    private static Dynamic1D di1D;
-    private static Dynamic2D di2D;
-    private static Dynamic3D di3D;
-    
-    private static Paint mPaint;
-    private static int moving;
-    private static Object lock = new Object();
-    private static long mTime = 0;
-    private static int mDuration;
-    private static float mPosition;
-    private static float mNoise;
-    
-    private static int currentDim = DIM_2D;
-    
-    private static Static1D p1D;
-    private static Static2D p2D;
-    private static Static3D p3D;
-    
-    private static float[] mDrawCoord = new float[3];
-      
-///////////////////////////////////////////////////////////////////
-    
-    public InterpolatorSurfaceView(Context c, AttributeSet attrs) 
-      {
-      super(c, attrs);
-      
-      mPaint = new Paint();
-      mPaint.setStyle(Style.FILL);
-      mPaint.setAntiAlias(true);
-      
-      moving    = -1;
-      mDuration = 10000;
-      mPosition = 0;
-      mNoise    = 0.0f;
-      
-      di1D = new Dynamic1D();
-      di1D.setDuration(mDuration);
-      di1D.setNoise(mNoise);
-      
-      di2D = new Dynamic2D();
-      di2D.setDuration(mDuration);
-      di2D.setNoise(mNoise);
-      
-      di3D = new Dynamic3D();
-      di3D.setDuration(mDuration);
-      di3D.setNoise(mNoise);
-        
-      if(!isInEditMode())
-        {
-        setFocusable(true);
-        setFocusableInTouchMode(true);
-        
-        setEGLContextClientVersion(2);
-        
-        if( Build.FINGERPRINT.startsWith("generic") ) // when running on the emulator, insert a magic line that is
-          {                                           // supposed to cure the 'no config chosen' crash on emulator startup
-          setEGLConfigChooser(8, 8, 8, 8, 16, 0);   
-          }
-        
-        mRenderer = new InterpolatorRenderer(this);
-        setRenderer(mRenderer);
-        }
-      }
-
-///////////////////////////////////////////////////////////////////
-
-    public static void setMode(int mode)
-      {
-      di1D.setMode(mode);  
-      di2D.setMode(mode);
-      di3D.setMode(mode);
-      }
-      
-///////////////////////////////////////////////////////////////////
-    
-    public static void setScreenSize(int width, int height)
-      {
-      mScrW = width;
-      mScrH = height;
-      }
-
-///////////////////////////////////////////////////////////////////
-
-    public static void setDuration(int duration)
-      {
-      mDuration = duration;
-      
-      di1D.setDuration(duration);
-      di2D.setDuration(duration);
-      di3D.setDuration(duration);
-      }
-
-///////////////////////////////////////////////////////////////////
-
-    public static void setNoise(float noise)
-      {
-      mNoise = noise;
-      
-      di1D.setNoise(noise);
-      di2D.setNoise(noise);
-      di3D.setNoise(noise);
-      }
-    
-///////////////////////////////////////////////////////////////////
-
-    public static void setDimension(int dim)
-      {
-      if( currentDim != dim )
-        {
-        if( !(currentDim==DIM_3DXY && dim==DIM_3DXZ) && !(currentDim==DIM_3DXZ && dim==DIM_3DXY) )
-          {
-          synchronized(lock)
-            {
-            di1D.removeAll();
-            di2D.removeAll();
-            di3D.removeAll();
-            }
-          }
-      
-        currentDim = dim;
-        }
-      }
-    
-///////////////////////////////////////////////////////////////////
-    
-    public static void drawCurve(Canvas c, long time)
-      {
-      mPosition += (mTime>0 && mDuration>0) ? ((float)(time-mTime)*NUM_INTERPOLATIONS/mDuration) : 0; 
-         
-      synchronized(lock)
-        {
-        switch(currentDim)
-          {
-          case DIM_1D: drawCurve1D(c,time); break;
-          case DIM_2D: drawCurve2D(c,time); break;
-          default    : drawCurve3D(c,time); break;
-          }
-        }
-      
-      mTime = time;
-      }
-
-///////////////////////////////////////////////////////////////////
-      
-    private static void drawCurve1D(Canvas c, long time)
-      {
-      int len = di1D.getNumPoints();   
-        
-      mPaint.setColor(0xff000000);
-      
-      c.drawLine(0, InterpolatorRenderer.BHEI/2, InterpolatorRenderer.BWID, InterpolatorRenderer.BHEI/2, mPaint);
-      c.drawText("x", 0.95f*InterpolatorRenderer.BWID, 0.55f*InterpolatorRenderer.BHEI , mPaint);
-      
-      if( len>=2 )
-        {
-        for(int i=0; i<NUM_INTERPOLATIONS; i++) 
-          {
-          int color = i<=mPosition ? 0xff - ((int)mPosition                   -i)*0xff/(NUM_INTERPOLATIONS-1)  
-                                   : 0xff - ((int)mPosition+NUM_INTERPOLATIONS-i)*0xff/(NUM_INTERPOLATIONS-1);
-         
-          mPaint.setColor( 0xffffff + ((color&0xff)<<24) ); 
-          di1D.interpolate(mDrawCoord,0, (float)i/NUM_INTERPOLATIONS);
-          c.drawCircle(mDrawCoord[0], InterpolatorRenderer.BHEI/2 , 2.0f, mPaint );
-          }
-        }
-     
-      mPaint.setColor(0xffff0000);
-      
-      for(int curr=0; curr<len; curr++)
-        {      
-        p1D = di1D.getPoint(curr);
-        c.drawCircle(p1D.getX(), InterpolatorRenderer.BHEI/2 , 5.0f, mPaint);
-        }   
-      }
-    
-///////////////////////////////////////////////////////////////////
-      
-    private static void drawCurve2D(Canvas c, long time)
-      {
-      int len = di2D.getNumPoints();   
-        
-      mPaint.setColor(0xff000000);
-      
-      c.drawLine(0, InterpolatorRenderer.BHEI/2, InterpolatorRenderer.BWID, InterpolatorRenderer.BHEI/2, mPaint);
-      c.drawLine(InterpolatorRenderer.BWID/2, 0, InterpolatorRenderer.BWID/2, InterpolatorRenderer.BHEI, mPaint);
-      
-      c.drawText("x", 0.95f*InterpolatorRenderer.BWID, 0.55f*InterpolatorRenderer.BHEI , mPaint);
-      c.drawText("y", 0.55f*InterpolatorRenderer.BWID, 0.05f*InterpolatorRenderer.BHEI , mPaint);
-      
-      if( len>=2 )
-        {
-        for(int i=0; i<NUM_INTERPOLATIONS; i++) 
-          {
-          int color = i<=mPosition ? 0xff - ((int)mPosition                   -i)*0xff/(NUM_INTERPOLATIONS-1)  
-                                   : 0xff - ((int)mPosition+NUM_INTERPOLATIONS-i)*0xff/(NUM_INTERPOLATIONS-1);
-         
-          mPaint.setColor( 0xffffff + ((color&0xff)<<24) ); 
-          di2D.interpolate(mDrawCoord,0, (float)i/NUM_INTERPOLATIONS);
-          c.drawCircle(mDrawCoord[0], mDrawCoord[1], 2.0f, mPaint );
-          }
-        }
-     
-      mPaint.setColor(0xffff0000);
-      
-      for(int curr=0; curr<len; curr++)
-        {      
-        p2D = di2D.getPoint(curr);
-        c.drawCircle(p2D.getX(),p2D.getY(), 5.0f, mPaint);
-        }
-      }
-
-///////////////////////////////////////////////////////////////////
-      
-    private static void drawCurve3D(Canvas c, long time)
-      {
-      int len = di3D.getNumPoints();   
-      
-      mPaint.setColor(0xff000000);
-      
-      c.drawLine(0, InterpolatorRenderer.BHEI/2, InterpolatorRenderer.BWID, InterpolatorRenderer.BHEI/2, mPaint);
-      c.drawLine(InterpolatorRenderer.BWID/2, 0, InterpolatorRenderer.BWID/2, InterpolatorRenderer.BHEI, mPaint);
-      
-      c.drawText("x", 0.95f*InterpolatorRenderer.BWID, 0.55f*InterpolatorRenderer.BHEI , mPaint);
-      c.drawText( currentDim==DIM_3DXY ? "y" : "z", 0.55f*InterpolatorRenderer.BWID, 0.05f*InterpolatorRenderer.BHEI , mPaint);
-      
-      if( len>=2 )
-        {
-        for(int i=0; i<NUM_INTERPOLATIONS; i++) 
-          {
-          int color = i<=mPosition ? 0xff - ((int)mPosition                   -i)*0xff/(NUM_INTERPOLATIONS-1)  
-                                   : 0xff - ((int)mPosition+NUM_INTERPOLATIONS-i)*0xff/(NUM_INTERPOLATIONS-1);
-         
-          mPaint.setColor( 0xffffff + ((color&0xff)<<24) ); 
-          di3D.interpolate(mDrawCoord,0, (float)i/NUM_INTERPOLATIONS);
-          c.drawCircle(mDrawCoord[0], mDrawCoord[currentDim==DIM_3DXY ? 1:2], 2.0f, mPaint );
-          }
-        }
-     
-      mPaint.setColor(0xffff0000);
-      
-      for(int curr=0; curr<len; curr++)
-        {      
-        p3D = di3D.getPoint(curr);
-        c.drawCircle(p3D.getX(), currentDim==DIM_3DXY ? p3D.getY():p3D.getZ(), 5.0f, mPaint);
-        }   
-      }
-    
-///////////////////////////////////////////////////////////////////
-
-    private void addNewPoint(int x, int y)
-      {
-      float gx,gy,gz;
-      int len;
-      
-      switch(currentDim)
-        {
-        case DIM_1D: len = di1D.getNumPoints();
-                
-                     for(int g=0; g<len; g++)
-                       {
-                       p1D = di1D.getPoint(g);  
-                       gx = p1D.getX();
-                                    
-                       if( (xDown-gx)*(xDown-gx) < (InterpolatorRenderer.BHEI)*(InterpolatorRenderer.BHEI)/100 )
-                         {
-                         moving = g;
-                         break;
-                         }
-                       }
-                     if( moving<0 )
-                       {
-                       synchronized(lock)
-                         {
-                         if( len>=MAX_VECTORS ) di1D.removeAll();
-                         di1D.add(new Static1D(xDown));
-                         }
-                       }
-                     break;
-        case DIM_2D: len = di2D.getNumPoints();
-                                 
-                     for(int g=0; g<len; g++)
-                       {
-                       p2D = di2D.getPoint(g);  
-                       gx = p2D.getX();
-                       gy = p2D.getY();
-                                    
-                       if( (xDown-gx)*(xDown-gx) + (yDown-gy)*(yDown-gy) < (InterpolatorRenderer.BHEI)*(InterpolatorRenderer.BHEI)/100 )
-                         {
-                         moving = g;
-                         break;
-                         }
-                       }
-                     if( moving<0 )
-                       {
-                       synchronized(lock)
-                         {
-                         if( len>=MAX_VECTORS ) di2D.removeAll();
-                         di2D.add(new Static2D(xDown,yDown));
-                         }
-                       }
-                     break;
-        default    : len = di3D.getNumPoints();
-                                 
-                     for(int g=0; g<len; g++)
-                       {
-                       p3D = di3D.getPoint(g);  
-                       gx = p3D.getX();
-                       gy = p3D.getY();
-                       gz = p3D.getZ();
-                               
-                     if( currentDim==DIM_3DXY )
-                       {
-                       if( (xDown-gx)*(xDown-gx) + (yDown-gy)*(yDown-gy) < (InterpolatorRenderer.BHEI)*(InterpolatorRenderer.BHEI)/100 )
-                         {
-                         moving = g;
-                         break;
-                         }
-                       }
-                     if( currentDim==DIM_3DXZ )
-                       {
-                       if( (xDown-gx)*(xDown-gx) + (yDown-gz)*(yDown-gz) < (InterpolatorRenderer.BHEI)*(InterpolatorRenderer.BHEI)/100 )
-                         {
-                         moving = g;
-                         break;
-                         }
-                       }
-                     }
-                   if( moving<0 )
-                     { 
-                     synchronized(lock)
-                       {
-                       if( len>=MAX_VECTORS ) di3D.removeAll();
-                    
-                       if( currentDim==DIM_3DXY )
-                         {
-                         di3D.add(new Static3D(xDown,yDown,InterpolatorRenderer.BHEI/2));
-                         }
-                       if( currentDim==DIM_3DXZ )
-                         {
-                         di3D.add(new Static3D(xDown,InterpolatorRenderer.BHEI/2,yDown));
-                         }
-                       }
-                     }
-                   break; 
-        }
-      }
-    
-///////////////////////////////////////////////////////////////////
-    
-    @Override public boolean onTouchEvent(MotionEvent event) 
-      {
-      int action = event.getAction();
-          
-      switch(action)
-        {
-        case MotionEvent.ACTION_DOWN: xDown = (int)event.getX()*InterpolatorRenderer.BWID/mScrW; 
-                                      yDown = (int)event.getY()*InterpolatorRenderer.BHEI/mScrH;
-                                      
-                                      addNewPoint(xDown,yDown);
-                                    
-                                      break;
-        case MotionEvent.ACTION_MOVE: if( moving>=0 )
-                                        {
-                                        xDown = (int)event.getX()*InterpolatorRenderer.BWID/mScrW; 
-                                        yDown = (int)event.getY()*InterpolatorRenderer.BHEI/mScrH;
-                                        
-                                        switch(currentDim)
-                                          {
-                                          case DIM_1D  : di1D.setPoint(moving, xDown); 
-                                                         break;
-                                          case DIM_2D  : di2D.setPoint(moving, xDown, yDown);
-                                                         break;
-                                          case DIM_3DXY: di3D.setPoint(moving, xDown, yDown, (int)di3D.getPoint(moving).getZ());
-                                                         break;
-                                          case DIM_3DXZ: di3D.setPoint(moving, xDown, (int)di3D.getPoint(moving).getY(), yDown);
-                                                         break;
-                                          }
-                                        }                           
-                                      break;
-        case MotionEvent.ACTION_UP  : moving = -1;
-                                      break;
-        }
-            
-      return true;
-      }
- 
-///////////////////////////////////////////////////////////////////
-  }
diff --git a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
index 6ec4254..982fe63 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
@@ -72,9 +72,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
       int pointy   = mRnd.nextInt( (int)(0.8f*bmpHeight))+ (int)(0.1f*bmpHeight); // 
       int duration = 1000 + mRnd.nextInt(3000);                                   // for anytime from 3 to 4 seconds 
 
-      Dynamic3D dDistort = new Dynamic3D();
-      dDistort.setCount(1);
-      dDistort.setDuration(duration);
+      Dynamic3D dDistort = new Dynamic3D(duration,1.0f);
       dDistort.add(new Static3D(0,0,     0));
       dDistort.add(new Static3D(0,0,height));
 
@@ -115,7 +113,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
         float factor = (float)height/bmpHeight;
 
         water.move( new Static3D((width-w)/2,0,0) );
-        water.scale( new Static3D(factor,factor,factor) );
+        water.scale(factor);
         }
       else
         {
@@ -123,7 +121,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
         float factor = (float)width/bmpWidth;
 
         water.move( new Static3D(0,(height-h)/2,0) );
-        water.scale( new Static3D(factor,factor,factor) );
+        water.scale(factor);
         }
       
       Distorted.onSurfaceChanged(width, height); 
diff --git a/src/main/java/org/distorted/examples/macroblock/MacroblockRenderer.java b/src/main/java/org/distorted/examples/macroblock/MacroblockRenderer.java
index 592bae3..0d53f62 100644
--- a/src/main/java/org/distorted/examples/macroblock/MacroblockRenderer.java
+++ b/src/main/java/org/distorted/examples/macroblock/MacroblockRenderer.java
@@ -32,7 +32,6 @@ import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static1D;
-import org.distorted.library.type.Static2D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 
@@ -95,17 +94,13 @@ class MacroblockRenderer implements GLSurfaceView.Renderer
       
       macroblock = new DistortedBitmap(bitmap, 30);
 
-      Dynamic1D macroblockDyn = new Dynamic1D();
-      macroblockDyn.setDuration(3000);
-      macroblockDyn.setCount(0);
+      Dynamic1D macroblockDyn = new Dynamic1D(3000,0.0f);
       macroblockDyn.add(new Static1D( 1));
       macroblockDyn.add(new Static1D(30));
 
       macroblock.macroblock(macroblockDyn, macRegion);
 
-      Dynamic1D alphaDyn = new Dynamic1D();
-      alphaDyn.setDuration(3000);
-      alphaDyn.setCount(0);
+      Dynamic1D alphaDyn = new Dynamic1D(3000,0.0f);
       alphaDyn.add(new Static1D(1));
       alphaDyn.add(new Static1D(0));
 
@@ -127,21 +122,15 @@ class MacroblockRenderer implements GLSurfaceView.Renderer
       {
       int duration = 10000;   
       
-      Dynamic3D diMove = new Dynamic3D();
-      diMove.setCount(0.0f);
-      diMove.setDuration(duration);
+      Dynamic3D diMove = new Dynamic3D(duration,0.0f);
       diMove.add(new Static3D(width-bmpWidth,height-bmpHeight,0));
       diMove.add(new Static3D(0,0,0));
       
-      Dynamic3D diScale = new Dynamic3D();
-      diScale.setCount(0.0f);
-      diScale.setDuration(duration);
+      Dynamic3D diScale = new Dynamic3D(duration,0.0f);
       diScale.add(new Static3D(1,1,1));
       diScale.add(new Static3D(0.33f,0.33f,1));
       
-      Dynamic1D diRotate = new Dynamic1D();
-      diRotate.setCount(0.0f);
-      diRotate.setDuration(duration);
+      Dynamic1D diRotate = new Dynamic1D(duration,0.0f);
       diRotate.add(new Static1D(  0));
       diRotate.add(new Static1D(360));
       
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
index e6b6e83..37ea7a9 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
@@ -63,14 +63,8 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
       rLeft = new Static4D(-10,-10,25,25);
       rRight= new Static4D( 10, -5,25,25);
 
-      dLeft = new Dynamic3D();
-      dRight= new Dynamic3D();
-
-      dLeft.setDuration(1000);
-      dRight.setDuration(1000);
-
-      dLeft.setCount(0);
-      dRight.setCount(0);
+      dLeft = new Dynamic3D(1000,0.0f);
+      dRight= new Dynamic3D(1000,0.0f);
 
       dLeft.add( new Static3D(  0,  0,0) );
       dLeft.add( new Static3D(-20,-20,0) );
@@ -101,7 +95,7 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
         float factor = (float)height/bmpHeight;
 
         monaLisa.move( new Static3D((width-w)/2,0,0) );
-        monaLisa.scale( new Static3D(factor,factor,factor) );
+        monaLisa.scale(factor);
         }
       else
         {
@@ -109,7 +103,7 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
         float factor = (float)width/bmpWidth;
 
         monaLisa.move( new Static3D(0,(height-h)/2,0) );
-        monaLisa.scale( new Static3D(factor,factor,factor) );
+        monaLisa.scale(factor);
         }
       
       Distorted.onSurfaceChanged(width, height); 
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
index 35d8c43..b4850bf 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
@@ -79,15 +79,9 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
       mPaint.setStyle(Style.FILL);
       moving = -1;
       
-      di2D = new Dynamic2D();
-      di2D.setCount(0.0f);
-      di2D.setDuration(LOOP_TIME);
-
-      dr = new Static4D(0,0,60,60);
-
-      mRegion = new Dynamic4D();
-      mRegion.setCount(0);
-      mRegion.setDuration(LOOP_TIME);
+      di2D    = new Dynamic2D(LOOP_TIME,0.0f);
+      mRegion = new Dynamic4D(LOOP_TIME,0.0f);
+      dr      = new Static4D(0,0,60,60);
 
       if(!isInEditMode())
         {
diff --git a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
index 3cc3e69..82ad44d 100644
--- a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
+++ b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
@@ -65,10 +65,8 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
       
       mScreen = new DistortedNode(new DistortedBitmap(9*LEAF_SIZE,9*LEAF_SIZE,1));
      
-      mRot = new Dynamic1D();
+      mRot = new Dynamic1D(5000,0.0f);
       mRot.setMode(Dynamic1D.MODE_JUMP);
-      mRot.setCount(0.0f);
-      mRot.setDuration(5000);
       mRot.add(new Static1D(  0));
       mRot.add(new Static1D(360));
       
@@ -105,7 +103,7 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
         tmp = (DistortedBitmap)mCircleNode[i].getObject();
         tmp.move( new Static3D(positions[2*i], positions[2*i+1], 0) );
         tmp.rotate( center, mRot, axis );
-        tmp.chroma( new Static4D(0.8f, colors[3*i],colors[3*i+1], colors[3*i+2]) );
+        tmp.chroma( new Static1D(0.8f), new Static3D(colors[3*i],colors[3*i+1], colors[3*i+2]) );
         }
       }
 
@@ -135,7 +133,7 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
         float factor = (float)height/bmpHeight;
 
         bmp.move( new Static3D((width-w)/2 ,0, 0) );
-        bmp.scale( new Static3D(factor,factor,factor) );
+        bmp.scale( factor );
         }
       else
         {
@@ -143,7 +141,7 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
         float factor = (float)width/bmpWidth;
 
         bmp.move( new Static3D(0,(height-h)/2,0) );
-        bmp.scale( new Static3D(factor,factor,factor) );
+        bmp.scale( factor );
         }
       
       Distorted.onSurfaceChanged(width, height); 
diff --git a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
index cc41dc7..53459a2 100644
--- a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
+++ b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
@@ -84,14 +84,8 @@ public class RenderThread extends Thread
     rLeft = new Static4D(-10,-10,25,25);
     rRight= new Static4D( 10, -5,25,25);
 
-    dLeft = new Dynamic3D();
-    dRight= new Dynamic3D();
-
-    dLeft.setDuration(1000);
-    dRight.setDuration(1000);
-
-    dLeft.setCount(0);
-    dRight.setCount(0);
+    dLeft = new Dynamic3D(1000,0.0f);
+    dRight= new Dynamic3D(1000,0.0f);
 
     dLeft.add( new Static3D(  0,  0,0) );
     dLeft.add( new Static3D(-20,-20,0) );
@@ -225,7 +219,7 @@ public class RenderThread extends Thread
       float factor = (float)height/bmpHeight;
 
       monaLisa.move( new Static3D((width-w)/2,0,0) );
-      monaLisa.scale( new Static3D(factor,factor,factor) );
+      monaLisa.scale( factor );
       }
     else
       {
@@ -233,7 +227,7 @@ public class RenderThread extends Thread
       float factor = (float)width/bmpWidth;
 
       monaLisa.move( new Static3D(0,(height-h)/2,0) );
-      monaLisa.scale( new Static3D(factor,factor,factor) );
+      monaLisa.scale( factor );
       }
 
     Distorted.onSurfaceChanged(width, height);
diff --git a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
index 656fc8a..a50a92c 100644
--- a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
+++ b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
@@ -101,13 +101,13 @@ class QuaternionRenderer implements GLSurfaceView.Renderer
       {
       float factor = height/(3.0f*SIZE);
       mCube.move( new Static3D((width-height)/2,0,0) );
-      mCube.scale( new Static3D(factor,factor,factor) );
+      mCube.scale(factor);
       }  
     else
       {
       float factor = width/(3.0f*SIZE);
       mCube.move( new Static3D(0,(height-width)/2,0) );
-      mCube.scale( new Static3D(factor,factor,factor) );
+      mCube.scale(factor);
       }
      
     mCube.quaternion( new Static3D(3*SIZE/2,3*SIZE/2,0), mRot);
diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
index b83c301..7e07031 100644
--- a/src/main/java/org/distorted/examples/save/SaveRenderer.java
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -80,9 +80,7 @@ class SaveRenderer implements GLSurfaceView.Renderer
       
     s0 = new Static1D(boobsSink);
       
-    diSink = new Dynamic1D();
-    diSink.setCount(0.5f);
-    diSink.setDuration(0);
+    diSink = new Dynamic1D(0,0.5f);
     diSink.add(s0);
     }
 
@@ -170,7 +168,7 @@ class SaveRenderer implements GLSurfaceView.Renderer
       float factor = (float)height/bmpHeight;
 
       mGirl.move( new Static3D((width-w)/2,0,0) );
-      mGirl.scale( new Static3D(factor,factor,factor) );
+      mGirl.scale(factor);
       }
     else
       {
@@ -178,7 +176,7 @@ class SaveRenderer implements GLSurfaceView.Renderer
       float factor = (float)width/bmpWidth;
 
       mGirl.move( new Static3D(0,(height-h)/2,0) );
-      mGirl.scale(new Static3D(factor,factor,factor));
+      mGirl.scale(factor);
       }
       
     Distorted.onSurfaceChanged(width, height);
diff --git a/src/main/java/org/distorted/examples/scratchpad/ScratchpadSurfaceView.java b/src/main/java/org/distorted/examples/scratchpad/ScratchpadSurfaceView.java
index e2682d7..da72cd6 100644
--- a/src/main/java/org/distorted/examples/scratchpad/ScratchpadSurfaceView.java
+++ b/src/main/java/org/distorted/examples/scratchpad/ScratchpadSurfaceView.java
@@ -60,9 +60,7 @@ public class ScratchpadSurfaceView extends GLSurfaceView
     mDuration = 10000;
     mCount    = 1.0f;
       
-    mInterD = new Dynamic3D();
-    mInterD.setDuration(mDuration);
-    mInterD.setCount(mCount);
+    mInterD = new Dynamic3D(mDuration,mCount);
 
     int h = 30;
     int r = 20;
@@ -77,27 +75,19 @@ public class ScratchpadSurfaceView extends GLSurfaceView
     mInterD.add(v2);
     mInterD.add(v3);
 
-    mInterA = new Dynamic1D();
-    mInterA.setDuration(mDuration);
-    mInterA.setCount(mCount);
+    mInterA = new Dynamic1D(mDuration,mCount);
     mInterA.add(new Static1D(1));
     mInterA.add(new Static1D(0));
 
-    mInterS = new Dynamic1D();
-    mInterS.setDuration(mDuration);
-    mInterS.setCount(mCount);
+    mInterS = new Dynamic1D(mDuration,mCount);
     mInterS.add(new Static1D(1.0f));
     mInterS.add(new Static1D(0.3f));
 
-    mInterB = new Dynamic1D();
-    mInterB.setDuration(mDuration);
-    mInterB.setCount(mCount);
+    mInterB = new Dynamic1D(mDuration,mCount);
     mInterB.add(new Static1D(1));
     mInterB.add(new Static1D(0));
 
-    mInterM = new Dynamic1D();
-    mInterM.setDuration(mDuration);
-    mInterM.setCount(mCount);
+    mInterM = new Dynamic1D(mDuration,mCount);
     mInterM.add(new Static1D(1));
     mInterM.add(new Static1D(10));
 
diff --git a/src/main/java/org/distorted/examples/sink/SinkRenderer.java b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
index 6032c45..45b94d4 100644
--- a/src/main/java/org/distorted/examples/sink/SinkRenderer.java
+++ b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
@@ -84,7 +84,7 @@ class SinkRenderer implements GLSurfaceView.Renderer
       float factor = (float)height/bmpHeight;
 
       sinkBmp.move( new Static3D((width-w)/2,0,0) );
-      sinkBmp.scale( new Static3D(factor,factor,factor) );
+      sinkBmp.scale( factor );
       }
     else
       {
@@ -92,7 +92,7 @@ class SinkRenderer implements GLSurfaceView.Renderer
       float factor = (float)width/bmpWidth;
 
       sinkBmp.move( new Static3D(0,(height-h)/2,0) );
-      sinkBmp.scale( new Static3D(factor,factor,factor) );
+      sinkBmp.scale( factor );
       }
       
     Distorted.onSurfaceChanged(width, height); 
@@ -121,9 +121,7 @@ class SinkRenderer implements GLSurfaceView.Renderer
     bmpHeight = bitmap.getHeight();
     bmpWidth  = bitmap.getWidth();
 
-    Dynamic1D dSink = new Dynamic1D();
-    dSink.setDuration(2000);
-    dSink.setCount(0);
+    Dynamic1D dSink = new Dynamic1D(2000,0.0f);
     dSink.add(new Static1D( 1));
     dSink.add(new Static1D(10));
 
diff --git a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
index 538423e..6976cb2 100644
--- a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
+++ b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
@@ -32,7 +32,6 @@ import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.DistortedNode;
 import org.distorted.library.type.Static1D;
-import org.distorted.library.type.Static2D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 import org.distorted.library.message.EffectListener;
@@ -179,9 +178,7 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
       mStars[i].scale( new Static3D(randomS,randomS,randomS) );
       mStars[i].rotate( center, new Static1D(randomA), axis);
       
-      Dynamic1D di = new Dynamic1D();
-      di.setDuration(randomTime);
-      di.setCount(0.0f);
+      Dynamic1D di = new Dynamic1D(randomTime,0.0f);
       di.setNoise(0.5f);
       di.add(new Static1D(randomAlpha1));
       di.add(new Static1D(randomAlpha2));
@@ -193,9 +190,7 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
       
     float scale = (0.5f*w/mGFFA.getWidth());
     
-    Dynamic1D di = new Dynamic1D();
-    di.setDuration(6000);
-    di.setCount(0.5f);
+    Dynamic1D di = new Dynamic1D(6000,0.5f);
     di.add(new Static1D(1.0f));
     di.add(new Static1D(1.0f));
     di.add(new Static1D(0.0f));
@@ -349,13 +344,10 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
         int initSize= (int)(3.0f*screenW/logoW);
         int finaSize= (int)(0.1f*screenW/logoW);
       
-        Dynamic3D di = new Dynamic3D();
-      
+        Dynamic3D di = new Dynamic3D(10000,0.5f);
         di.add(new Static3D(initSize,initSize,1));
         di.add(new Static3D(finaSize,finaSize,1));
-        di.setCount(0.5f);
-        di.setDuration(10000);
-      
+
         mLogo.move( new Static3D(screenW/2,screenH/2,0) );
         mLogo.scale(di);
         mLogo.move( new Static3D(-logoW/2,-logoH/2,0) );
@@ -375,9 +367,7 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
         int backH  = mCrawlBackground.getHeight();
         float scale= (float)screenW/crawlW;
       
-        Dynamic3D di = new Dynamic3D();
-        di.setCount(0.5f);
-        di.setDuration(60000);
+        Dynamic3D di = new Dynamic3D(60000,0.5f);
         di.add(new Static3D(screenW/2,+backH       , 0));
         di.add(new Static3D(screenW/2,-scale*crawlH, 0));
         
diff --git a/src/main/res/drawable-hdpi/icon_example_dynamic.png b/src/main/res/drawable-hdpi/icon_example_dynamic.png
new file mode 100644
index 0000000..e1fd4ad
Binary files /dev/null and b/src/main/res/drawable-hdpi/icon_example_dynamic.png differ
diff --git a/src/main/res/drawable-hdpi/icon_example_interpolator.png b/src/main/res/drawable-hdpi/icon_example_interpolator.png
deleted file mode 100644
index e1fd4ad..0000000
Binary files a/src/main/res/drawable-hdpi/icon_example_interpolator.png and /dev/null differ
diff --git a/src/main/res/layout/interpolatorlayout.xml b/src/main/res/layout/interpolatorlayout.xml
index a64782a..2bb8770 100644
--- a/src/main/res/layout/interpolatorlayout.xml
+++ b/src/main/res/layout/interpolatorlayout.xml
@@ -6,7 +6,7 @@
     android:gravity="fill_horizontal"
     android:orientation="vertical" >
 
-    <org.distorted.examples.interpolator.InterpolatorSurfaceView
+    <org.distorted.examples.dynamic.DynamicSurfaceView
         android:id="@+id/interpolatorSurfaceView"
         android:layout_width="fill_parent"
         android:layout_height="0dp"
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 68f18cb..5728a6e 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -53,8 +53,8 @@
     <string name="example_deform_subtitle">Deform the whole bitmap or Distort a part of it.</string>
     <string name="example_listener">DistortedListener</string>  
     <string name="example_listener_subtitle">Listen on effect events and react on them.</string>
-    <string name="example_interpolator">Interpolator</string>  
-    <string name="example_interpolator_subtitle">Not an effect in itself, but rather a building block for other effects.</string>
+    <string name="example_dynamic">Dynamics</string>
+    <string name="example_dynamic_subtitle">Not an effect in itself, but rather a building block for other effects.</string>
     <string name="example_girl">Girl</string>  
     <string name="example_girl_subtitle">Distort, Sink and Swirl effects all in one.</string>
     <string name="example_macroblock">Cat and Dog</string>  
