commit f6d884d58bea4d27a9b5beaa3af8d6415cd02587
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Tue Dec 13 12:42:14 2016 +0000

    Complete the split DistortedObject -> (DistortedTexture,DistortedEffectQueue)

diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java
index da436f8..afc8f27 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java
@@ -21,17 +21,14 @@ package org.distorted.examples.aroundtheworld;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-import org.distorted.library.DistortedObject;
-import org.distorted.library.type.Dynamic;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic2D;
 import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Dynamic5D;
 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.type.Static5D;
 
 class AroundTheWorldEffectsManager
   {
@@ -258,39 +255,39 @@ class AroundTheWorldEffectsManager
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  synchronized void apply(DistortedObject obj)
+  synchronized void apply(DistortedEffectQueues queues)
     {
     setRace(mBlackness, mAsianness);
 
     // WHITENESS
-    obj.sink(wLipsDyn, wLipsCenter, wLipsRegion);
+    queues.sink(wLipsDyn, wLipsCenter, wLipsRegion);
 
     // ASIANNESS
-    obj.distort(aLipsNoseDyn, aLipsNoseCenter, aLipsNoseRegion);
-    obj.pinch(aNoseBroaderDyn, aNoseBroaderCenter, aNoseBroaderRegion);
-    obj.distort(aNostrilsDyn, aNostrilsCenter, aNostrilsRegion);
-    obj.swirl(aLEyeDyn, aLEyeCenter, aEyesRegion);
-    obj.swirl(aREyeDyn, aREyeCenter, aEyesRegion);
-    obj.distort(aEyebrowsDyn, aEyebrowsCenter, aEyebrowsRegion);
+    queues.distort(aLipsNoseDyn, aLipsNoseCenter, aLipsNoseRegion);
+    queues.pinch(aNoseBroaderDyn, aNoseBroaderCenter, aNoseBroaderRegion);
+    queues.distort(aNostrilsDyn, aNostrilsCenter, aNostrilsRegion);
+    queues.swirl(aLEyeDyn, aLEyeCenter, aEyesRegion);
+    queues.swirl(aREyeDyn, aREyeCenter, aEyesRegion);
+    queues.distort(aEyebrowsDyn, aEyebrowsCenter, aEyebrowsRegion);
 
-    obj.chroma(aChromaSkinDyn, aChromaSkin, aSkinColorRegion, false);
-    obj.chroma(aChromaEyesDyn, aChromaEyes, aLEyeColorRegion, true);
-    obj.chroma(aChromaEyesDyn, aChromaEyes, aREyeColorRegion, true);
+    queues.chroma(aChromaSkinDyn, aChromaSkin, aSkinColorRegion, false);
+    queues.chroma(aChromaEyesDyn, aChromaEyes, aLEyeColorRegion, true);
+    queues.chroma(aChromaEyesDyn, aChromaEyes, aREyeColorRegion, true);
 
     // BLACKNESS
-    obj.pinch(bFaceDyn, bFaceCenter, bFaceRegion);
-    obj.distort(bTipLowerDyn, bTipLowerCenter, bTipLowerRegion);
-    obj.pinch(bWholeNoseDyn, bWholeNoseCenter, bWholeNoseRegion);
-    obj.pinch(bNoseBroaderDyn, bNoseBroaderCenter, bNoseBroaderRegion);
-    obj.pinch(bLipsDyn, bLipsCenter, bLipsRegion);
-
-    obj.chroma(bChromaSkinDyn, bChromaSkin, bSkinColorRegion, false);
-    obj.chroma(bChromaEyesDyn, bChromaEyes, bLEyeColorRegion, true);
-    obj.chroma(bChromaEyesDyn, bChromaEyes, bREyeColorRegion, true);
-    obj.chroma(bChromaPupilDyn, bChromaPupil, bLPupilColorRegion, true);
-    obj.chroma(bChromaPupilDyn, bChromaPupil, bRPupilColorRegion, true);
-
-    obj.contrast(bContrastDyn);
+    queues.pinch(bFaceDyn, bFaceCenter, bFaceRegion);
+    queues.distort(bTipLowerDyn, bTipLowerCenter, bTipLowerRegion);
+    queues.pinch(bWholeNoseDyn, bWholeNoseCenter, bWholeNoseRegion);
+    queues.pinch(bNoseBroaderDyn, bNoseBroaderCenter, bNoseBroaderRegion);
+    queues.pinch(bLipsDyn, bLipsCenter, bLipsRegion);
+
+    queues.chroma(bChromaSkinDyn, bChromaSkin, bSkinColorRegion, false);
+    queues.chroma(bChromaEyesDyn, bChromaEyes, bLEyeColorRegion, true);
+    queues.chroma(bChromaEyesDyn, bChromaEyes, bREyeColorRegion, true);
+    queues.chroma(bChromaPupilDyn, bChromaPupil, bLPupilColorRegion, true);
+    queues.chroma(bChromaPupilDyn, bChromaPupil, bRPupilColorRegion, true);
+
+    queues.contrast(bContrastDyn);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
index b6da354..c221794 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
@@ -27,7 +27,8 @@ import android.opengl.GLSurfaceView;
 import org.distorted.examples.R;
 import org.distorted.library.Distorted;
 import org.distorted.library.GridFlat;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedEffectQueues;
+import org.distorted.library.DistortedTexture;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Static3D;
 
@@ -42,7 +43,8 @@ import javax.microedition.khronos.opengles.GL10;
 class AroundTheWorldRenderer implements GLSurfaceView.Renderer
 {
    private GLSurfaceView mView;
-   private DistortedObject mObject;
+   private DistortedEffectQueues mQueues;
+   private DistortedTexture mTexture;
    private GridFlat mGrid;
    private AroundTheWorldEffectsManager mEffects;
    private int mObjWidth, mObjHeight;
@@ -51,11 +53,13 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
 
    AroundTheWorldRenderer(GLSurfaceView view)
       {
-      mView = view;
-      mEffects = new AroundTheWorldEffectsManager();
-
       Distorted.setMaxVertex(12);
       Distorted.setMaxFragment(9);
+
+      mView = view;
+      mEffects = new AroundTheWorldEffectsManager();
+      mQueues = new DistortedEffectQueues();
+      mEffects.apply(mQueues);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -70,28 +74,28 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
    public void onDrawFrame(GL10 glUnused) 
       {
       GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-      mObject.draw(System.currentTimeMillis(), mGrid);
+      mQueues.draw(System.currentTimeMillis(), mTexture, mGrid);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
    public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       {
-      mObject.abortEffects(EffectTypes.MATRIX);
+      mQueues.abortEffects(EffectTypes.MATRIX);
 
       if( (float)mObjHeight/mObjWidth > (float)height/width )
         {
         int w = (height*mObjWidth)/mObjHeight;
         float factor = (float)height/mObjHeight;
-        mObject.move( new Static3D((width-w)/2,0,0) );
-        mObject.scale(factor);
+        mQueues.move( new Static3D((width-w)/2,0,0) );
+        mQueues.scale(factor);
         }
       else
         {
         int h = (width*mObjHeight)/mObjWidth;
         float factor = (float)width/mObjWidth;
-        mObject.move( new Static3D(0,(height-h)/2,0) );
-        mObject.scale(factor);
+        mQueues.move( new Static3D(0,(height-h)/2,0) );
+        mQueues.scale(factor);
         }
 
       Distorted.onSurfaceChanged(width, height);
@@ -122,9 +126,8 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
       mObjWidth = bitmap.getWidth();
       mObjHeight= bitmap.getHeight();
 
-      mObject = new DistortedObject(mObjWidth,mObjHeight,0);
-      mObject.setTexture(bitmap);
-      mEffects.apply(mObject);
+      mTexture = new DistortedTexture(mObjWidth,mObjHeight,0);
+      mTexture.setTexture(bitmap);
 
       mGrid = new GridFlat(30,30*mObjHeight/mObjWidth);
 
diff --git a/src/main/java/org/distorted/examples/bean/BeanRenderer.java b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
index 683be70..c08f341 100644
--- a/src/main/java/org/distorted/examples/bean/BeanRenderer.java
+++ b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
@@ -29,7 +29,8 @@ import org.distorted.examples.R;
 
 import org.distorted.library.EffectTypes;
 import org.distorted.library.Distorted;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.GridFlat;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static3D;
@@ -45,11 +46,9 @@ import android.opengl.GLSurfaceView;
 class BeanRenderer implements GLSurfaceView.Renderer 
 {
    private GLSurfaceView mView;
-   private DistortedObject mBean;
+   private DistortedTexture mTexture;
+   private DistortedEffectQueues mQueues;
    private GridFlat mGrid;
-   private Static3D pLeft, pRight;
-   private Dynamic3D dLeft, dRight;
-   private Static4D rLeft, rRight;
    private int bmpHeight, bmpWidth;
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -58,14 +57,14 @@ class BeanRenderer implements GLSurfaceView.Renderer
       {
       mView = v;
      
-      pLeft = new Static3D( 98, 183, 0);
-      pRight= new Static3D(233, 140, 0);
+      Static3D pLeft = new Static3D( 98, 183, 0);
+      Static3D pRight= new Static3D(233, 140, 0);
       
-      rLeft = new Static4D( -3,-33,47,47);
-      rRight= new Static4D(-14,-33,47,47);
+      Static4D rLeft = new Static4D( -3,-33,47,47);
+      Static4D rRight= new Static4D(-14,-33,47,47);
      
-      dLeft = new Dynamic3D(2000,0.0f);
-      dRight= new Dynamic3D(2000,0.0f);
+      Dynamic3D dLeft = new Dynamic3D(2000,0.0f);
+      Dynamic3D dRight= new Dynamic3D(2000,0.0f);
 
       Static3D p1 = new Static3D(  0,  0, 0);
       Static3D p2 = new Static3D(-15,-30, 0);
@@ -83,6 +82,10 @@ class BeanRenderer implements GLSurfaceView.Renderer
       dRight.add(p1);
       dRight.add(p1);
       dRight.add(p1);
+
+      mQueues = new DistortedEffectQueues();
+      mQueues.distort(dLeft , pLeft , rLeft );
+      mQueues.distort(dRight, pRight, rRight);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -90,30 +93,30 @@ class BeanRenderer implements GLSurfaceView.Renderer
     public void onDrawFrame(GL10 glUnused) 
       {
       GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-      mBean.draw(System.currentTimeMillis(), mGrid);
+      mQueues.draw(System.currentTimeMillis(), mTexture, mGrid);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       { 
-      mBean.abortEffects(EffectTypes.MATRIX);
+      mQueues.abortEffects(EffectTypes.MATRIX);
          
       if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
 
-        mBean.move( new Static3D((width-w)/2,0,0) );
-        mBean.scale(factor);
+        mQueues.move( new Static3D((width-w)/2,0,0) );
+        mQueues.scale(factor);
         }
       else
         {
         int h = (width*bmpHeight)/bmpWidth;
         float factor = (float)width/bmpWidth;
 
-        mBean.move( new Static3D(0,(height-h)/2,0) );
-        mBean.scale(factor);
+        mQueues.move( new Static3D(0,(height-h)/2,0) );
+        mQueues.scale(factor);
         }
       
       Distorted.onSurfaceChanged(width, height); 
@@ -144,11 +147,8 @@ class BeanRenderer implements GLSurfaceView.Renderer
       bmpHeight = bitmap.getHeight();
       bmpWidth  = bitmap.getWidth();
       
-      mBean = new DistortedObject(bmpWidth, bmpHeight, 1);
-      mBean.setTexture(bitmap);
-      mBean.distort(dLeft , pLeft , rLeft );
-      mBean.distort(dRight, pRight, rRight);
-
+      mTexture = new DistortedTexture(bmpWidth, bmpHeight, 0);
+      mTexture.setTexture(bitmap);
       mGrid = new GridFlat(25,25*bmpHeight/bmpWidth);
 
       try
diff --git a/src/main/java/org/distorted/examples/check/CheckRenderer.java b/src/main/java/org/distorted/examples/check/CheckRenderer.java
index e404ff0..d0d47fe 100644
--- a/src/main/java/org/distorted/examples/check/CheckRenderer.java
+++ b/src/main/java/org/distorted/examples/check/CheckRenderer.java
@@ -28,7 +28,8 @@ import javax.microedition.khronos.opengles.GL10;
 import org.distorted.examples.R;
 
 import org.distorted.library.Distorted;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.GridFlat;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic3D;
@@ -54,7 +55,8 @@ class CheckRenderer implements GLSurfaceView.Renderer
     private static String compilationTitle;
 
     private GLSurfaceView mView;
-    private DistortedObject mSuccess;
+    private DistortedTexture mTexture;
+    private DistortedEffectQueues mQueues;
     private GridFlat mGrid;
     private int bmpHeight, bmpWidth;
 
@@ -63,6 +65,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
     CheckRenderer(GLSurfaceView view)
       { 
       mView = view;
+      mQueues = new DistortedEffectQueues();
 
       CheckActivity act = (CheckActivity)mView.getContext();
 
@@ -75,30 +78,30 @@ class CheckRenderer implements GLSurfaceView.Renderer
     public void onDrawFrame(GL10 glUnused) 
       {
       GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-      mSuccess.draw(System.currentTimeMillis(), mGrid);
+      mQueues.draw(System.currentTimeMillis(), mTexture, mGrid);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       { 
-      mSuccess.abortEffects(EffectTypes.MATRIX);
+      mQueues.abortEffects(EffectTypes.MATRIX);
       
       if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
 
-        mSuccess.move( new Static3D((width-w)/2,0,0) );
-        mSuccess.scale(factor);
+        mQueues.move( new Static3D((width-w)/2,0,0) );
+        mQueues.scale(factor);
         }
       else
         {
         int h = (width*bmpHeight)/bmpWidth;
         float factor = (float)width/bmpWidth;
 
-        mSuccess.move( new Static3D(0,(height-h)/2,0) );
-        mSuccess.scale(factor);
+        mQueues.move( new Static3D(0,(height-h)/2,0) );
+        mQueues.scale(factor);
         }
       
       Distorted.onSurfaceChanged(width, height);
@@ -129,8 +132,8 @@ class CheckRenderer implements GLSurfaceView.Renderer
       bmpHeight = bitmap.getHeight();
       bmpWidth  = bitmap.getWidth();
 
-      mSuccess = new DistortedObject(bmpWidth,bmpHeight,1);
-      mSuccess.setTexture(bitmap);
+      mTexture = new DistortedTexture(bmpWidth,bmpHeight,0);
+      mTexture.setTexture(bitmap);
       mGrid = new GridFlat(30,30*bmpHeight/bmpWidth);
 
       // Try adding 2 Vertex Effects to the Bitmap.
@@ -143,7 +146,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
       dSwirl.add(new Static3D(        0, bmpHeight/2, 0));
       dSwirl.add(new Static3D( bmpWidth, bmpHeight/2, 0));
 
-      long swirlEffectID = mSuccess.swirl( new Static1D(30), dSwirl, new Static4D( 0,0,40,40) );
+      long swirlEffectID = mQueues.swirl( new Static1D(30), dSwirl, new Static4D( 0,0,40,40) );
 
       if( swirlEffectID<0 )
         {
@@ -154,7 +157,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
       dDeform.add(new Static3D( 0,         0,0));
       dDeform.add(new Static3D( 0,-bmpHeight,0));
 
-      long deformEffectID = mSuccess.deform(dDeform, new Static3D(bmpWidth/2,0,0) );
+      long deformEffectID = mQueues.deform(dDeform, new Static3D(bmpWidth/2,0,0) );
 
       if( deformEffectID<0 )
         {
@@ -167,7 +170,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
       inter.add(new Static1D(0));
       inter.add(new Static1D(1));
 
-      long chromaEffectID = mSuccess.chroma(inter, color);
+      long chromaEffectID = mQueues.chroma(inter, color);
 
       if( chromaEffectID<0 )
         {
diff --git a/src/main/java/org/distorted/examples/cubes/CubesActivity.java b/src/main/java/org/distorted/examples/cubes/CubesActivity.java
index 81fc12d..307bf01 100644
--- a/src/main/java/org/distorted/examples/cubes/CubesActivity.java
+++ b/src/main/java/org/distorted/examples/cubes/CubesActivity.java
@@ -21,7 +21,7 @@ package org.distorted.examples.cubes;
 
 import org.distorted.library.Distorted;
 import org.distorted.examples.R;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
 import org.distorted.library.GridObject;
 import org.distorted.library.GridCubes;
 
@@ -48,7 +48,7 @@ public class CubesActivity extends Activity implements View.OnClickListener
     private NumberPicker mColsPicker, mRowsPicker;
     private LinearLayout mLay;
     private boolean[] mShape;
-    private DistortedObject mObject;
+    private DistortedTexture mTexture;
     private GridObject mGrid;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -200,16 +200,16 @@ public class CubesActivity extends Activity implements View.OnClickListener
         str += mShape[i] ? "1" : "0";
 
       mGrid = new GridCubes(mNumCols, str, false);
-      mObject = new DistortedObject(mNumCols,mNumRows,1);
+      mTexture = new DistortedTexture(mNumCols,mNumRows,1);
 
       setContentView(R.layout.cubeslayout);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public DistortedObject getObject()
+    public DistortedTexture getTexture()
       {
-      return mObject;
+      return mTexture;
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/cubes/CubesRenderer.java b/src/main/java/org/distorted/examples/cubes/CubesRenderer.java
index 82e6271..dff0843 100644
--- a/src/main/java/org/distorted/examples/cubes/CubesRenderer.java
+++ b/src/main/java/org/distorted/examples/cubes/CubesRenderer.java
@@ -27,7 +27,8 @@ import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.examples.R;
 
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.GridObject;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.DynamicQuat;
@@ -45,12 +46,12 @@ import android.opengl.GLSurfaceView;
 class CubesRenderer implements GLSurfaceView.Renderer 
 {
     private GLSurfaceView mView;
-    private DistortedObject mObject;
+    private DistortedTexture mTexture;
+    private DistortedEffectQueues mQueues;
     private GridObject mGrid;
+    private DynamicQuat mQuatInt1, mQuatInt2;
     private int mObjWidth, mObjHeight;
 
-    private DynamicQuat mQuatInt1, mQuatInt2;
-    
     Static4D mQuat1, mQuat2;
     int mScreenMin;
     
@@ -62,11 +63,12 @@ class CubesRenderer implements GLSurfaceView.Renderer
 
       CubesActivity act = (CubesActivity)v.getContext();
 
-      mObject = act.getObject();
-      mGrid   = act.getGrid();
+      mQueues  = new DistortedEffectQueues();
+      mTexture = act.getTexture();
+      mGrid    = act.getGrid();
 
-      mObjWidth = mObject.getWidth();
-      mObjHeight= mObject.getHeight();
+      mObjWidth = mTexture.getWidth();
+      mObjHeight= mTexture.getHeight();
 
       mQuat1 = new Static4D(0,0,0,1);  // unity
       mQuat2 = new Static4D(0,0,0,1);  // quaternions
@@ -83,7 +85,7 @@ class CubesRenderer implements GLSurfaceView.Renderer
     public void onDrawFrame(GL10 glUnused) 
       {
       GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-      mObject.draw(System.currentTimeMillis(),mGrid);
+      mQueues.draw(System.currentTimeMillis(),mTexture,mGrid);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -92,7 +94,7 @@ class CubesRenderer implements GLSurfaceView.Renderer
       {
       mScreenMin = width<height ? width:height;
     	
-      mObject.abortEffects(EffectTypes.MATRIX);
+      mQueues.abortEffects(EffectTypes.MATRIX);
       float factor;
 
       if( width*mObjHeight > height*mObjWidth ) // screen is more 'horizontal' than the Object
@@ -104,12 +106,12 @@ class CubesRenderer implements GLSurfaceView.Renderer
         factor = (0.8f*width)/mObjWidth;
         }
 
-      mObject.move( new Static3D( (width-factor*mObjWidth)/2 , (height-factor*mObjHeight)/2 , 0) );
-      mObject.scale(factor);
+      mQueues.move( new Static3D( (width-factor*mObjWidth)/2 , (height-factor*mObjHeight)/2 , 0) );
+      mQueues.scale(factor);
       Static3D center = new Static3D(mObjWidth/2,mObjHeight/2, 0);
 
-      mObject.quaternion(mQuatInt1, center);
-      mObject.quaternion(mQuatInt2, center);
+      mQueues.quaternion(mQuatInt1, center);
+      mQueues.quaternion(mQuatInt2, center);
        
       Distorted.onSurfaceChanged(width, height); 
       }
@@ -136,7 +138,7 @@ class CubesRenderer implements GLSurfaceView.Renderer
         catch(IOException e) { }
         }  
       
-      mObject.setTexture(bitmap);
+      mTexture.setTexture(bitmap);
       
       try
         {
diff --git a/src/main/java/org/distorted/examples/deform/DeformRenderer.java b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
index 7068b13..5d7a851 100644
--- a/src/main/java/org/distorted/examples/deform/DeformRenderer.java
+++ b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
@@ -23,7 +23,8 @@ import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.library.Distorted;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.GridObject;
 import org.distorted.library.GridFlat;
 
@@ -43,13 +44,14 @@ import android.opengl.GLSurfaceView;
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class DeformRenderer implements GLSurfaceView.Renderer 
-{
+   {
    private static final int NUM_VECTORS =  8;
    private static final int NUM_LINES   = 10;
    private static final int NUM_FRAMES  = 10;
 
    private GLSurfaceView mView;
-   private DistortedObject fps, stretch;
+   private DistortedTexture fpsTexture, stretchTexture;
+   private DistortedEffectQueues fpsQueues, stretchQueues;
    private GridObject fpsGrid, stretchGrid;
    private Static3D touchPoint;
 
@@ -83,16 +85,20 @@ class DeformRenderer implements GLSurfaceView.Renderer
    DeformRenderer(GLSurfaceView view)
       { 
       mView = view;
-      
+
+      mPaint = new Paint();
+      mPaint.setAntiAlias(true);
+      mPaint.setTextAlign(Paint.Align.CENTER);
+
+      fpsQueues     = new DistortedEffectQueues();
+      stretchQueues = new DistortedEffectQueues();
+
       mRegion = new Static4D(0,0,0,0);
 
       durations = new long[NUM_FRAMES+1];
       currDuration = 0;
 
-      for(int i=0; i<NUM_FRAMES+1; i++)
-        {
-        durations[i]=0;
-        }
+      for(int i=0; i<NUM_FRAMES+1; i++) durations[i]=0;
 
       // DISTORT
       mReleasedDistortDynamic = new Dynamic3D(NUM_VECTORS*500, 0.5f);
@@ -159,206 +165,203 @@ class DeformRenderer implements GLSurfaceView.Renderer
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public void onPause()
+   public void onPause()
       {
       bitmapCreated = false;  
       }
       
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-    public void onDrawFrame(GL10 glUnused) 
-      {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+   public void onDrawFrame(GL10 glUnused)
+     {
+     GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
     
-      long time = System.currentTimeMillis();
+     long time = System.currentTimeMillis();
       
-      stretch.draw(time,stretchGrid);
+     stretchQueues.draw(time,stretchTexture,stretchGrid);
       
-      mPaint.setColor(0xffffffff);
-      fpsCanvas.drawRect(0, 0, fpsW, fpsH, mPaint);
-      mPaint.setColor(0xff000000);
-      fpsCanvas.drawText(fpsString, fpsW/2, 5*fpsH/6, mPaint);
+     mPaint.setColor(0xffffffff);
+     fpsCanvas.drawRect(0, 0, fpsW, fpsH, mPaint);
+     mPaint.setColor(0xff000000);
+     fpsCanvas.drawText(fpsString, fpsW/2, 5*fpsH/6, mPaint);
       
-      fps.setTexture(fpsBitmap);
-      fps.draw(time,fpsGrid);
+     fpsTexture.setTexture(fpsBitmap);
+     fpsQueues.draw(time,fpsTexture,fpsGrid);
       
-      computeFPS(time);
-      }
+     computeFPS(time);
+     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
-    public void onSurfaceChanged(GL10 glUnused, int width, int height) 
-      { 
-      scrHeight = height;
-      scrWidth  = width;
+   public void onSurfaceChanged(GL10 glUnused, int width, int height)
+     {
+     scrHeight = height;
+     scrWidth  = width;
 
-      setRegionRadius(50);
+     setRegionRadius(50);
 
-      Distorted.onSurfaceChanged(width, height);
+     Distorted.onSurfaceChanged(width, height);
       
-      if( !bitmapCreated )
-        {
-        createBitmap(scrWidth/2,scrHeight/2);
-        stretch.move( new Static3D(scrWidth/4,scrHeight/4,0) );
-        fps.move( new Static3D(5,5,0) );
-        bitmapCreated=true;
-        }
-      else
-        {
-        stretch.abortEffects(EffectTypes.VERTEX);
-        stretch.abortEffects(EffectTypes.FRAGMENT);
-        stretch.abortEffects(EffectNames.SHEAR);
-        }
-      }
+     if( !bitmapCreated )
+       {
+       createBitmap(scrWidth/2,scrHeight/2);
+       stretchQueues.move( new Static3D(scrWidth/4,scrHeight/4,0) );
+       fpsQueues.move( new Static3D(5,5,0) );
+       bitmapCreated=true;
+       }
+     else
+       {
+       stretchQueues.abortEffects(EffectTypes.VERTEX);
+       stretchQueues.abortEffects(EffectTypes.FRAGMENT);
+       stretchQueues.abortEffects(EffectNames.SHEAR);
+       }
+     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
-    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
-      {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
-
-      try
-        {
-        Distorted.onSurfaceCreated(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("DeformRenderer", ex.toString() );
-        }
-      }
+   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
+     {
+     GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+     try
+       {
+       Distorted.onSurfaceCreated(mView.getContext());
+       }
+     catch(Exception ex)
+       {
+       android.util.Log.e("DeformRenderer", ex.toString() );
+       }
+     }
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void createBitmap(int w, int h)
-      {  
-      Canvas stretchCanvas;   
+   private void createBitmap(int w, int h)
+     {
+     Canvas stretchCanvas;
       
-      mPaint = new Paint();
-      stretch = new DistortedObject(w,h,1);
-      stretchGrid = new GridFlat(50,50*h/w);
-      Bitmap stretchBitmap = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
-      stretchCanvas = new Canvas(stretchBitmap);
+     stretchTexture = new DistortedTexture(w,h,0);
+     stretchGrid    = new GridFlat(50,50*h/w);
+     Bitmap stretchBitmap = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
+     stretchCanvas = new Canvas(stretchBitmap);
       
-      fpsW = scrWidth/5;
-      fpsH = fpsW/2;
-        
-      mPaint.setAntiAlias(true);
-      mPaint.setTextAlign(Paint.Align.CENTER);
-      mPaint.setTextSize(2*fpsH/3);
-      mPaint.setColor(0xff008800);
-      mPaint.setStyle(Style.FILL);
-      stretchCanvas.drawRect(0, 0, w, h, mPaint);
-      mPaint.setColor(0xffffffff);
+     fpsW = scrWidth/5;
+     fpsH = fpsW/2;
+
+     mPaint.setTextSize(2*fpsH/3);
+     mPaint.setColor(0xff008800);
+     mPaint.setStyle(Style.FILL);
+     stretchCanvas.drawRect(0, 0, w, h, mPaint);
+     mPaint.setColor(0xffffffff);
       
-      for(int i=0; i<=NUM_LINES ; i++ )
-        {
-        stretchCanvas.drawRect(w*i/NUM_LINES - 1,                 0,  w*i/NUM_LINES + 1,  h                , mPaint);
-        stretchCanvas.drawRect(                0, h *i/NUM_LINES -1,  w                ,  h*i/NUM_LINES + 1, mPaint);
-        }
+     for(int i=0; i<=NUM_LINES ; i++ )
+       {
+       stretchCanvas.drawRect(w*i/NUM_LINES - 1,                 0,  w*i/NUM_LINES + 1,  h                , mPaint);
+       stretchCanvas.drawRect(                0, h *i/NUM_LINES -1,  w                ,  h*i/NUM_LINES + 1, mPaint);
+       }
         
-      touchPoint= new Static3D(0,0,0);
+     touchPoint= new Static3D(0,0,0);
         
-      fps = new DistortedObject( fpsW, fpsH, 1);
-      fpsGrid = new GridFlat(1,1);
+     fpsTexture = new DistortedTexture( fpsW, fpsH, 0);
+     fpsGrid = new GridFlat(1,1);
 
-      fpsBitmap = Bitmap.createBitmap(fpsW,fpsH, Bitmap.Config.ARGB_8888);
-      fpsCanvas = new Canvas(fpsBitmap);
+     fpsBitmap = Bitmap.createBitmap(fpsW,fpsH, Bitmap.Config.ARGB_8888);
+     fpsCanvas = new Canvas(fpsBitmap);
         
-      stretch.setTexture(stretchBitmap);
-      fps.setTexture(fpsBitmap);
-      }
+     stretchTexture.setTexture(stretchBitmap);
+     fpsTexture.setTexture(fpsBitmap);
+     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    void down(int x, int y)
-      {
-      int xt = x-scrWidth/4;
-      int yt = y-scrHeight/4;
+   void down(int x, int y)
+     {
+     int xt = x-scrWidth/4;
+     int yt = y-scrHeight/4;
       
-      if( xt<0 ) xt=0;
-      if( xt>scrWidth/2 ) xt=scrWidth/2;
-      if( yt<0 ) yt=0;
-      if( yt>scrHeight/2 ) yt=scrHeight/2;
+     if( xt<0 ) xt=0;
+     if( xt>scrWidth/2 ) xt=scrWidth/2;
+     if( yt<0 ) yt=0;
+     if( yt>scrHeight/2 ) yt=scrHeight/2;
       
-      touchPoint.set(xt,yt,0);
-
-      switch(mMode)
-        {
-        case DISTORT: vDistort[0].set(0,0,0);
-                      mLastEffect = stretch.distort( mMovingDistortDynamic, touchPoint, mRegion);
-                      break;
-        case DEFORM : vDeform[0].set(0,0,0);
-                      mLastEffect = stretch.deform( mMovingDeformDynamic, touchPoint, mRegion);
-                      break;
-        case SHEAR  : vShear[0].set(0,0,0);
-                      mLastEffect = stretch.shear(mMovingShearDynamic, touchPoint);
-                      break;
-        }                   
-      }
+     touchPoint.set(xt,yt,0);
+
+     switch(mMode)
+       {
+       case DISTORT: vDistort[0].set(0,0,0);
+                     mLastEffect = stretchQueues.distort( mMovingDistortDynamic, touchPoint, mRegion);
+                     break;
+       case DEFORM : vDeform[0].set(0,0,0);
+                     mLastEffect = stretchQueues.deform( mMovingDeformDynamic, touchPoint, mRegion);
+                     break;
+       case SHEAR  : vShear[0].set(0,0,0);
+                     mLastEffect = stretchQueues.shear(mMovingShearDynamic, touchPoint);
+                     break;
+       }
+     }
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    void move(int x, int y)
-      {
-      switch(mMode)
-        {
-        case DISTORT: vDistort[0].set(x,y);
-                      break;
-        case DEFORM:  vDeform[0].set(x,y);
-                      break;
-        case SHEAR:   vShear[0].set( (float)x/(scrWidth/2), (float)y/(scrHeight/2));
-                      break;
-        }
-      }
+   void move(int x, int y)
+     {
+     switch(mMode)
+       {
+       case DISTORT: vDistort[0].set(x,y);
+                     break;
+       case DEFORM:  vDeform[0].set(x,y);
+                     break;
+       case SHEAR:   vShear[0].set( (float)x/(scrWidth/2), (float)y/(scrHeight/2));
+                     break;
+       }
+     }
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    void up()
-      {
-      stretch.abortEffect(mLastEffect);
-
-      float damp = -0.65f;
-
-      switch(mMode)
-        {
-        case DISTORT: for(int i=1; i<NUM_VECTORS-1; i++)
-                        {
-                        vDistort[i].set( vDistort[i-1].getX()*damp, vDistort[i-1].getY()*damp );
-                        }
-                      vDistort[NUM_VECTORS-1].set(0,0);
-                      stretch.distort( mReleasedDistortDynamic, touchPoint, mRegion);
-                      break;
-        case DEFORM : for(int i=1; i<NUM_VECTORS-1; i++)
-                        {
-                        vDeform[i].set( vDeform[i-1].getX()*damp, vDeform[i-1].getY()*damp );
-                        }
-                      vDeform[NUM_VECTORS-1].set(0,0);
-                      stretch.deform( mReleasedDeformDynamic, touchPoint, mRegion);
-                      break;
-        case SHEAR  : for(int i=1; i<NUM_VECTORS-1; i++)
-                        {
-                        vShear[i].set( vShear[i-1].getX()*damp, vShear[i-1].getY()*damp );
-                        }
-                      vShear[NUM_VECTORS-1].set(0,0);
-                      stretch.shear(mReleasedShearDynamic, touchPoint);
-                      break;
-        }      
-      }
+   void up()
+     {
+     stretchQueues.abortEffect(mLastEffect);
+
+     float damp = -0.65f;
+
+     switch(mMode)
+       {
+       case DISTORT: for(int i=1; i<NUM_VECTORS-1; i++)
+                       {
+                       vDistort[i].set( vDistort[i-1].getX()*damp, vDistort[i-1].getY()*damp );
+                       }
+                     vDistort[NUM_VECTORS-1].set(0,0);
+                     stretchQueues.distort( mReleasedDistortDynamic, touchPoint, mRegion);
+                     break;
+       case DEFORM : for(int i=1; i<NUM_VECTORS-1; i++)
+                       {
+                       vDeform[i].set( vDeform[i-1].getX()*damp, vDeform[i-1].getY()*damp );
+                       }
+                     vDeform[NUM_VECTORS-1].set(0,0);
+                     stretchQueues.deform( mReleasedDeformDynamic, touchPoint, mRegion);
+                     break;
+       case SHEAR  : for(int i=1; i<NUM_VECTORS-1; i++)
+                       {
+                       vShear[i].set( vShear[i-1].getX()*damp, vShear[i-1].getY()*damp );
+                       }
+                     vShear[NUM_VECTORS-1].set(0,0);
+                     stretchQueues.shear(mReleasedShearDynamic, touchPoint);
+                     break;
+       }
+     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void computeFPS(long currentTime)
-      {
-      if( lastTime!=0 )
-        {
-        currDuration++;
-        if( currDuration>=NUM_FRAMES ) currDuration = 0;
-        durations[NUM_FRAMES] += ((currentTime-lastTime)-durations[currDuration]);
-        durations[currDuration] = currentTime-lastTime;
-
-        fpsString = "" + ((int)(10000.0f*NUM_FRAMES/durations[NUM_FRAMES]))/10.0f;
-        }
+   private void computeFPS(long currentTime)
+     {
+     if( lastTime!=0 )
+       {
+       currDuration++;
+       if( currDuration>=NUM_FRAMES ) currDuration = 0;
+       durations[NUM_FRAMES] += ((currentTime-lastTime)-durations[currDuration]);
+       durations[currDuration] = currentTime-lastTime;
+
+       fpsString = "" + ((int)(10000.0f*NUM_FRAMES/durations[NUM_FRAMES]))/10.0f;
+       }
       
-      lastTime = currentTime;   
-      }
-}
+     lastTime = currentTime;
+     }
+   }
diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
index 26ccfed..c0602ec 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
@@ -28,7 +28,8 @@ import javax.microedition.khronos.opengles.GL10;
 import org.distorted.examples.R;
 
 import org.distorted.library.Distorted;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.GridFlat;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic3D;
@@ -48,10 +49,9 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
    private static final int NUM = 3;
    
    private GLSurfaceView mView;
-   private DistortedObject[] mObj;
+   private DistortedTexture[] mTexture;
+   private DistortedEffectQueues[] mQueues;
    private GridFlat mGrid;
-   private Static3D mPoint;
-   private Dynamic3D dDistort;
    private int bmpHeight, bmpWidth;
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -60,11 +60,20 @@ 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(3000,0.0f);
+      Dynamic3D dDistort = new Dynamic3D(3000,0.0f);
       dDistort.add(new Static3D( 25,0,0));
       dDistort.add(new Static3D(-25,0,0));
-      mPoint = new Static3D(305, 380, 0);
+      Static3D mPoint = new Static3D(305, 380, 0);
+
+      mQueues = new DistortedEffectQueues[NUM];
+      mQueues[0] = new DistortedEffectQueues();
+      for(int i=1; i<NUM; i++)
+        mQueues[i] = new DistortedEffectQueues(mQueues[0], Distorted.CLONE_VERTEX|Distorted.CLONE_FRAGMENT);
+
+      // Add the effects only to the first queue - all VERTEX and FRAGMENT effects are shared!
+      // (Matrix effect cannot be shared as we have to display each Texture in a different location)
+      mQueues[0].sink( new Static1D(8), mPoint, new Static4D(0,0,80,80));  // enlarge the nose
+      mQueues[0].distort(dDistort,mPoint);                                 // keep moving the whole bitmap left and right.
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -98,7 +107,7 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
       
       long time = System.currentTimeMillis();
       
-      for(int i=NUM-1; i>=0; i--) mObj[i].draw(time, mGrid);
+      for(int i=NUM-1; i>=0; i--) mQueues[i].draw(time, mTexture[i], mGrid);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -107,7 +116,7 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
       {  
       for(int i=NUM-1; i>=0; i--) 
         {   
-        mObj[i].abortEffects(EffectTypes.MATRIX);
+        mQueues[i].abortEffects(EffectTypes.MATRIX);
         }
       
       if( (float)bmpHeight/(NUM*bmpWidth) > (float)height/width )
@@ -117,8 +126,8 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
 
         for(int i=NUM-1; i>=0; i--) 
           {
-          mObj[i].move( new Static3D((width-NUM*w)/2 +i*w ,0,0) );
-          mObj[i].scale(factor);
+          mQueues[i].move( new Static3D((width-NUM*w)/2 +i*w ,0,0) );
+          mQueues[i].scale(factor);
           }
         }
       else
@@ -129,8 +138,8 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
 
         for(int i=NUM-1; i>=0; i--) 
           {
-          mObj[i].move( new Static3D(i*w,(height-h)/2,0) );
-          mObj[i].scale(factor);
+          mQueues[i].move( new Static3D(i*w,(height-h)/2,0) );
+          mQueues[i].scale(factor);
           }
         }
          
@@ -150,18 +159,13 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
       bmpHeight = bitmap0.getHeight();
       bmpWidth  = bitmap0.getWidth();
       
-      // create NUM DistortedBitmaps with shared effects
-      mObj = new DistortedObject[NUM];
-      mObj[0] = new DistortedObject(bmpWidth, bmpHeight, 1);
-      for(int i=1; i<NUM; i++) 
-        mObj[i] = new DistortedObject(mObj[0], Distorted.CLONE_VERTEX|Distorted.CLONE_FRAGMENT);
+      mTexture = new DistortedTexture[NUM];
+      for(int i=0; i<NUM; i++)
+        mTexture[i] = new DistortedTexture(bmpWidth, bmpHeight,0);
       
-      mObj[0].setTexture(bitmap0);
-      mObj[1].setTexture(bitmap1);
-      mObj[2].setTexture(bitmap2);
-         
-      mObj[0].sink( new Static1D(8), mPoint, new Static4D(0,0,80,80));
-      mObj[0].distort(dDistort,mPoint);
+      mTexture[0].setTexture(bitmap0);
+      mTexture[1].setTexture(bitmap1);
+      mTexture[2].setTexture(bitmap2);
 
       mGrid = new GridFlat(30,30*bmpHeight/bmpWidth);
 
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
index f6bd67f..1c4b3fe 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
@@ -84,7 +84,6 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
 
     String[] itemsType = new String[] {"VERTEX", "FRAGMENT"};
 
-
     mAdapterID = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, itemsID);
     mAdapterID.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
     mID.setAdapter(mAdapterID);
@@ -170,7 +169,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
     Long currID = (Long)mID.getItemAtPosition(mPosID);
 
     EffectQueueSurfaceView v = (EffectQueueSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
-    v.getRenderer().mBackground.abortEffect(currID);
+    v.getRenderer().getQueues().abortEffect(currID);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -190,7 +189,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
       }
 
     EffectQueueSurfaceView v = (EffectQueueSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
-    v.getRenderer().mBackground.abortEffects(name);
+    v.getRenderer().getQueues().abortEffects(name);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -207,7 +206,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
       }
 
     EffectQueueSurfaceView v = (EffectQueueSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
-    v.getRenderer().mBackground.abortEffects(type);
+    v.getRenderer().getQueues().abortEffects(type);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
index 0e59b57..ae96db9 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
@@ -30,7 +30,8 @@ import android.opengl.GLES20;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.library.GridFlat;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.Distorted;
 import org.distorted.library.EffectNames;
 import org.distorted.library.EffectTypes;
@@ -40,7 +41,7 @@ import org.distorted.library.type.Static3D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
+class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
   {  
   private static final int NUMLINES =  10;
   static final int BWID = 300;
@@ -50,8 +51,9 @@ public class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListen
   private Paint mPaint;
   private int texWidth, texHeight;
 
-  DistortedObject mBackground;
-  GridFlat mGrid;
+  private DistortedTexture mTexture;
+  private GridFlat mGrid;
+  private DistortedEffectQueues mQueues;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -67,14 +69,22 @@ public class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListen
     texWidth = BWID;
     texHeight= BHEI;
 
-    mGrid      = new GridFlat(80,80*texHeight/texWidth);
-    mBackground= new DistortedObject(texWidth,texHeight,1);
+    mGrid    = new GridFlat(80,80*texHeight/texWidth);
+    mTexture = new DistortedTexture(texWidth,texHeight,0);
+    mQueues  = new DistortedEffectQueues();
 
-    mBackground.addEventListener(this);
+    mQueues.addEventListener(this);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-   
+
+  DistortedEffectQueues getQueues()
+    {
+    return mQueues;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
     {
     Bitmap bitmap = Bitmap.createBitmap(texWidth,texHeight, Bitmap.Config.ARGB_8888);
@@ -89,7 +99,7 @@ public class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListen
       canvas.drawRect(texWidth*i/NUMLINES - 1,                       0,  texWidth*i/NUMLINES + 1,  texHeight               , mPaint);
       canvas.drawRect(                      0, texHeight*i/NUMLINES -1,  texWidth               ,  texHeight*i/NUMLINES + 1, mPaint);
       }
-    mBackground.setTexture(bitmap);
+    mTexture.setTexture(bitmap);
 
     try
       {
@@ -105,8 +115,8 @@ public class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListen
 
   public void onSurfaceChanged(GL10 glUnused, int width, int height)
     {
-    mBackground.abortEffects(EffectTypes.MATRIX);
-    mBackground.scale( new Static3D((float)width/texWidth,(float)height/texHeight,1) );
+    mQueues.abortEffects(EffectTypes.MATRIX);
+    mQueues.scale( new Static3D((float)width/texWidth,(float)height/texHeight,1) );
     Distorted.onSurfaceChanged(width,height);
     mView.setScreenSize(width,height);
     }
@@ -116,7 +126,7 @@ public class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListen
   public void onDrawFrame(GL10 glUnused)
     {   
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
-    mBackground.draw(System.currentTimeMillis(), mGrid);
+    mQueues.draw(System.currentTimeMillis(), mTexture,mGrid);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
index f7e4261..80c1b82 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
@@ -140,19 +140,19 @@ public class EffectQueueSurfaceView extends GLSurfaceView
 
                                     switch(mCurrentEffect)
                                       {
-                                      case 0: id = mRenderer.mBackground.distort(mInterD, mPoint, mRegionV);
+                                      case 0: id = mRenderer.getQueues().distort(mInterD, mPoint, mRegionV);
                                               act.effectAdded(id, EffectNames.DISTORT, EffectTypes.VERTEX);
                                               break;
-                                      case 1: id = mRenderer.mBackground.sink(mInterS, mPoint, mRegionV);
+                                      case 1: id = mRenderer.getQueues().sink(mInterS, mPoint, mRegionV);
                                               act.effectAdded(id, EffectNames.SINK, EffectTypes.VERTEX);
                                               break;
-                                      case 2: id = mRenderer.mBackground.alpha(mInterA, mRegionF, true);
+                                      case 2: id = mRenderer.getQueues().alpha(mInterA, mRegionF, true);
                                               act.effectAdded(id, EffectNames.ALPHA, EffectTypes.FRAGMENT);
                                               break;
-                                      case 3: id = mRenderer.mBackground.saturation(mInterB, mRegionF, false);
+                                      case 3: id = mRenderer.getQueues().saturation(mInterB, mRegionF, false);
                                               act.effectAdded(id, EffectNames.SATURATION, EffectTypes.FRAGMENT);
                                               break;
-                                      case 4: id = mRenderer.mBackground.chroma(mInterC, mRED, mRegionF, true);
+                                      case 4: id = mRenderer.getQueues().chroma(mInterC, mRED, mRegionF, true);
                                               act.effectAdded(id, EffectNames.CHROMA, EffectTypes.FRAGMENT);
                                               break;
                                       }
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java b/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
index 69a6b34..db667ba 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
@@ -41,7 +41,8 @@ import org.distorted.library.Distorted;
 import org.distorted.library.GridFlat;
 import org.distorted.library.GridCubes;
 import org.distorted.library.GridObject;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.EffectNames;
 import org.distorted.library.EffectTypes;
 
@@ -66,7 +67,8 @@ public class Effects3DActivity extends Activity
   private int mNumRows = 10;
   private NumberPicker mColsPicker, mRowsPicker;
   private boolean[] mShape;
-  private DistortedObject mObject;
+  private DistortedTexture mTexture;
+  private DistortedEffectQueues mQueues;
   private GridObject mGrid;
   private int mObjectType;
   private int mBitmapID;
@@ -217,9 +219,16 @@ public class Effects3DActivity extends Activity
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public DistortedObject getObject()
+  public DistortedTexture getTexture()
     {
-    return mObject;
+    return mTexture;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public DistortedEffectQueues getQueues()
+    {
+    return mQueues;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -401,7 +410,8 @@ public class Effects3DActivity extends Activity
       int w = mBitmap.getWidth();
       int h = mBitmap.getHeight();
 
-      mObject = new DistortedObject(w,h,1);
+      mQueues = new DistortedEffectQueues();
+      mTexture= new DistortedTexture(w,h,0);
       mGrid   = new GridFlat(mNumCols,mNumCols*h/w);
       setEffectView();
       }
@@ -431,7 +441,8 @@ public class Effects3DActivity extends Activity
     for(int i=0; i<mNumRows*mNumCols; i++)
       str += mShape[i] ? "1" : "0";
 
-    mObject = new DistortedObject(mNumCols,mNumRows,1);
+    mQueues = new DistortedEffectQueues();
+    mTexture= new DistortedTexture(mNumCols,mNumRows,1);
     mGrid   = new GridCubes(mNumCols, str, false);
 
     setEffectView();
@@ -471,21 +482,21 @@ public class Effects3DActivity extends Activity
 
   public int getWidth()
     {
-    return mObject==null ? 0: mObject.getWidth();
+    return mTexture==null ? 0: mTexture.getWidth();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int getHeight()
     {
-    return mObject==null ? 0: mObject.getHeight();
+    return mTexture==null ? 0: mTexture.getHeight();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int getDepth()
     {
-    return mObject==null ? 0: mObject.getDepth();
+    return mTexture==null ? 0: mTexture.getDepth();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -564,7 +575,7 @@ public class Effects3DActivity extends Activity
       layout.addView(region);
       }
 
-    eff.apply(mObject);
+    eff.apply(mQueues);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -574,8 +585,8 @@ public class Effects3DActivity extends Activity
     mEffects.clear();
     LinearLayout layout = (LinearLayout)findViewById(R.id.effects3dlayout);
     layout.removeAllViews();
-    mObject.abortEffects(EffectTypes.VERTEX);
-    mObject.abortEffects(EffectTypes.FRAGMENT);
+    mQueues.abortEffects(EffectTypes.VERTEX);
+    mQueues.abortEffects(EffectTypes.FRAGMENT);
 
     resetData();
 
@@ -606,8 +617,7 @@ public class Effects3DActivity extends Activity
         view = effect.getRegion();
         if( view!=null ) layout.removeView(view);
 
-        long id = effect.getId();
-        mObject.abortEffect(id);
+        mQueues.abortEffect(effect.getId());
         mEffects.remove(effect);
 
         resetData();
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java b/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
index caf7679..a9118df 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
@@ -26,8 +26,9 @@ import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
 import org.distorted.library.Distorted;
+import org.distorted.library.DistortedTexture;
 import org.distorted.library.GridFlat;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.GridObject;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic3D;
@@ -46,12 +47,10 @@ import javax.microedition.khronos.opengles.GL10;
 class Effects3DRenderer implements GLSurfaceView.Renderer
 {
     private GLSurfaceView mView;
-    private DistortedObject mObject;
-    private DistortedObject mBackground;
-    private DistortedObject mCenter;
-    private DistortedObject mRegion;
+    private DistortedTexture mObjectTexture, mBackgroundTexture, mCenterTexture, mRegionTexture;
+    private DistortedEffectQueues mObjectQueues, mBackgroundQueues, mCenterQueues, mRegionQueues;
     private GridFlat mQuad;
-    private GridObject mGrid;
+    private GridObject mObjectGrid;
     private int mObjWidth, mObjHeight, mObjDepth;
     private DynamicQuat mQuatInt1, mQuatInt2;
 
@@ -73,16 +72,20 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
 
       Effects3DActivity act = (Effects3DActivity)v.getContext();
 
-      mObject     = act.getObject();
-      mGrid       = act.getGrid();
-      mBackground = new DistortedObject(100, 100, 1);
-      mCenter     = new DistortedObject(100, 100, 1);
-      mRegion     = new DistortedObject(100, 100, 1);
-      mQuad       = new GridFlat(1,1);
-
-      mObjWidth = mObject.getWidth();
-      mObjHeight= mObject.getHeight();
-      mObjDepth = mObject.getDepth();
+      mObjectTexture     = act.getTexture();
+      mObjectGrid        = act.getGrid();
+      mObjectQueues      = act.getQueues();
+      mBackgroundTexture = new DistortedTexture(100, 100, 0);
+      mCenterTexture     = new DistortedTexture(100, 100, 0);
+      mRegionTexture     = new DistortedTexture(100, 100, 0);
+      mQuad              = new GridFlat(1,1);
+      mBackgroundQueues  = new DistortedEffectQueues();
+      mCenterQueues      = new DistortedEffectQueues();
+      mRegionQueues      = new DistortedEffectQueues();
+
+      mObjWidth = mObjectTexture.getWidth();
+      mObjHeight= mObjectTexture.getHeight();
+      mObjDepth = mObjectTexture.getDepth();
 
       mQuat1 = new Static4D(0,0,0,1);  // unity
       mQuat2 = new Static4D(0,0,0,1);  // quaternions
@@ -117,7 +120,7 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
 
     void setRegion(float x, float y, float r)
       {
-      mFactorReg = 2*mFactorObj*r/mRegion.getWidth();
+      mFactorReg = 2*mFactorObj*r/mRegionTexture.getWidth();
       mRegionPoint.set(mFactorObj*x,mFactorObj*y,0);
       mRegionScalePoint.set(mFactorReg,mFactorReg,mFactorReg);
       }
@@ -130,13 +133,13 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
 
       long time = System.currentTimeMillis();
 
-      mBackground.draw(time,mQuad);
-      mObject.draw(time,mGrid);
+      mBackgroundQueues.draw(time,mBackgroundTexture,mQuad);
+      mObjectQueues.draw(time,mObjectTexture,mObjectGrid);
 
       if( Effects3DActivity.supportsCenter() )
         {
-        mCenter.draw(time, mQuad);
-        if( Effects3DActivity.supportsRegion() ) mRegion.draw(time, mQuad);
+        mCenterQueues.draw(time, mCenterTexture,mQuad);
+        if( Effects3DActivity.supportsRegion() ) mRegionQueues.draw(time, mRegionTexture,mQuad);
         }
       }
 
@@ -146,14 +149,14 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
       {
       mScreenMin = width<height ? width:height;
 
-      mObject.abortEffects(EffectTypes.MATRIX);
-      mBackground.abortEffects(EffectTypes.MATRIX);
-      mCenter.abortEffects(EffectTypes.MATRIX);
-      mRegion.abortEffects(EffectTypes.MATRIX);
+      mObjectQueues.abortEffects(EffectTypes.MATRIX);
+      mBackgroundQueues.abortEffects(EffectTypes.MATRIX);
+      mCenterQueues.abortEffects(EffectTypes.MATRIX);
+      mRegionQueues.abortEffects(EffectTypes.MATRIX);
 
       float factorCen;
-      int centerSize = mCenter.getWidth();
-      int regionSize = mRegion.getWidth();
+      int centerSize = mCenterTexture.getWidth();
+      int regionSize = mRegionTexture.getWidth();
 
       if( width*mObjHeight > height*mObjWidth ) // screen is more 'horizontal' than the Object
         {
@@ -175,37 +178,37 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
 
       Static3D rotateObj = new Static3D(mObjWidth/2,mObjHeight/2, 0);
 
-      mObject.move( new Static3D( (width-mFactorObj*mObjWidth)/2 , (height-mFactorObj*mObjHeight)/2 , 0) );
-      mObject.scale(mFactorObj);
-      mObject.quaternion(mQuatInt1, rotateObj);
-      mObject.quaternion(mQuatInt2, rotateObj);
+      mObjectQueues.move( new Static3D( (width-mFactorObj*mObjWidth)/2 , (height-mFactorObj*mObjHeight)/2 , 0) );
+      mObjectQueues.scale(mFactorObj);
+      mObjectQueues.quaternion(mQuatInt1, rotateObj);
+      mObjectQueues.quaternion(mQuatInt2, rotateObj);
 
       Static3D rotateCen = new Static3D(width/2,height/2, 0);
 
-      mCenter.quaternion(mQuatInt1, rotateCen);
-      mCenter.quaternion(mQuatInt2, rotateCen);
+      mCenterQueues.quaternion(mQuatInt1, rotateCen);
+      mCenterQueues.quaternion(mQuatInt2, rotateCen);
 
-      mCenter.move( new Static3D( (width -factorCen*centerSize-mFactorObj*mObjWidth )/2 ,
+      mCenterQueues.move( new Static3D( (width -factorCen*centerSize-mFactorObj*mObjWidth )/2 ,
                                   (height-factorCen*centerSize-mFactorObj*mObjHeight)/2 , mFactorObj*mObjDepth/2+10) );
-      mCenter.move(mCenterInter);
-      mCenter.scale(factorCen);
+      mCenterQueues.move(mCenterInter);
+      mCenterQueues.scale(factorCen);
 
-      mRegion.quaternion(mQuatInt1, rotateCen);
-      mRegion.quaternion(mQuatInt2, rotateCen);
+      mRegionQueues.quaternion(mQuatInt1, rotateCen);
+      mRegionQueues.quaternion(mQuatInt2, rotateCen);
 
-      mRegion.move( new Static3D( (width -mFactorObj*mObjWidth )/2 ,
+      mRegionQueues.move( new Static3D( (width -mFactorObj*mObjWidth )/2 ,
                                   (height-mFactorObj*mObjHeight)/2 , mFactorObj*mObjDepth/2+12) );
-      mRegion.move(mCenterInter);
-      mRegion.move(mRegionInter);
-      mRegion.scale(mRegionScaleInter);
-      mRegion.move( new Static3D( -regionSize/2 , -regionSize/2 , 0) );
+      mRegionQueues.move(mCenterInter);
+      mRegionQueues.move(mRegionInter);
+      mRegionQueues.scale(mRegionScaleInter);
+      mRegionQueues.move( new Static3D( -regionSize/2 , -regionSize/2 , 0) );
 
-      int backgroundSize = mBackground.getWidth();
+      int backgroundSize = mBackgroundTexture.getWidth();
       float factorBackX = ((float)width)/backgroundSize;
       float factorBackY = ((float)height)/backgroundSize;
 
-      mBackground.move(new Static3D( -width/2, -height/2,-mFactorObj*(mObjWidth+mObjHeight)/2) );
-      mBackground.scale(new Static3D(2*factorBackX, 2*factorBackY, 1.0f) );
+      mBackgroundQueues.move(new Static3D( -width/2, -height/2,-mFactorObj*(mObjWidth+mObjHeight)/2) );
+      mBackgroundQueues.scale(new Static3D(2*factorBackX, 2*factorBackY, 1.0f) );
 
       Distorted.onSurfaceChanged(width, height);
       }
@@ -218,33 +221,33 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
 
       Effects3DActivity act = (Effects3DActivity)mView.getContext();
 
-      InputStream is1 = act.getResources().openRawResource(R.raw.water);
-      InputStream is2 = act.getResources().openRawResource(R.raw.center);
-      InputStream is3 = act.getResources().openRawResource(R.raw.region);
+      InputStream isB = act.getResources().openRawResource(R.raw.water);
+      InputStream isC = act.getResources().openRawResource(R.raw.center);
+      InputStream isR = act.getResources().openRawResource(R.raw.region);
 
-      Bitmap bitmap1,bitmap2,bitmap3;
+      Bitmap bitmapB,bitmapC,bitmapR;
         
       try 
         {
-        bitmap1 = BitmapFactory.decodeStream(is1);
-        bitmap2 = BitmapFactory.decodeStream(is2);
-        bitmap3 = BitmapFactory.decodeStream(is3);
+        bitmapB = BitmapFactory.decodeStream(isB);
+        bitmapC = BitmapFactory.decodeStream(isC);
+        bitmapR = BitmapFactory.decodeStream(isR);
         }
       finally 
         {
         try 
           {
-          is1.close();
-          is2.close();
-          is3.close();
+          isB.close();
+          isC.close();
+          isR.close();
           }
         catch(IOException e) { }
         }  
       
-      mObject.setTexture( act.getBitmap() );
-      mBackground.setTexture(bitmap1);
-      mCenter.setTexture(bitmap2);
-      mRegion.setTexture(bitmap3);
+      mObjectTexture.setTexture( act.getBitmap() );
+      mBackgroundTexture.setTexture(bitmapB);
+      mCenterTexture.setTexture(bitmapC);
+      mRegionTexture.setTexture(bitmapR);
 
       try
         {
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DSurfaceView.java b/src/main/java/org/distorted/examples/effects3d/Effects3DSurfaceView.java
index 825648f..97bb6c5 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DSurfaceView.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DSurfaceView.java
@@ -21,7 +21,6 @@ package org.distorted.examples.effects3d;
 
 import android.content.Context;
 import android.opengl.GLSurfaceView;
-import android.os.Build;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 
diff --git a/src/main/java/org/distorted/examples/fbo/FBORenderer.java b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
index 3f1c8e5..8639c10 100644
--- a/src/main/java/org/distorted/examples/fbo/FBORenderer.java
+++ b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
@@ -30,7 +30,8 @@ import org.distorted.examples.R;
 import org.distorted.library.DistortedObjectTree;
 import org.distorted.library.Distorted;
 import org.distorted.library.GridFlat;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Static1D;
@@ -46,7 +47,7 @@ import android.opengl.GLSurfaceView;
 class FBORenderer implements GLSurfaceView.Renderer 
 {
    private GLSurfaceView mView;
-   private DistortedObject mLisa;
+   private DistortedEffectQueues mQueues;
    private int lisaHeight, lisaWidth;
     
    private DistortedObjectTree mRoot;
@@ -56,6 +57,7 @@ class FBORenderer implements GLSurfaceView.Renderer
    FBORenderer(GLSurfaceView v)
       {
       mView = v;
+      mQueues = new DistortedEffectQueues();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -70,23 +72,23 @@ class FBORenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       { 
-      mLisa.abortEffects(EffectTypes.MATRIX);
+      mQueues.abortEffects(EffectTypes.MATRIX);
          
       if( (float)lisaHeight/lisaWidth > (float)height/width )
         {
         int w = (height*lisaWidth)/lisaHeight;
         float factor = (float)height/lisaHeight;
 
-        mLisa.move( new Static3D((width-w)/2,0,0) );
-        mLisa.scale(factor);
+        mQueues.move( new Static3D((width-w)/2,0,0) );
+        mQueues.scale(factor);
         }
       else
         {
         int h = (width*lisaHeight)/lisaWidth;
         float factor = (float)width/lisaWidth;
 
-        mLisa.move( new Static3D(0,(height-h)/2,0) );
-        mLisa.scale(factor);
+        mQueues.move( new Static3D(0,(height-h)/2,0) );
+        mQueues.scale(factor);
         }
       
       Distorted.onSurfaceChanged(width, height); 
@@ -118,36 +120,36 @@ class FBORenderer implements GLSurfaceView.Renderer
         catch(IOException e) { }
         }  
       
-      lisaHeight = bitmap1.getHeight();
-      lisaWidth  = bitmap1.getWidth();
-      
-      mLisa = new DistortedObject(lisaWidth, lisaHeight, 1);
-      mLisa.setTexture(bitmap1);
-      DistortedObject text = new DistortedObject(bitmap2.getWidth(),bitmap2.getHeight(),1);
+      lisaWidth     = bitmap1.getWidth();
+      lisaHeight    = bitmap1.getHeight();
+      int textWidth = bitmap2.getWidth();
+      int textHeight= bitmap2.getHeight();
+
+      DistortedTexture lisa = new DistortedTexture(lisaWidth,lisaHeight,0);
+      DistortedTexture text = new DistortedTexture(textWidth,textHeight,0);
+      lisa.setTexture(bitmap1);
       text.setTexture(bitmap2);
+      DistortedEffectQueues textQueues = new DistortedEffectQueues();
 
-      mRoot = new DistortedObjectTree(mLisa,new GridFlat(1,1));
-      mRoot.attach(text,new GridFlat(20,5));
-     
-      int textWidth  = text.getWidth();
-      int textHeight = text.getHeight();
+      mRoot = new DistortedObjectTree(lisa,mQueues,new GridFlat(1,1));
+      mRoot.attach(text,textQueues,new GridFlat(20,5));
 
       float factor = lisaWidth/(1.5f*textWidth);
 
-      text.move( new Static3D(lisaWidth/6,lisaHeight/3,0) );
-      text.scale(factor);
+      textQueues.move( new Static3D(lisaWidth/6,lisaHeight/3,0) );
+      textQueues.scale(factor);
 
       Dynamic1D sinkDyn = new Dynamic1D(5000,0.0f);
       sinkDyn.add(new Static1D(1.0f));
       sinkDyn.add(new Static1D(0.5f));
 
-      text.sink(sinkDyn, new Static3D(textWidth/2,textHeight/2, 0));
+      textQueues.sink(sinkDyn, new Static3D(textWidth/2,textHeight/2, 0));
 
       Dynamic1D chromaDyn = new Dynamic1D(10000,0.0f);
       chromaDyn.add(new Static1D(0.0f));
       chromaDyn.add(new Static1D(0.5f));
 
-      mLisa.chroma(chromaDyn, new Static3D(0,0,1) );
+      mQueues.chroma(chromaDyn, new Static3D(0,0,1) );
       
       try
         {
diff --git a/src/main/java/org/distorted/examples/girl/GirlRenderer.java b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
index 5d5bfda..1c90a0a 100644
--- a/src/main/java/org/distorted/examples/girl/GirlRenderer.java
+++ b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
@@ -29,7 +29,8 @@ import org.distorted.examples.R;
 
 import org.distorted.library.Distorted;
 import org.distorted.library.GridFlat;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
@@ -47,50 +48,40 @@ import android.opengl.GLSurfaceView;
 class GirlRenderer implements GLSurfaceView.Renderer 
 {
     private GLSurfaceView mView;
-    private DistortedObject mGirl;
+    private DistortedTexture mTexture;
+    private DistortedEffectQueues mQueues;
     private GridFlat mGrid;
-    private Static3D pLeft, pRight, pHips;
-    private Static4D Region, sinkRegion, HipsRegion;
-    private Dynamic3D diL, diR;
-    private Dynamic1D diHips, diSink;
     private Static3D v0,v1,v2,v3;
     private Static1D dBegin, dMiddle, dEnd, s0;
     private int bmpHeight, bmpWidth;
-    private int boobsSwing;
-    private int hipsSwirl;
-    private float boobsSink;
-    
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    GirlRenderer(GLSurfaceView v)
       {
       mView = v;
-      
-      boobsSwing = 0;
-      hipsSwirl  = 0;
-      boobsSink  = 1.0f;
-      
-      pLeft = new Static3D(132, 264, 0);
-      pRight= new Static3D(247, 264, 0);
+
+      Static3D pLeft = new Static3D(132, 264, 0);
+      Static3D pRight= new Static3D(247, 264, 0);
       
       // Size
-      sinkRegion = new Static4D(0,0,60,60);
+      Static4D sinkRegion = new Static4D(0,0,60,60);
       
-      s0 = new Static1D(boobsSink);
+      s0 = new Static1D(1.0f);
       
-      diSink = new Dynamic1D(0,0.5f);
+      Dynamic1D diSink = new Dynamic1D(0,0.5f);
       diSink.add(s0);
       
       // Upper Movement
-      Region = new Static4D(0,0,45,45);
+      Static4D Region = new Static4D(0,0,45,45);
       
-      diL = new Dynamic3D(1000,0.0f);
-      diR = new Dynamic3D(1000,0.0f);
+      Dynamic3D diL = new Dynamic3D(1000,0.0f);
+      Dynamic3D diR = new Dynamic3D(1000,0.0f);
 
-      v0 = new Static3D( 0,-boobsSwing, 0);
-      v1 = new Static3D( boobsSwing, 0, 0);
-      v2 = new Static3D( 0, boobsSwing, 0);
-      v3 = new Static3D(-boobsSwing, 0, 0);
+      v0 = new Static3D(0,0,0);
+      v1 = new Static3D(0,0,0);
+      v2 = new Static3D(0,0,0);
+      v3 = new Static3D(0,0,0);
       
       diL.add(v0);
       diL.add(v1);
@@ -103,13 +94,13 @@ class GirlRenderer implements GLSurfaceView.Renderer
       diR.add(v1);
       
       // Lower Movement
-      pHips = new Static3D(216,505,0);
-      HipsRegion = new Static4D(0,0,120,120);
-      diHips = new Dynamic1D(1500,0.0f);
+      Static3D pHips = new Static3D(216,505,0);
+      Static4D HipsRegion = new Static4D(0,0,120,120);
+      Dynamic1D diHips = new Dynamic1D(1500,0.0f);
       
-      dBegin = new Static1D(-hipsSwirl);
+      dBegin = new Static1D(0);
       dMiddle= new Static1D(0);
-      dEnd   = new Static1D(+hipsSwirl);
+      dEnd   = new Static1D(0);
       
       diHips.add(dBegin);
       diHips.add(dMiddle);
@@ -117,35 +108,41 @@ class GirlRenderer implements GLSurfaceView.Renderer
       diHips.add(dEnd);
       diHips.add(dMiddle);
       diHips.add(dBegin);
+
+      mQueues = new DistortedEffectQueues();
+
+      mQueues.sink( diSink, pLeft, sinkRegion );
+      mQueues.sink( diSink, pRight,sinkRegion );
+
+      mQueues.distort(diL, pLeft , Region);
+      mQueues.distort(diR, pRight, Region);
+
+      mQueues.swirl(diHips, pHips, HipsRegion );
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   void setHips(int s)
+   void setHips(int swirl)
      {      
-     hipsSwirl = s;
-     dBegin.set(-hipsSwirl);
-     dEnd.set(+hipsSwirl);
+     dBegin.set(-swirl);
+     dEnd.set(+swirl);
      }
    
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   void setSize(float s)
+   void setSize(float size)
      {
-     boobsSink = s;
-     s0.set(boobsSink);
+     s0.set(size);
      }
    
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   void setSwing(int s)
+   void setSwing(int swing)
      {
-     boobsSwing = s; 
-     
-     v0.set( 0,-boobsSwing, 0);
-     v1.set( boobsSwing, 0, 0);
-     v2.set( 0, boobsSwing, 0);
-     v3.set(-boobsSwing, 0, 0);
+     v0.set( 0,-swing, 0);
+     v1.set( swing, 0, 0);
+     v2.set( 0, swing, 0);
+     v3.set(-swing, 0, 0);
      }
    
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -153,30 +150,30 @@ class GirlRenderer implements GLSurfaceView.Renderer
    public void onDrawFrame(GL10 glUnused) 
       {
       GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-      mGirl.draw(System.currentTimeMillis(),mGrid);
+      mQueues.draw(System.currentTimeMillis(),mTexture,mGrid);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       { 
-      mGirl.abortEffects(EffectTypes.MATRIX);
+      mQueues.abortEffects(EffectTypes.MATRIX);
       
       if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
 
-        mGirl.move( new Static3D((width-w)/2,0,0) );
-        mGirl.scale(factor);
+        mQueues.move( new Static3D((width-w)/2,0,0) );
+        mQueues.scale(factor);
         }
       else
         {
         int h = (width*bmpHeight)/bmpWidth;
         float factor = (float)width/bmpWidth;
 
-        mGirl.move( new Static3D(0,(height-h)/2,0) );
-        mGirl.scale(factor);
+        mQueues.move( new Static3D(0,(height-h)/2,0) );
+        mQueues.scale(factor);
         }
       
       Distorted.onSurfaceChanged(width, height); 
@@ -208,17 +205,9 @@ class GirlRenderer implements GLSurfaceView.Renderer
       bmpWidth  = bitmap.getWidth();
 
       mGrid = new GridFlat(30,30*bmpHeight/bmpWidth);
-      mGirl = new DistortedObject(bmpWidth,bmpHeight,1);
-      mGirl.setTexture(bitmap);
+      mTexture = new DistortedTexture(bmpWidth,bmpHeight,0);
+      mTexture.setTexture(bitmap);
 
-      mGirl.sink( diSink, pLeft, sinkRegion );
-      mGirl.sink( diSink, pRight,sinkRegion );
-
-      mGirl.distort(diL, pLeft , Region);
-      mGirl.distort(diR, pRight, Region);
-         
-      mGirl.swirl(diHips, pHips, HipsRegion );
-      
       try
         {
         Distorted.onSurfaceCreated(mView.getContext());
diff --git a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
index 7ce32cb..2624008 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
@@ -30,7 +30,8 @@ import org.distorted.examples.R;
 
 import org.distorted.library.Distorted;
 import org.distorted.library.GridFlat;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.EffectNames;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic3D;
@@ -51,7 +52,8 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
    private final int NUM_BUBBLES = 12;
 
    private GLSurfaceView mView;
-   private DistortedObject mWater;
+   private DistortedTexture mTexture;
+   private DistortedEffectQueues mQueues;
    private GridFlat mGrid;
    private int bmpHeight, bmpWidth;
    private Random mRnd;
@@ -62,6 +64,9 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
       {
       Distorted.setMaxVertex(NUM_BUBBLES);   
       mView = v;
+      mQueues = new DistortedEffectQueues();
+      mQueues.addEventListener(this);
+      mRnd = new Random(0);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -78,7 +83,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
       dDistort.add(new Static3D(0,0,     0));
       dDistort.add(new Static3D(0,0,height));
 
-      return mWater.distort(dDistort, new Static3D(pointx,pointy,0), new Static4D(0,0,radius,radius));
+      return mQueues.distort(dDistort, new Static3D(pointx,pointy,0), new Static4D(0,0,radius,radius));
       }
    
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -98,30 +103,30 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
     public void onDrawFrame(GL10 glUnused) 
       {
       GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-      mWater.draw(System.currentTimeMillis(), mGrid);
+      mQueues.draw(System.currentTimeMillis(), mTexture,mGrid);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       { 
-      mWater.abortEffects(EffectTypes.MATRIX);
+      mQueues.abortEffects(EffectTypes.MATRIX);
          
       if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
 
-        mWater.move( new Static3D((width-w)/2,0,0) );
-        mWater.scale(factor);
+        mQueues.move( new Static3D((width-w)/2,0,0) );
+        mQueues.scale(factor);
         }
       else
         {
         int h = (width*bmpHeight)/bmpWidth;
         float factor = (float)width/bmpWidth;
 
-        mWater.move( new Static3D(0,(height-h)/2,0) );
-        mWater.scale(factor);
+        mQueues.move( new Static3D(0,(height-h)/2,0) );
+        mQueues.scale(factor);
         }
       
       Distorted.onSurfaceChanged(width, height); 
@@ -148,17 +153,14 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
           } 
         catch(IOException e) { }
         }  
-      
-      mRnd = new Random(0);
-      
+
       bmpHeight = bitmap.getHeight();
       bmpWidth  = bitmap.getWidth();
 
-      mGrid  = new GridFlat(50,50*bmpHeight/bmpWidth);
-      mWater = new DistortedObject(bmpWidth,bmpHeight,1);
-      mWater.setTexture(bitmap);
-      mWater.addEventListener(this);
-      
+      mGrid    = new GridFlat(50,50*bmpHeight/bmpWidth);
+      mTexture = new DistortedTexture(bmpWidth,bmpHeight,0);
+      mTexture.setTexture(bitmap);
+
       for(int i=0; i<NUM_BUBBLES; i++) randomizeNewBubble();
       
       try
diff --git a/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java b/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java
index 5c66a82..691c276 100644
--- a/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java
+++ b/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java
@@ -32,9 +32,10 @@ import android.widget.Spinner;
 
 import org.distorted.examples.R;
 import org.distorted.library.Distorted;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.GridObject;
 import org.distorted.library.GridCubes;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
 import org.distorted.library.EffectNames;
 import org.distorted.library.EffectTypes;
 
@@ -46,8 +47,9 @@ import java.util.ArrayList;
 
 public class Matrix3DActivity extends Activity implements AdapterView.OnItemSelectedListener
   {
-  private DistortedObject mObject;
+  private DistortedTexture mTexture;
   private GridObject mGrid;
+  private DistortedEffectQueues mQueues;
 
   private ArrayList<Matrix3DEffect> mEffects;
   private int mEffectAdd;
@@ -67,8 +69,9 @@ public class Matrix3DActivity extends Activity implements AdapterView.OnItemSele
 
     createEffectNames();
 
+    mQueues = new DistortedEffectQueues();
     mGrid   = new GridCubes(1,1,false);
-    mObject = new DistortedObject(100,100,100);
+    mTexture= new DistortedTexture(100,100,100);
 
     setEffectView();
     }
@@ -99,9 +102,16 @@ public class Matrix3DActivity extends Activity implements AdapterView.OnItemSele
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public DistortedObject getObject()
+  public DistortedEffectQueues getQueues()
     {
-    return mObject;
+    return mQueues;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public DistortedTexture getTexture()
+    {
+    return mTexture;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -181,37 +191,37 @@ public class Matrix3DActivity extends Activity implements AdapterView.OnItemSele
 
   public int getWidth()
     {
-    return mObject==null ? 0: mObject.getWidth();
+    return mTexture==null ? 0: mTexture.getWidth();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int getHeight()
     {
-    return mObject==null ? 0: mObject.getHeight();
+    return mTexture==null ? 0: mTexture.getHeight();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int getScreenWidth()
+  public int getDepth()
     {
-    Matrix3DRenderer r = ((Matrix3DSurfaceView)findViewById(R.id.matrix3dSurfaceView)).getRenderer();
-    return r.getWidth();
+    return mTexture==null ? 0: mTexture.getDepth();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int getScreenHeight()
+  public int getScreenWidth()
     {
     Matrix3DRenderer r = ((Matrix3DSurfaceView)findViewById(R.id.matrix3dSurfaceView)).getRenderer();
-    return r.getHeight();
+    return r.getWidth();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int getDepth()
+  public int getScreenHeight()
     {
-    return mObject==null ? 0: mObject.getDepth();
+    Matrix3DRenderer r = ((Matrix3DSurfaceView)findViewById(R.id.matrix3dSurfaceView)).getRenderer();
+    return r.getHeight();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -279,7 +289,7 @@ public class Matrix3DActivity extends Activity implements AdapterView.OnItemSele
       layout.addView(center);
       }
 
-    eff.apply(mObject);
+    eff.apply(mQueues);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -289,7 +299,7 @@ public class Matrix3DActivity extends Activity implements AdapterView.OnItemSele
     mEffects.clear();
     LinearLayout layout = (LinearLayout)findViewById(R.id.matrix3dlayout);
     layout.removeAllViews();
-    mObject.abortEffects(EffectTypes.MATRIX);
+    mQueues.abortEffects(EffectTypes.MATRIX);
 
     resetData();
     }
@@ -312,8 +322,7 @@ public class Matrix3DActivity extends Activity implements AdapterView.OnItemSele
         view = effect.getRegion();
         if( view!=null ) layout.removeView(view);
 
-        long id = effect.getId();
-        mObject.abortEffect(id);
+        mQueues.abortEffect(effect.getId());
         mEffects.remove(effect);
 
         resetData();
diff --git a/src/main/java/org/distorted/examples/matrix3d/Matrix3DRenderer.java b/src/main/java/org/distorted/examples/matrix3d/Matrix3DRenderer.java
index d0bca10..0c94891 100644
--- a/src/main/java/org/distorted/examples/matrix3d/Matrix3DRenderer.java
+++ b/src/main/java/org/distorted/examples/matrix3d/Matrix3DRenderer.java
@@ -23,8 +23,9 @@ import android.opengl.GLES20;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.library.Distorted;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.GridObject;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
 import org.distorted.library.EffectTypes;
 
 import javax.microedition.khronos.egl.EGLConfig;
@@ -35,7 +36,8 @@ import javax.microedition.khronos.opengles.GL10;
 class Matrix3DRenderer implements GLSurfaceView.Renderer
 {
     private GLSurfaceView mView;
-    private DistortedObject mObject;
+    private DistortedTexture mTexture;
+    private DistortedEffectQueues mQueues;
     private GridObject mGrid;
 
     private int mWidth, mHeight;
@@ -48,8 +50,9 @@ class Matrix3DRenderer implements GLSurfaceView.Renderer
 
       Matrix3DActivity act = (Matrix3DActivity)v.getContext();
 
-      mObject= act.getObject();
-      mGrid  = act.getGrid();
+      mQueues = act.getQueues();
+      mTexture= act.getTexture();
+      mGrid   = act.getGrid();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -57,10 +60,7 @@ class Matrix3DRenderer implements GLSurfaceView.Renderer
     public void onDrawFrame(GL10 glUnused)
       {
       GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-
-      long time = System.currentTimeMillis();
-
-      mObject.draw(time,mGrid);
+      mQueues.draw(System.currentTimeMillis(),mTexture,mGrid);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -81,7 +81,7 @@ class Matrix3DRenderer implements GLSurfaceView.Renderer
 
     public void onSurfaceChanged(GL10 glUnused, int width, int height)
       {
-      mObject.abortEffects(EffectTypes.MATRIX);
+      mQueues.abortEffects(EffectTypes.MATRIX);
 
       mWidth = width;
       mHeight= height;
@@ -97,7 +97,7 @@ class Matrix3DRenderer implements GLSurfaceView.Renderer
 
       Matrix3DActivity act = (Matrix3DActivity)mView.getContext();
 
-      mObject.setTexture(act.getBitmap());
+      mTexture.setTexture(act.getBitmap());
 
       try
         {
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
index 189021e..8059c28 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
@@ -27,7 +27,8 @@ import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.examples.R;
 import org.distorted.library.Distorted;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.GridFlat;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic3D;
@@ -44,31 +45,32 @@ import android.opengl.GLSurfaceView;
 class MonaLisaRenderer implements GLSurfaceView.Renderer 
 {
     private GLSurfaceView mView;
-    private DistortedObject mObject;
+    private DistortedTexture mTexture;
+    private DistortedEffectQueues mQueues;
     private GridFlat mGrid;
-    private Static3D pLeft, pRight;
-    private Static4D rLeft, rRight;
-    private Dynamic3D dLeft, dRight;
-
     private int bmpHeight, bmpWidth;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public MonaLisaRenderer(GLSurfaceView v) 
+    MonaLisaRenderer(GLSurfaceView v)
       {
       mView = v;
 
-      pLeft = new Static3D( 90, 258, 0);
-      pRight= new Static3D(176, 255, 0);
+      Static3D pLeft = new Static3D( 90, 258, 0);
+      Static3D pRight= new Static3D(176, 255, 0);
 
-      rLeft = new Static4D(-10,-10,25,25);
-      rRight= new Static4D( 10, -5,25,25);
-      dLeft = new Dynamic3D(1000,0.0f);
-      dRight= new Dynamic3D(1000,0.0f);
+      Static4D rLeft = new Static4D(-10,-10,25,25);
+      Static4D rRight= new Static4D( 10, -5,25,25);
+      Dynamic3D dLeft = new Dynamic3D(1000,0.0f);
+      Dynamic3D dRight= new Dynamic3D(1000,0.0f);
       dLeft.add ( new Static3D(  0,  0,0) );
       dLeft.add ( new Static3D(-20,-20,0) );
       dRight.add( new Static3D(  0,  0,0) );
       dRight.add( new Static3D( 20,-10,0) );
+
+      mQueues = new DistortedEffectQueues();
+      mQueues.distort( dLeft, pLeft , rLeft );
+      mQueues.distort(dRight, pRight, rRight);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -76,28 +78,28 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
     public void onDrawFrame(GL10 glUnused) 
       {
       GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-      mObject.draw(System.currentTimeMillis(),mGrid);
+      mQueues.draw(System.currentTimeMillis(),mTexture,mGrid);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       { 
-      mObject.abortEffects(EffectTypes.MATRIX);
+      mQueues.abortEffects(EffectTypes.MATRIX);
 
       if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
-        mObject.move( new Static3D((width-w)/2,0,0) );
-        mObject.scale(factor);
+        mQueues.move( new Static3D((width-w)/2,0,0) );
+        mQueues.scale(factor);
         }
       else
         {
         int h = (width*bmpHeight)/bmpWidth;
         float factor = (float)width/bmpWidth;
-        mObject.move( new Static3D(0,(height-h)/2,0) );
-        mObject.scale(factor);
+        mQueues.move( new Static3D(0,(height-h)/2,0) );
+        mQueues.scale(factor);
         }
 
       Distorted.onSurfaceChanged(width, height); 
@@ -129,10 +131,8 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
       bmpWidth  = bitmap.getWidth();
 
       mGrid = new GridFlat(9,9*bmpHeight/bmpWidth);
-      mObject = new DistortedObject(bmpWidth,bmpHeight,1);
-      mObject.setTexture(bitmap);
-      mObject.distort( dLeft, pLeft , rLeft );
-      mObject.distort(dRight, pRight, rRight);
+      mTexture = new DistortedTexture(bmpWidth,bmpHeight,0);
+      mTexture.setTexture(bitmap);
 
       try
         {
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java
index b8e544d..d25e4a0 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java
@@ -37,7 +37,7 @@ public class MovingEffectsActivity extends Activity
     private static final int COLOR_UNPRESSED = 0x888888ff;
     private static final String SHOWED_TOAST = "showed_toast";
 
-    Button mAbort, mChroma, mTrans, mSink, mBubble, mSwirl;
+    private Button mAbort, mChroma, mTrans, mSink, mBubble, mSwirl;
    
 ///////////////////////////////////////////////////////////////////
     @Override
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
index 5743708..9ffebaa 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
@@ -29,7 +29,8 @@ import android.graphics.Paint.Style;
 import android.opengl.GLES20;
 import android.opengl.GLSurfaceView;
 
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.GridFlat;
 import org.distorted.library.Distorted;
 
@@ -44,8 +45,8 @@ class MovingEffectsRenderer implements GLSurfaceView.Renderer
    private int texW, texH;
 
    private GridFlat mGrid;
-
-   static DistortedObject mBackground;
+   private DistortedEffectQueues mQueues;
+   private DistortedTexture mTexture;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -57,6 +58,8 @@ class MovingEffectsRenderer implements GLSurfaceView.Renderer
      mPaint.setStyle(Style.FILL);
       
      mView = v;
+
+     mQueues = new DistortedEffectQueues();
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -85,7 +88,14 @@ class MovingEffectsRenderer implements GLSurfaceView.Renderer
      }
    
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-   
+
+   DistortedEffectQueues getQueues()
+     {
+     return mQueues;
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
      {
      try
@@ -105,10 +115,10 @@ class MovingEffectsRenderer implements GLSurfaceView.Renderer
      texW = width;
      texH = height;
 
-     mGrid = new GridFlat(80,80*height/width);
-     mBackground = new DistortedObject(texW,texH,1);
-     mBitmap = Bitmap.createBitmap(texW,texH, Bitmap.Config.ARGB_8888);
-     mCanvas = new Canvas(mBitmap);
+     mGrid    = new GridFlat(80,80*texH/texW);
+     mTexture = new DistortedTexture(texW,texH,0);
+     mBitmap  = Bitmap.createBitmap(texW,texH, Bitmap.Config.ARGB_8888);
+     mCanvas  = new Canvas(mBitmap);
 
      Distorted.onSurfaceChanged(texW, texH);
      mView.onSurfaceChanged(texW,texH);
@@ -126,10 +136,10 @@ class MovingEffectsRenderer implements GLSurfaceView.Renderer
        {
        drawBackground();   
        mView.drawCurve(mCanvas,time);
-       mBackground.setTexture(mBitmap);
+       mTexture.setTexture(mBitmap);
        }
       
-     mBackground.draw(time,mGrid);
+     mQueues.draw(time,mTexture,mGrid);
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
index b9628ad..355ae07 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
@@ -24,12 +24,11 @@ import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
 import android.opengl.GLSurfaceView;
-import android.os.Build;
 import android.view.MotionEvent;
 import android.util.AttributeSet;
 
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.EffectTypes;
-import org.distorted.library.type.Dynamic2D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Dynamic4D;
 import org.distorted.library.type.Static1D;
@@ -65,6 +64,8 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
     private int mSize1, mSize2, mSizeR;
     private int mMax;
 
+    private MovingEffectsRenderer mRenderer;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     public MovingEffectsSurfaceView(Context c, AttributeSet attrs) 
@@ -79,12 +80,14 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
       di3D    = new Dynamic3D(LOOP_TIME,0.0f);
       mRegion = new Dynamic4D(LOOP_TIME,0.0f);
 
+      mRenderer = new MovingEffectsRenderer(this);
+
       if(!isInEditMode())
         {
         setFocusable(true);
         setFocusableInTouchMode(true);
         setEGLContextClientVersion(2);
-        setRenderer(new MovingEffectsRenderer(this));
+        setRenderer(mRenderer);
         }
       }
 
@@ -116,9 +119,10 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
       
       synchronized(lock)
         {
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.VERTEX);
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.FRAGMENT);
-        MovingEffectsRenderer.mBackground.distort( new Static3D(0,0,mMax/10) , di3D, dr);
+        DistortedEffectQueues q = mRenderer.getQueues();
+        q.abortEffects(EffectTypes.VERTEX);
+        q.abortEffects(EffectTypes.FRAGMENT);
+        q.distort( new Static3D(0,0,mMax/10) , di3D, dr);
         mCurrEffect = EFFECT_BUBBLE;
         }
       }
@@ -131,9 +135,10 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
          
       synchronized(lock)
         {
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.VERTEX);
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.FRAGMENT);
-        MovingEffectsRenderer.mBackground.sink(new Static1D(10), di3D, dr);
+        DistortedEffectQueues q = mRenderer.getQueues();
+        q.abortEffects(EffectTypes.VERTEX);
+        q.abortEffects(EffectTypes.FRAGMENT);
+        q.sink(new Static1D(10), di3D, dr);
         mCurrEffect = EFFECT_SINK;
         }
       }
@@ -146,9 +151,10 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
          
       synchronized(lock)
         {
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.VERTEX);
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.FRAGMENT);
-        MovingEffectsRenderer.mBackground.chroma(new Static1D(0.5f), new Static3D(1,0,0), mRegion, true);
+        DistortedEffectQueues q = mRenderer.getQueues();
+        q.abortEffects(EffectTypes.VERTEX);
+        q.abortEffects(EffectTypes.FRAGMENT);
+        q.chroma(new Static1D(0.5f), new Static3D(1,0,0), mRegion, true);
         mCurrEffect = EFFECT_CHROMA;
         }
       }
@@ -161,9 +167,10 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
       
       synchronized(lock)
         {
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.VERTEX);
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.FRAGMENT);
-        MovingEffectsRenderer.mBackground.alpha(new Static1D(0.5f), mRegion, true);
+        DistortedEffectQueues q = mRenderer.getQueues();
+        q.abortEffects(EffectTypes.VERTEX);
+        q.abortEffects(EffectTypes.FRAGMENT);
+        q.alpha(new Static1D(0.5f), mRegion, true);
         mCurrEffect = EFFECT_TRANS;
         }
       }
@@ -176,9 +183,10 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
       
       synchronized(lock)
         {
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.VERTEX);
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.FRAGMENT);
-        MovingEffectsRenderer.mBackground.swirl( new Static1D(30), di3D, dr);
+        DistortedEffectQueues q = mRenderer.getQueues();
+        q.abortEffects(EffectTypes.VERTEX);
+        q.abortEffects(EffectTypes.FRAGMENT);
+        q.swirl( new Static1D(30), di3D, dr);
         mCurrEffect = EFFECT_SWIRL;
         }
       }
@@ -189,8 +197,9 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
       {
       synchronized(lock)
         {
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.VERTEX);
-        MovingEffectsRenderer.mBackground.abortEffects(EffectTypes.FRAGMENT);
+        DistortedEffectQueues q = mRenderer.getQueues();
+        q.abortEffects(EffectTypes.VERTEX);
+        q.abortEffects(EffectTypes.FRAGMENT);
         di3D.removeAll();
         mRegion.removeAll();
         mCurrEffect = EFFECT_POINTS;
diff --git a/src/main/java/org/distorted/examples/plainmonalisa/RenderHandler.java b/src/main/java/org/distorted/examples/plainmonalisa/RenderHandler.java
index 6c8e420..d36965a 100644
--- a/src/main/java/org/distorted/examples/plainmonalisa/RenderHandler.java
+++ b/src/main/java/org/distorted/examples/plainmonalisa/RenderHandler.java
@@ -28,7 +28,7 @@ import java.lang.ref.WeakReference;
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // Used for messages sent from the UI thread to the render thread.
 
-public class RenderHandler extends Handler
+class RenderHandler extends Handler
   {
   private static final String TAG = "RenderHandler";
 
@@ -41,35 +41,35 @@ public class RenderHandler extends Handler
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public RenderHandler(RenderThread rt)
+  RenderHandler(RenderThread rt)
     {
     mWeakRenderThread = new WeakReference<>(rt);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void sendSurfaceCreated()
+  void sendSurfaceCreated()
     {
     sendMessage(obtainMessage(RenderHandler.MSG_SURFACE_CREATED));
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void sendSurfaceChanged(int format, int width, int height)
+  void sendSurfaceChanged(int format, int width, int height)
     {
     sendMessage(obtainMessage(RenderHandler.MSG_SURFACE_CHANGED, width, height));
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void sendDoFrame(long frameTimeNanos)
+  void sendDoFrame(long frameTimeNanos)
     {
     sendMessage(obtainMessage(RenderHandler.MSG_DO_FRAME, (int) (frameTimeNanos >> 32), (int) frameTimeNanos));
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void sendShutdown()
+  void sendShutdown()
     {
     sendMessage(obtainMessage(RenderHandler.MSG_SHUTDOWN));
     }
diff --git a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
index 11c1b4e..d2166fa 100644
--- a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
+++ b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
@@ -32,7 +32,8 @@ import android.view.SurfaceView;
 
 import org.distorted.library.Distorted;
 import org.distorted.library.GridFlat;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static3D;
@@ -44,7 +45,7 @@ import java.io.InputStream;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class RenderThread extends Thread
+class RenderThread extends Thread
   {
   private static final String TAG = "RenderThread";
 
@@ -60,38 +61,51 @@ public class RenderThread extends Thread
   private EglCore eglCore;
   private EGLSurface eglSurface;
 
-  private DistortedObject monaLisa;
+  private DistortedTexture mTexture;
+  private DistortedEffectQueues mQueues;
   private GridFlat mGrid;
   private int bmpHeight, bmpWidth;
-
-  private Static3D pLeft, pRight;
-  private Static4D rLeft, rRight;
-
-  private Dynamic3D dLeft, dRight;
-
-  SurfaceView mView;
+  private SurfaceView mView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public RenderThread(SurfaceHolder holder, SurfaceView view)
+  RenderThread(SurfaceHolder holder, SurfaceView view)
     {
     mSurfaceHolder = holder;
     mView = view;
 
-    pLeft = new Static3D( 90, 258, 0);
-    pRight= new Static3D(176, 255, 0);
+    Static3D pLeft = new Static3D( 90, 258, 0);
+    Static3D pRight= new Static3D(176, 255, 0);
 
-    rLeft = new Static4D(-10,-10,25,25);
-    rRight= new Static4D( 10, -5,25,25);
+    Static4D rLeft = new Static4D(-10,-10,25,25);
+    Static4D rRight= new Static4D( 10, -5,25,25);
 
-    dLeft = new Dynamic3D(1000,0.0f);
-    dRight= new Dynamic3D(1000,0.0f);
+    Dynamic3D dLeft = new Dynamic3D(1000,0.0f);
+    Dynamic3D dRight= new Dynamic3D(1000,0.0f);
 
     dLeft.add( new Static3D(  0,  0,0) );
     dLeft.add( new Static3D(-20,-20,0) );
 
     dRight.add( new Static3D(  0,  0,0) );
     dRight.add( new Static3D( 20,-10,0) );
+
+    mQueues = new DistortedEffectQueues();
+    mQueues.distort( dLeft, pLeft , rLeft );
+    mQueues.distort(dRight, pRight, rRight);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private static void checkGlError(String op)
+    {
+    int error = GLES20.glGetError();
+
+    if (error != GLES20.GL_NO_ERROR)
+      {
+      String msg = op + ": glError 0x" + Integer.toHexString(error);
+      Log.e(TAG, msg);
+      throw new RuntimeException(msg);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -133,7 +147,7 @@ public class RenderThread extends Thread
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void waitUntilReady()
+  void waitUntilReady()
     {
     synchronized (mStartLock)
       {
@@ -158,7 +172,7 @@ public class RenderThread extends Thread
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public RenderHandler getHandler()
+  RenderHandler getHandler()
     {
     return mHandler;
     }
@@ -193,10 +207,8 @@ public class RenderThread extends Thread
     bmpHeight = bmp.getHeight();
     bmpWidth  = bmp.getWidth();
 
-    monaLisa = new DistortedObject(bmpWidth,bmpHeight,1);
-    monaLisa.distort( dLeft, pLeft , rLeft );
-    monaLisa.distort(dRight, pRight, rRight);
-    monaLisa.setTexture(bmp);
+    mTexture = new DistortedTexture(bmpWidth,bmpHeight,0);
+    mTexture.setTexture(bmp);
 
     mGrid= new GridFlat(9,9*bmpHeight/bmpWidth);  // more-or-less square Grid with 9 columns.
 
@@ -216,23 +228,23 @@ public class RenderThread extends Thread
     {
     Log.d(TAG, "surfaceChanged " + width + "x" + height);
 
-    monaLisa.abortEffects(EffectTypes.MATRIX);
+    mQueues.abortEffects(EffectTypes.MATRIX);
 
     if( (float)bmpHeight/bmpWidth > (float)height/width )
       {
       int w = (height*bmpWidth)/bmpHeight;
       float factor = (float)height/bmpHeight;
 
-      monaLisa.move( new Static3D((width-w)/2,0,0) );
-      monaLisa.scale( factor );
+      mQueues.move( new Static3D((width-w)/2,0,0) );
+      mQueues.scale( factor );
       }
     else
       {
       int h = (width*bmpHeight)/bmpWidth;
       float factor = (float)width/bmpWidth;
 
-      monaLisa.move( new Static3D(0,(height-h)/2,0) );
-      monaLisa.scale( factor );
+      mQueues.move( new Static3D(0,(height-h)/2,0) );
+      mQueues.scale( factor );
       }
 
     Distorted.onSurfaceChanged(width, height);
@@ -240,7 +252,7 @@ public class RenderThread extends Thread
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void doFrame(long frameTimeNs)
+  void doFrame(long frameTimeNs)
     {
     if( PlainMonaLisaSurfaceView.isPaused() )
       {
@@ -251,22 +263,9 @@ public class RenderThread extends Thread
     eglCore.makeCurrent(eglSurface);
 
     GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-    monaLisa.draw(System.currentTimeMillis(), mGrid);
+    mQueues.draw(System.currentTimeMillis(), mTexture,mGrid);
 
     eglCore.swapBuffers(eglSurface);
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static void checkGlError(String op)
-    {
-    int error = GLES20.glGetError();
-
-    if (error != GLES20.GL_NO_ERROR)
-      {
-      String msg = op + ": glError 0x" + Integer.toHexString(error);
-      Log.e(TAG, msg);
-      throw new RuntimeException(msg);
-      }
-    }
   }
diff --git a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
index f11a88c..af0f7cd 100644
--- a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
+++ b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
@@ -24,7 +24,8 @@ import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.library.Distorted;
 import org.distorted.library.GridFlat;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 
@@ -40,7 +41,8 @@ import android.opengl.GLSurfaceView;
 class ProjectionRenderer implements GLSurfaceView.Renderer
 {
    private GLSurfaceView mView;
-   private DistortedObject mProjection;
+   private DistortedTexture mTexture;
+   private DistortedEffectQueues mQueues;
    private GridFlat mGrid;
 
    private static float mF, mX, mY;
@@ -51,6 +53,7 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
    ProjectionRenderer(GLSurfaceView view)
       { 
       mView = view;
+      mQueues = new DistortedEffectQueues();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -85,7 +88,7 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
    public void onDrawFrame(GL10 glUnused) 
       {
       GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-      mProjection.draw(System.currentTimeMillis(), mGrid);
+      mQueues.draw(System.currentTimeMillis(), mTexture,mGrid);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -95,62 +98,53 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
       mWidth = width;
       mHeight= height;
 
-      Distorted.onSurfaceChanged(width, height);
-      setupBitmap(width,height);
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-    
-   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
-      {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
-
-      try
-        {
-        Distorted.onSurfaceCreated(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Projection", ex.getMessage() );
-        }
-      }
-    
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    private void setupBitmap(int w, int h)
-      {
       Paint paint = new Paint();
-      mProjection = new DistortedObject(w,h,1);
-      mGrid       = new GridFlat(50,50*h/w);
-      Bitmap bmp = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
+      mTexture    = new DistortedTexture(width,height,0);
+      mGrid       = new GridFlat(50,50*height/width);
+      Bitmap bmp  = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);
       Canvas bmpCanvas = new Canvas(bmp);
 
       paint.setColor(0xff008800);
       paint.setStyle(Style.FILL);
-      bmpCanvas.drawRect(0, 0, w, h, paint);
+      bmpCanvas.drawRect(0, 0, width, height, paint);
       paint.setColor(0xffffffff);
 
       final int NUMLINES = 10;
 
       for(int i=0; i<=NUMLINES ; i++ )
         {
-        bmpCanvas.drawRect(w*i/NUMLINES - 1,                0,  w*i/NUMLINES + 1,  h               , paint);
-        bmpCanvas.drawRect(               0, h *i/NUMLINES -1,  w               ,  h*i/NUMLINES + 1, paint);
+        bmpCanvas.drawRect(width*i/NUMLINES - 1,                    0,  width*i/NUMLINES + 1,  height               , paint);
+        bmpCanvas.drawRect(                   0, height*i/NUMLINES -1,  width               ,  height*i/NUMLINES + 1, paint);
         }
-        
-      mProjection.setTexture(bmp);
-        
-      int min = w<h ? w:h;
-        
+
+      mTexture.setTexture(bmp);
+
+      int min = width<height ? width:height;
+
       Static3D vector = new Static3D(0,0,min/5);
       Static4D region = new Static4D(0,0,min/5,min/5);
 
-      mProjection.distort(vector, new Static3D(  w/4,   h/4, 0), region);
-      mProjection.distort(vector, new Static3D(3*w/4,   h/4, 0), region);
-      mProjection.distort(vector, new Static3D(  w/4, 3*h/4, 0), region);
-      mProjection.distort(vector, new Static3D(3*w/4, 3*h/4, 0), region);
+      mQueues.distort(vector, new Static3D(  width/4,   height/4, 0), region);
+      mQueues.distort(vector, new Static3D(3*width/4,   height/4, 0), region);
+      mQueues.distort(vector, new Static3D(  width/4, 3*height/4, 0), region);
+      mQueues.distort(vector, new Static3D(3*width/4, 3*height/4, 0), region);
+
+      Distorted.onSurfaceChanged(width, height);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
+   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
+      {
+      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+      try
+        {
+        Distorted.onSurfaceCreated(mView.getContext());
+        }
+      catch(Exception ex)
+        {
+        android.util.Log.e("Projection", ex.getMessage() );
+        }
+      }
 }
diff --git a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
index 181f933..b0454b8 100644
--- a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
+++ b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
@@ -32,7 +32,8 @@ import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic;
 import org.distorted.library.type.DynamicQuat;
 import org.distorted.library.GridCubes;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.type.Static4D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.Distorted;
@@ -49,20 +50,20 @@ class QuaternionRenderer implements GLSurfaceView.Renderer
   private static final int NUM_QUATERNIONS = 5;
 
   private GLSurfaceView mView;
-  private DistortedObject mCube;
+  private DistortedTexture mTexture;
+  private DistortedEffectQueues mQueues;
   private GridCubes mGrid;
-
   private DynamicQuat mRot;
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   QuaternionRenderer(GLSurfaceView v)
     {
-    mView = v;
-    mGrid = new GridCubes(1,1,false);
-    mCube = new DistortedObject(1,1,1);
-
-    mRot = new DynamicQuat();
+    mView    = v;
+    mGrid    = new GridCubes(1,1,false);
+    mTexture = new DistortedTexture(1,1,1);
+    mQueues  = new DistortedEffectQueues();
+    mRot     = new DynamicQuat();
 
     Random rnd = new Random(System.currentTimeMillis());
     float x,y,z,w, len;
@@ -89,7 +90,7 @@ class QuaternionRenderer implements GLSurfaceView.Renderer
   public void onDrawFrame(GL10 glUnused) 
     {
     GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-    mCube.draw(System.currentTimeMillis(), mGrid);
+    mQueues.draw(System.currentTimeMillis(), mTexture,mGrid);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -98,10 +99,10 @@ class QuaternionRenderer implements GLSurfaceView.Renderer
     {
     float scaleFactor = width>height ? height/3:width/3;
 
-    mCube.abortEffects(EffectTypes.MATRIX);
-    mCube.move( new Static3D( (width-scaleFactor)/2 , (height-scaleFactor)/2 , 0) );
-    mCube.scale(scaleFactor);
-    mCube.quaternion( mRot, new Static3D(0.5f,0.5f,0) );
+    mQueues.abortEffects(EffectTypes.MATRIX);
+    mQueues.move( new Static3D( (width-scaleFactor)/2 , (height-scaleFactor)/2 , 0) );
+    mQueues.scale(scaleFactor);
+    mQueues.quaternion( mRot, new Static3D(0.5f,0.5f,0) );
        
     Distorted.onSurfaceChanged(width, height); 
     }
@@ -128,7 +129,7 @@ class QuaternionRenderer implements GLSurfaceView.Renderer
       catch(IOException e) { }
       }  
       
-    mCube.setTexture(bitmap);
+    mTexture.setTexture(bitmap);
       
     try
       {
diff --git a/src/main/java/org/distorted/examples/sink/SinkRenderer.java b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
index 7df8f4b..5547cef 100644
--- a/src/main/java/org/distorted/examples/sink/SinkRenderer.java
+++ b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
@@ -29,7 +29,8 @@ import org.distorted.examples.R;
 
 import org.distorted.library.Distorted;
 import org.distorted.library.GridFlat;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Static1D;
@@ -46,10 +47,9 @@ import android.opengl.GLSurfaceView;
 class SinkRenderer implements GLSurfaceView.Renderer 
   {
   private GLSurfaceView mView;
-  private DistortedObject mObject;
+  private DistortedTexture mTexture;
+  private DistortedEffectQueues mQueues;
   private GridFlat mGrid;
-  private Static3D pLeft, pRight;
-  private Static4D Region;
   private int bmpHeight, bmpWidth;
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -58,9 +58,17 @@ class SinkRenderer implements GLSurfaceView.Renderer
     { 
     mView = v;
       
-    pLeft = new Static3D(214, 206, 0);
-    pRight= new Static3D(390, 212, 0);
-    Region= new Static4D(0,0,60,60);
+    Static3D pLeft = new Static3D(214, 206, 0);
+    Static3D pRight= new Static3D(390, 212, 0);
+    Static4D Region= new Static4D(0,0,60,60);
+
+    Dynamic1D dSink = new Dynamic1D(2000,0.0f);
+    dSink.add(new Static1D( 1));
+    dSink.add(new Static1D(10));
+
+    mQueues = new DistortedEffectQueues();
+    mQueues.sink( dSink, pLeft, Region);
+    mQueues.sink( dSink, pRight,Region);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -68,30 +76,30 @@ class SinkRenderer implements GLSurfaceView.Renderer
   public void onDrawFrame(GL10 glUnused) 
     {
     GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-    mObject.draw(System.currentTimeMillis(), mGrid);
+    mQueues.draw(System.currentTimeMillis(), mTexture,mGrid);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
   public void onSurfaceChanged(GL10 glUnused, int width, int height) 
     { 
-    mObject.abortEffects(EffectTypes.MATRIX);
+    mQueues.abortEffects(EffectTypes.MATRIX);
          
     if( (float)bmpHeight/bmpWidth > (float)height/width )
       {
       int w = (height*bmpWidth)/bmpHeight;
       float factor = (float)height/bmpHeight;
 
-      mObject.move( new Static3D((width-w)/2,0,0) );
-      mObject.scale( factor );
+      mQueues.move( new Static3D((width-w)/2,0,0) );
+      mQueues.scale( factor );
       }
     else
       {
       int h = (width*bmpHeight)/bmpWidth;
       float factor = (float)width/bmpWidth;
 
-      mObject.move( new Static3D(0,(height-h)/2,0) );
-      mObject.scale( factor );
+      mQueues.move( new Static3D(0,(height-h)/2,0) );
+      mQueues.scale( factor );
       }
       
     Distorted.onSurfaceChanged(width, height); 
@@ -122,17 +130,10 @@ class SinkRenderer implements GLSurfaceView.Renderer
     bmpHeight = bitmap.getHeight();
     bmpWidth  = bitmap.getWidth();
 
-    Dynamic1D dSink = new Dynamic1D(2000,0.0f);
-    dSink.add(new Static1D( 1));
-    dSink.add(new Static1D(10));
+    mGrid    = new GridFlat(30,30*bmpHeight/bmpWidth);
+    mTexture = new DistortedTexture(bmpWidth,bmpHeight,0);
+    mTexture.setTexture(bitmap);
 
-    mGrid = new GridFlat(30,30*bmpHeight/bmpWidth);
-    mObject = new DistortedObject(bmpWidth,bmpHeight,1);
-    mObject.setTexture(bitmap);
-    
-    mObject.sink( dSink, pLeft, Region);
-    mObject.sink( dSink, pRight,Region);
-      
     try
       {
       Distorted.onSurfaceCreated(mView.getContext());
diff --git a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
index d4a8331..f4c95c6 100644
--- a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
+++ b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
@@ -39,7 +39,8 @@ import org.distorted.library.type.Static4D;
 import org.distorted.library.message.EffectListener;
 import org.distorted.library.message.EffectMessage;
 import org.distorted.library.Distorted;
-import org.distorted.library.DistortedObject;
+import org.distorted.library.DistortedTexture;
+import org.distorted.library.DistortedEffectQueues;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
@@ -101,8 +102,9 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
   private final float CRAWL_ANGLE = -30.0f;
    
   private GLSurfaceView mView;
-  private DistortedObject mScreen, mGFFA, mLogo, mCrawl, mCrawlBackground;
-  private DistortedObject[] mStars;
+  private DistortedTexture mScreenTexture, mGFFATexture, mLogoTexture, mCrawlTexture, mCrawlBackgroundTexture, mStarTexture;
+  private DistortedEffectQueues mScreenQueue, mGFFAQueue, mLogoQueue, mCrawlQueue, mCrawlBackgroundQueue;
+  private DistortedEffectQueues[] mStarQueue;
   private long gffaID, logoID, crawlID;
     
   private Random mRnd = new Random(0);
@@ -117,6 +119,18 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
     mView = v;
 
     mQuad = new GridFlat(1,1);
+
+    mScreenQueue          = new DistortedEffectQueues();
+    mGFFAQueue            = new DistortedEffectQueues();
+    mLogoQueue            = new DistortedEffectQueues();
+    mCrawlQueue           = new DistortedEffectQueues();
+    mCrawlBackgroundQueue = new DistortedEffectQueues();
+
+    mStarQueue = new DistortedEffectQueues[NUM_STARS];
+    mStarQueue[0] = new DistortedEffectQueues();
+
+    for(int i=1; i<NUM_STARS; i++) mStarQueue[i] = new DistortedEffectQueues(mStarQueue[0],Distorted.CLONE_VERTEX);
+
     Distorted.setProjection(60.0f, 0.0f, 0.0f);
     }
 
@@ -158,10 +172,10 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
 
   private void setupScreen(int w, int h)
     {
-    mScreen = new DistortedObject(w,h,1);
-    mRoot = new DistortedObjectTree(mScreen,mQuad);
+    mScreenTexture = new DistortedTexture(w,h,0);
+    mRoot = new DistortedObjectTree(mScreenTexture,mScreenQueue,mQuad);
       
-    mCrawlBackground = new DistortedObject(w,(int)(Math.sqrt(3.0)*h),1);
+    mCrawlBackgroundTexture = new DistortedTexture(w,(int)(Math.sqrt(3.0)*h),0);
        
     int randomA, randomX, randomY, randomTime;
     float randomS, randomAlpha1, randomAlpha2;
@@ -175,39 +189,39 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
       {
       randomX = mRnd.nextInt(w);
       randomY = mRnd.nextInt(h);
-      randomS = 0.2f+ mRnd.nextFloat();
+      randomS = 0.2f+ 0.8f*mRnd.nextFloat();
       randomA = (int)(180*mRnd.nextFloat());
       randomAlpha1 = 0.2f + 0.8f*mRnd.nextFloat();
       randomAlpha2 = 0.8f + 0.2f*mRnd.nextFloat();
       randomTime = 500+mRnd.nextInt(2000);
       
-      mStars[i].move( new Static3D(randomX,randomY,0) );
-      mStars[i].scale( new Static3D(randomS,randomS,randomS) );
-      mStars[i].rotate( new Static1D(randomA), axis, center );
+      mStarQueue[i].move( new Static3D(randomX,randomY,0) );
+      mStarQueue[i].scale(randomS);
+      mStarQueue[i].rotate( new Static1D(randomA), axis, center );
       
       Dynamic1D di = new Dynamic1D(randomTime,0.0f);
       di.setNoise(alphaNoise);
       di.add(new Static1D(randomAlpha1));
       di.add(new Static1D(randomAlpha2));
       
-      mStars[i].alpha(di);
+      mStarQueue[i].alpha(di);
       
-      mRoot.attach(mStars[i], mQuad);
+      mRoot.attach(mStarTexture, mStarQueue[i], mQuad);
       }
       
-    float scale = (0.5f*w/mGFFA.getWidth());
+    float scale = (0.5f*w/mGFFATexture.getWidth());
     
     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));
     
-    mGFFA.move( new Static3D(w/5,h/3,0) );
-    mGFFA.scale( new Static3D(scale,scale,scale) );
-    mGFFA.alpha(di);
+    mGFFAQueue.move( new Static3D(w/5,h/3,0) );
+    mGFFAQueue.scale( new Static3D(scale,scale,scale) );
+    mGFFAQueue.alpha(di);
       
-    mRoot.attach(mGFFA, mQuad);
-    mGFFA.addEventListener(this); 
+    mRoot.attach(mGFFATexture, mGFFAQueue, mQuad);
+    mGFFAQueue.addEventListener(this);
     }
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -244,7 +258,7 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
     paint.setTypeface(tf);     
  
     ///// create GFFA ///////////////////
-    mGFFA  = new DistortedObject(GFFA_WIDTH, GFFA_HEIGHT, 1);
+    mGFFATexture  = new DistortedTexture(GFFA_WIDTH, GFFA_HEIGHT, 0);
     bitmapGFFA = Bitmap.createBitmap(GFFA_WIDTH,GFFA_HEIGHT,Bitmap.Config.ARGB_8888);
     bitmapGFFA.eraseColor(0x00000000);
     Canvas gffaCanvas = new Canvas(bitmapGFFA);
@@ -254,14 +268,14 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
       gffaCanvas.drawText(mGFFAString[i], 0, (i+1)*(FONT_HEIGHT+VERTICAL_SPACING), paint);  
       }
   
-    mGFFA.setTexture(bitmapGFFA);
+    mGFFATexture.setTexture(bitmapGFFA);
       
     ///// create Logo ///////////////////
-    mLogo  = new DistortedObject(bitmapLogo.getWidth(),bitmapLogo.getHeight(),1);
-    mLogo.setTexture(bitmapLogo);
+    mLogoTexture  = new DistortedTexture(bitmapLogo.getWidth(),bitmapLogo.getHeight(),0);
+    mLogoTexture.setTexture(bitmapLogo);
 
     ///// create CRAWL //////////////////
-    mCrawl = new DistortedObject(CRAWL_WIDTH, CRAWL_HEIGHT, 1);
+    mCrawlTexture = new DistortedTexture(CRAWL_WIDTH, CRAWL_HEIGHT, 0);
     bitmapText = Bitmap.createBitmap(CRAWL_WIDTH,CRAWL_HEIGHT,Bitmap.Config.ARGB_8888);
     bitmapText.eraseColor(0x00000000);
     Canvas textCanvas = new Canvas(bitmapText);
@@ -272,23 +286,15 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
       displayJustified(mCRAWLString[i], 0, (i+1)*(FONT_HEIGHT+VERTICAL_SPACING), CRAWL_WIDTH, textCanvas, paint);  
       }
       
-    mCrawl.setTexture(bitmapText);
+    mCrawlTexture.setTexture(bitmapText);
       
     ///// create Stars ///////////////////
-      
-    mStars = new DistortedObject[NUM_STARS];
-      
-    mStars[0] = new DistortedObject(bitmapStar.getWidth(),bitmapStar.getHeight(),1);
-    mStars[0].setTexture(bitmapStar);
+    mStarTexture = new DistortedTexture(bitmapStar.getWidth(),bitmapStar.getHeight(),0);
+    mStarTexture.setTexture(bitmapStar);
 
-    for(int i=1; i<NUM_STARS; i++)
-      {
-      mStars[i] = new DistortedObject(mStars[0], Distorted.CLONE_BITMAP|Distorted.CLONE_VERTEX);
-      }
-      
-    gffaID = mGFFA.getID();
-    logoID = mLogo.getID();
-    crawlID= mCrawl.getID();
+    gffaID = mGFFAQueue.getID();
+    logoID = mLogoQueue.getID();
+    crawlID= mCrawlQueue.getID();
     }
  
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -342,14 +348,14 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
       {
       if( objectID == gffaID )
         {
-        mRoot.detach(mGFFA);   
-        mGFFA.removeEventListener(this);
+        mRoot.detach(mGFFAQueue);
+        mGFFAQueue.removeEventListener(this);
        
-        int screenW=mScreen.getWidth();
-        int screenH=mScreen.getHeight();
+        int screenW=mScreenTexture.getWidth();
+        int screenH=mScreenTexture.getHeight();
         
-        int logoW = mLogo.getWidth();
-        int logoH = mLogo.getHeight();
+        int logoW = mLogoTexture.getWidth();
+        int logoH = mLogoTexture.getHeight();
       
         int initSize= (int)(3.0f*screenW/logoW);
         int finaSize= (int)(0.1f*screenW/logoW);
@@ -358,49 +364,49 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
         di.add(new Static3D(initSize,initSize,1));
         di.add(new Static3D(finaSize,finaSize,1));
 
-        mLogo.move( new Static3D(screenW/2,screenH/2,0) );
-        mLogo.scale(di);
-        mLogo.move( new Static3D(-logoW/2,-logoH/2,0) );
+        mLogoQueue.move( new Static3D(screenW/2,screenH/2,0) );
+        mLogoQueue.scale(di);
+        mLogoQueue.move( new Static3D(-logoW/2,-logoH/2,0) );
       
-        mRoot.attach(mLogo,mQuad);
-        mLogo.addEventListener(this);
+        mRoot.attach(mLogoTexture,mLogoQueue,mQuad);
+        mLogoQueue.addEventListener(this);
         }
       else if( objectID==logoID )
         {
-        mRoot.detach(mLogo);   
-        mLogo.removeEventListener(this);
+        mRoot.detach(mLogoQueue);
+        mLogoQueue.removeEventListener(this);
         
-        int crawlW = mCrawl.getWidth();
-        int crawlH = mCrawl.getHeight();
-        int screenW= mScreen.getWidth();
-        int screenH= mScreen.getHeight();
-        int backH  = mCrawlBackground.getHeight();
+        int crawlW = mCrawlTexture.getWidth();
+        int crawlH = mCrawlTexture.getHeight();
+        int screenW= mScreenTexture.getWidth();
+        int screenH= mScreenTexture.getHeight();
+        int backH  = mCrawlBackgroundTexture.getHeight();
         float scale= (float)screenW/crawlW;
       
         Dynamic3D di = new Dynamic3D(60000,0.5f);
         di.add(new Static3D(screenW/2,+backH       , 0));
         di.add(new Static3D(screenW/2,-scale*crawlH, 0));
         
-        mCrawlBackground.move( new Static3D(0,screenH-backH,0) );
-        mCrawlBackground.rotate( new Static1D(CRAWL_ANGLE), new Static3D(1,0,0), new Static3D(screenW/2,backH,0) );
+        mCrawlBackgroundQueue.move( new Static3D(0,screenH-backH,0) );
+        mCrawlBackgroundQueue.rotate( new Static1D(CRAWL_ANGLE), new Static3D(1,0,0), new Static3D(screenW/2,backH,0) );
         
         final int transpDist = 5;
         Static4D region = new Static4D(screenW/2,(1-transpDist)*backH,transpDist*backH,transpDist*backH);
-        mCrawlBackground.alpha(new Static1D(1-transpDist/2), region, true);
+        mCrawlBackgroundQueue.alpha(new Static1D(1-transpDist/2), region, true);
         
-        mCrawl.move(di);
-        mCrawl.scale( new Static3D(scale,scale,scale) );
-        mCrawl.move( new Static3D(-crawlW/2,0,0) );
+        mCrawlQueue.move(di);
+        mCrawlQueue.scale( new Static3D(scale,scale,scale) );
+        mCrawlQueue.move( new Static3D(-crawlW/2,0,0) );
         
-        mBackground = mRoot.attach(mCrawlBackground,mQuad);
-        mBackground.attach(mCrawl,mQuad);
-        mCrawl.addEventListener(this);
+        mBackground = mRoot.attach(mCrawlBackgroundTexture,mCrawlBackgroundQueue,mQuad);
+        mBackground.attach(mCrawlTexture,mCrawlQueue,mQuad);
+        mCrawlQueue.addEventListener(this);
         }
       else if( objectID==crawlID )
         {
         mRoot.detach(mBackground);
-        mBackground.detach(mCrawl);
-        mCrawl.removeEventListener(this);
+        mBackground.detach(mCrawlQueue);
+        mCrawlQueue.removeEventListener(this);
         }
       }
     }
