commit dae661e93e8cd65517d53490c9ee49c5388b3afb
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun May 12 22:18:49 2019 +0100

    Invert the order of Matrix Effects. Now, just as in the other queues, the first matrix effect is actually the first to act on the object - not the other way around!

diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
index 1047587..f855af7 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
@@ -69,8 +69,8 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
       mView = view;
       mManager = new AroundTheWorldEffectsManager();
       mEffects = new DistortedEffects();
-      mEffects.apply(new MatrixEffectMove(mMove));
       mEffects.apply(new MatrixEffectScale(mScale));
+      mEffects.apply(new MatrixEffectMove(mMove));
 
       mManager.apply(mEffects);
       mScreen = new DistortedScreen();
diff --git a/src/main/java/org/distorted/examples/bean/BeanRenderer.java b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
index 0925af6..6948df7 100644
--- a/src/main/java/org/distorted/examples/bean/BeanRenderer.java
+++ b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
@@ -91,8 +91,8 @@ class BeanRenderer implements GLSurfaceView.Renderer
       mEffects = new DistortedEffects();
       mEffects.apply( new VertexEffectDistort(dynLeft , pointLeft , regionLeft) );
       mEffects.apply( new VertexEffectDistort(dynRight, pointRight, regionRight));
-      mEffects.apply( new MatrixEffectMove (mMove ) );
       mEffects.apply( new MatrixEffectScale(mScale) );
+      mEffects.apply( new MatrixEffectMove (mMove ) );
 
       mScreen = new DistortedScreen();
       }
diff --git a/src/main/java/org/distorted/examples/blur/BlurRenderer.java b/src/main/java/org/distorted/examples/blur/BlurRenderer.java
index 266a0ce..5f00ebb 100644
--- a/src/main/java/org/distorted/examples/blur/BlurRenderer.java
+++ b/src/main/java/org/distorted/examples/blur/BlurRenderer.java
@@ -79,13 +79,13 @@ class BlurRenderer implements GLSurfaceView.Renderer
       mBufferScale= new Static3D(1,1,1);
 
       mBufferEffects = new DistortedEffects();
-      mBufferEffects.apply(new MatrixEffectMove(mBufferMove));
       mBufferEffects.apply(new MatrixEffectScale(mBufferScale));
+      mBufferEffects.apply(new MatrixEffectMove(mBufferMove));
 
       mEffects = new DistortedEffects();
       mEffects.apply( new PostprocessEffectBlur(radiusDyn) );
-      mEffects.apply(new MatrixEffectMove(mMove));
       mEffects.apply(new MatrixEffectScale(mScale));
+      mEffects.apply(new MatrixEffectMove(mMove));
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
index 3faa5da..e959dd3 100644
--- a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
+++ b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
@@ -93,11 +93,13 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
       diRotate.add(new Static1D(360));
 
       mEffects = new DistortedEffects();
+
+      mEffects.apply( new MatrixEffectRotate( diRotate, new Static3D(0,0,1), mRotate) );
+      mEffects.apply( new MatrixEffectScale(diScale));
+      mEffects.apply( new MatrixEffectMove(moveDyn));
+
       mEffects.apply( new FragmentEffectChroma( chromaDyn, new Static3D(1,0,0), chromaCenter, chromaRegion ,true) );
       mEffects.apply( new FragmentEffectAlpha(alphaDyn, alphaCenter, alphaRegion, false) );
-      mEffects.apply( new MatrixEffectMove(moveDyn));
-      mEffects.apply( new MatrixEffectScale(diScale));
-      mEffects.apply( new MatrixEffectRotate( diRotate, new Static3D(0,0,1), mRotate) );
 
       mScreen = new DistortedScreen();
       }
diff --git a/src/main/java/org/distorted/examples/check/CheckRenderer.java b/src/main/java/org/distorted/examples/check/CheckRenderer.java
index 349343f..c9e7199 100644
--- a/src/main/java/org/distorted/examples/check/CheckRenderer.java
+++ b/src/main/java/org/distorted/examples/check/CheckRenderer.java
@@ -93,8 +93,8 @@ class CheckRenderer implements GLSurfaceView.Renderer
       mCenter = new Static3D(0,0,0);
 
       mEffects = new DistortedEffects();
-      mEffects.apply(new MatrixEffectMove(mMove));
       mEffects.apply(new MatrixEffectScale(mScale));
+      mEffects.apply(new MatrixEffectMove(mMove));
 
       // Try adding 2 Vertex Effects to the Bitmap.
       // This will fail if we have set maxVertexEffects to something < 2.
diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
index 5dc45d9..5e7fd0d 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
@@ -93,8 +93,8 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
         {
         mMove[i] = new Static3D(0,0,0);
         moveEffect[i] = new MatrixEffectMove(mMove[i]);
-        mEffects[i].apply(moveEffect[i]);
         mEffects[i].apply(scaleEffect);
+        mEffects[i].apply(moveEffect[i]);
         }
 
       mScreen = new DistortedScreen();
diff --git a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
index 3396581..12b5ac8 100644
--- a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
@@ -113,8 +113,8 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
         {
         mMove[i] = new Static3D(0,0,0);
         moveEffect[i] = new MatrixEffectMove(mMove[i]);
-        mEffects[i].apply(moveEffect[i]);
         mEffects[i].apply(scaleEffect);
+        mEffects[i].apply(moveEffect[i]);
         }
 
       mScreen = new DistortedScreen();
diff --git a/src/main/java/org/distorted/examples/earth/EarthRenderer.java b/src/main/java/org/distorted/examples/earth/EarthRenderer.java
index 2a1c5fa..a378c6d 100644
--- a/src/main/java/org/distorted/examples/earth/EarthRenderer.java
+++ b/src/main/java/org/distorted/examples/earth/EarthRenderer.java
@@ -132,10 +132,10 @@ class EarthRenderer implements GLSurfaceView.Renderer
       quatInt2.add(mQuat2);
 
       mEffects = new DistortedEffects();
-      mEffects.apply( new MatrixEffectMove(mMove) );
-      mEffects.apply( new MatrixEffectScale(scale));
-      mEffects.apply( new MatrixEffectQuaternion(quatInt1, mCenter) );
       mEffects.apply( new MatrixEffectQuaternion(quatInt2, mCenter) );
+      mEffects.apply( new MatrixEffectQuaternion(quatInt1, mCenter) );
+      mEffects.apply( new MatrixEffectScale(scale));
+      mEffects.apply( new MatrixEffectMove(mMove) );
 
       mScreen = new DistortedScreen();
       mScreen.setProjection(FOV, NEAR);
diff --git a/src/main/java/org/distorted/examples/flag/FlagRenderer.java b/src/main/java/org/distorted/examples/flag/FlagRenderer.java
index 70225c7..f0ee680 100644
--- a/src/main/java/org/distorted/examples/flag/FlagRenderer.java
+++ b/src/main/java/org/distorted/examples/flag/FlagRenderer.java
@@ -92,10 +92,10 @@ class FlagRenderer implements GLSurfaceView.Renderer
       mScale = new Static3D(1,1,1);
       mCenter= new Static3D(0,0,0);
 
-      effects.apply( new MatrixEffectMove(mMove));
-      effects.apply( new MatrixEffectScale(mScale));
-      effects.apply( new MatrixEffectQuaternion(mQuat1, mCenter) );
       effects.apply( new MatrixEffectQuaternion(mQuat2, mCenter) );
+      effects.apply( new MatrixEffectQuaternion(mQuat1, mCenter) );
+      effects.apply( new MatrixEffectScale(mScale));
+      effects.apply( new MatrixEffectMove(mMove));
 
       final int GRIDX = 50;
       final int GRIDY = 30;
diff --git a/src/main/java/org/distorted/examples/generic/GenericRenderer.java b/src/main/java/org/distorted/examples/generic/GenericRenderer.java
index 32ac1f1..ed8b618 100644
--- a/src/main/java/org/distorted/examples/generic/GenericRenderer.java
+++ b/src/main/java/org/distorted/examples/generic/GenericRenderer.java
@@ -129,25 +129,25 @@ class GenericRenderer implements GLSurfaceView.Renderer
       MatrixEffectQuaternion quat2cen = new MatrixEffectQuaternion(mQuat2, mRotateCen);
       MatrixEffectMove centerMove = new MatrixEffectMove(mCenterPoint);
 
-      centerEffects.apply(quat1cen);
-      centerEffects.apply(quat2cen);
-      centerEffects.apply( new MatrixEffectMove(mMoveCenter) );
-      centerEffects.apply( centerMove );
       centerEffects.apply( new MatrixEffectScale(mScaleCenter) );
+      centerEffects.apply( centerMove );
+      centerEffects.apply( new MatrixEffectMove(mMoveCenter) );
+      centerEffects.apply(quat2cen);
+      centerEffects.apply(quat1cen);
 
-      regionEffects.apply(quat1cen);
-      regionEffects.apply(quat2cen);
-      regionEffects.apply( new MatrixEffectMove(mMoveRegion) );
-      regionEffects.apply( centerMove );
-      regionEffects.apply( new MatrixEffectMove(mRegionPoint) );
-      regionEffects.apply( new MatrixEffectScale(mRegionScalePoint) );
       regionEffects.apply( new MatrixEffectMove(new Static3D( -regionSize*0.5f , -regionSize*0.5f , 0)) );
+      regionEffects.apply( new MatrixEffectScale(mRegionScalePoint) );
+      regionEffects.apply( new MatrixEffectMove(mRegionPoint) );
+      regionEffects.apply( centerMove );
+      regionEffects.apply( new MatrixEffectMove(mMoveRegion) );
+      regionEffects.apply(quat2cen);
+      regionEffects.apply(quat1cen);
 
       resetMatrixEffects();
 
       // quite tricky: move the background exactly to the FAR plane! (see InternalOutputSurface.setProjection() )
-      backgroundEffects.apply(new MatrixEffectMove(mMoveBackground) );
       backgroundEffects.apply(new MatrixEffectScale(mScaleBackground) );
+      backgroundEffects.apply(new MatrixEffectMove(mMoveBackground) );
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -161,10 +161,10 @@ class GenericRenderer implements GLSurfaceView.Renderer
       MatrixEffectQuaternion quat1obj = new MatrixEffectQuaternion(mQuat1,  rotateObj);
       MatrixEffectQuaternion quat2obj = new MatrixEffectQuaternion(mQuat2,  rotateObj);
 
-      objectEffects.apply( new MatrixEffectMove(mMoveObject));
-      objectEffects.apply( new MatrixEffectScale(mScaleObject) );
-      objectEffects.apply(quat1obj);
       objectEffects.apply(quat2obj);
+      objectEffects.apply(quat1obj);
+      objectEffects.apply( new MatrixEffectScale(mScaleObject) );
+      objectEffects.apply( new MatrixEffectMove(mMoveObject));
 
       mQuat1.set(0,0,0,1);
       mQuat2.set(0,0,0,1);
diff --git a/src/main/java/org/distorted/examples/girl/GirlRenderer.java b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
index 8932066..5ab1003 100644
--- a/src/main/java/org/distorted/examples/girl/GirlRenderer.java
+++ b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
@@ -125,8 +125,8 @@ class GirlRenderer implements GLSurfaceView.Renderer
 
       mMove = new Static3D(0,0,0);
       mScale= new Static3D(1,1,1);
-      mEffects.apply(new MatrixEffectMove(mMove));
       mEffects.apply(new MatrixEffectScale(mScale));
+      mEffects.apply(new MatrixEffectMove(mMove));
 
       mScreen = new DistortedScreen();
       }
diff --git a/src/main/java/org/distorted/examples/glow/GlowRenderer.java b/src/main/java/org/distorted/examples/glow/GlowRenderer.java
index 923de70..41828ae 100644
--- a/src/main/java/org/distorted/examples/glow/GlowRenderer.java
+++ b/src/main/java/org/distorted/examples/glow/GlowRenderer.java
@@ -75,8 +75,8 @@ class GlowRenderer implements GLSurfaceView.Renderer
       mGlow  = new PostprocessEffectGlow(mRadius,mColor);
 
       DistortedEffects effects = new DistortedEffects();
-      effects.apply(new MatrixEffectMove(mMove));
       effects.apply(new MatrixEffectScale(mScale));
+      effects.apply(new MatrixEffectMove(mMove));
       effects.apply(mGlow);
 
       mScreen = new DistortedScreen();
diff --git a/src/main/java/org/distorted/examples/inflate/InflateRenderer.java b/src/main/java/org/distorted/examples/inflate/InflateRenderer.java
index 26e719f..0173692 100644
--- a/src/main/java/org/distorted/examples/inflate/InflateRenderer.java
+++ b/src/main/java/org/distorted/examples/inflate/InflateRenderer.java
@@ -88,10 +88,10 @@ class InflateRenderer implements GLSurfaceView.Renderer
       quatInt2.add(mQuat2);
 
       mEffects = new DistortedEffects();
-      mEffects.apply( new MatrixEffectMove(mMove) );
-      mEffects.apply( new MatrixEffectScale(mScale));
-      mEffects.apply( new MatrixEffectQuaternion(quatInt1, mCenter) );
       mEffects.apply( new MatrixEffectQuaternion(quatInt2, mCenter) );
+      mEffects.apply( new MatrixEffectQuaternion(quatInt1, mCenter) );
+      mEffects.apply( new MatrixEffectScale(mScale));
+      mEffects.apply( new MatrixEffectMove(mMove) );
       mEffects.apply( new FragmentEffectAlpha(mAlpha));
 
       mScreen = new DistortedScreen();
diff --git a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
index 8d12ad9..afbaee1 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
@@ -72,8 +72,8 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
 
       mMove = new Static3D(0,0,0);
       mScale= new Static3D(1,1,1);
-      mEffects.apply(new MatrixEffectMove(mMove));
       mEffects.apply(new MatrixEffectScale(mScale));
+      mEffects.apply(new MatrixEffectMove(mMove));
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java b/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
index 2a48bd1..1d1efdb 100644
--- a/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
+++ b/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
@@ -91,8 +91,8 @@ class MirrorRenderer implements GLSurfaceView.Renderer
       mEffectsMirror.apply( new MatrixEffectScale(mScaleMirror));
       mEffectsOffscreen1.apply( new MatrixEffectScale( new Static3D(MIRROR_SCALE,MIRROR_SCALE,MIRROR_SCALE)));
       mEffectsOffscreen2.apply( new MatrixEffectMove(mMoveOffscreen2) );
-      mEffectsHead.apply( new MatrixEffectMove(mHeadPosition) );
       mEffectsHead.apply( new MatrixEffectScale(mScaleHead) );
+      mEffectsHead.apply( new MatrixEffectMove(mHeadPosition) );
       mEffectsOffscreen1.apply(new FragmentEffectBrightness(new Static1D(MIRROR_BRIGHTNESS)));
       }
 
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
index 5c00d4d..b1fb0d2 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
@@ -90,8 +90,8 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
 
       mMove = new Static3D(0,0,0);
       mScale= new Static3D(1,1,1);
-      mEffects.apply(new MatrixEffectMove(mMove));
       mEffects.apply(new MatrixEffectScale(mScale));
+      mEffects.apply(new MatrixEffectMove(mMove));
 
       mScreen = new DistortedScreen();
       }
diff --git a/src/main/java/org/distorted/examples/movingglow/MovingGlowRenderer.java b/src/main/java/org/distorted/examples/movingglow/MovingGlowRenderer.java
index fe5d305..51c7d4d 100644
--- a/src/main/java/org/distorted/examples/movingglow/MovingGlowRenderer.java
+++ b/src/main/java/org/distorted/examples/movingglow/MovingGlowRenderer.java
@@ -92,8 +92,8 @@ class MovingGlowRenderer implements GLSurfaceView.Renderer,EffectListener
       for(int j=0; j<NUM_LEAVES; j++)
         {
         mLeafEffects[j] = new DistortedEffects();
-        mLeafEffects[j].apply( new MatrixEffectRotate(new Static1D(j*(360/NUM_LEAVES)), axis, center) );
         mLeafEffects[j].apply(leafMove);
+        mLeafEffects[j].apply( new MatrixEffectRotate(new Static1D(j*(360/NUM_LEAVES)), axis, center) );
         mLeafEffects[j].apply( new FragmentEffectChroma(chromaLevel, new Static3D(colors[3*j],colors[3*j+1], colors[3*j+2])) );
         DistortedNode node = new DistortedNode( mLeaf, mLeafEffects[j], mesh);
         root.attach(node);
@@ -108,9 +108,9 @@ class MovingGlowRenderer implements GLSurfaceView.Renderer,EffectListener
       rot.add(new Static1D(360));
 
       DistortedEffects effects = root.getEffects();
-      effects.apply(new MatrixEffectMove(mMove));
-      effects.apply(new MatrixEffectScale(mScale));
       effects.apply( new MatrixEffectRotate(rot, axis, center) );
+      effects.apply(new MatrixEffectScale(mScale));
+      effects.apply(new MatrixEffectMove(mMove));
 
       Dynamic1D radiusDyn = new Dynamic1D(FLASH_TIME,1.0f);
       radiusDyn.add(new Static1D( 0));
diff --git a/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java b/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
index 74a139d..affcb39 100644
--- a/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
+++ b/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
@@ -132,11 +132,11 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
 
       for(int i=0; i<NUM_OBJECTS; i++)
         {
-        effects[i].apply(moveEffect);
-        effects[i].apply(scaleEffect);
-        effects[i].apply(quatEffect1);
-        effects[i].apply(quatEffect2);
         effects[i].apply(new MatrixEffectMove(mMoveVector[i]));
+        effects[i].apply(quatEffect2);
+        effects[i].apply(quatEffect1);
+        effects[i].apply(scaleEffect);
+        effects[i].apply(moveEffect);
         }
       }
 
diff --git a/src/main/java/org/distorted/examples/objecttree/ObjectTreeRenderer.java b/src/main/java/org/distorted/examples/objecttree/ObjectTreeRenderer.java
index 8920a27..e86edb3 100644
--- a/src/main/java/org/distorted/examples/objecttree/ObjectTreeRenderer.java
+++ b/src/main/java/org/distorted/examples/objecttree/ObjectTreeRenderer.java
@@ -79,8 +79,8 @@ class ObjectTreeRenderer implements GLSurfaceView.Renderer
       chromaDyn.add(new Static1D(0.8f));
 
       mEffects= new DistortedEffects();
-      mEffects.apply(new MatrixEffectMove(mMove));
       mEffects.apply(new MatrixEffectScale(mScale));
+      mEffects.apply(new MatrixEffectMove(mMove));
       mEffects.apply(new FragmentEffectChroma(chromaDyn, new Static3D(0,0,1)));
 
       mScreen = new DistortedScreen();
@@ -202,8 +202,8 @@ class ObjectTreeRenderer implements GLSurfaceView.Renderer
       float factor = lisaWidth/(2.0f*gridWidth);
       MatrixEffectMove move = new MatrixEffectMove( new Static3D((lisaWidth-factor*gridWidth)/2,(lisaHeight-factor*gridHeight)/2, gridWidth/(2.0f*GRID)));
       MatrixEffectScale scale = new MatrixEffectScale( new Static3D(factor,factor,factor) );
-      gridEffects.apply(move);
       gridEffects.apply(scale);
+      gridEffects.apply(move);
 
       Dynamic1D rotDyn = new Dynamic1D(12000,0.0f);
       rotDyn.add(new Static1D(  0));
diff --git a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
index 68deeb5..9d27793 100644
--- a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
+++ b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
@@ -100,8 +100,8 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
       mScale= new Static3D(1,1,1);
 
       DistortedEffects effects = new DistortedEffects();
-      effects.apply(new MatrixEffectMove(mMove));
       effects.apply(new MatrixEffectScale(mScale));
+      effects.apply(new MatrixEffectMove(mMove));
 
       mScreenW = 9*LEAF_SIZE;
       mScreenH = 9*LEAF_SIZE;
@@ -122,15 +122,15 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
       for(int j=0; j<NUM_LEAVES; j++)
         {
         mEffects[j] = new DistortedEffects();
-        mEffects[j].apply( new MatrixEffectRotate(new Static1D(j*(360/NUM_LEAVES)), axis, center) );
         mEffects[j].apply(new MatrixEffectMove(moveVector));
+        mEffects[j].apply( new MatrixEffectRotate(new Static1D(j*(360/NUM_LEAVES)), axis, center) );
         }
 
       for(int i=0; i<NUM_CIRCLES; i++)
         {
         effects = new DistortedEffects();
-        effects.apply( new MatrixEffectMove(new Static3D(positions[2*i], positions[2*i+1], 0)) );
         effects.apply( new MatrixEffectRotate(rot, axis, center) );
+        effects.apply( new MatrixEffectMove(new Static3D(positions[2*i], positions[2*i+1], 0)) );
         effects.apply( new FragmentEffectChroma(new Static1D(0.5f), new Static3D(colors[3*i],colors[3*i+1], colors[3*i+2])) );
 
         mCircleNode[i] = new DistortedNode( surface, effects, mMesh);
diff --git a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
index 97a8edc..17f153f 100644
--- a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
+++ b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
@@ -101,8 +101,8 @@ class RenderThread extends Thread
 
     mMove = new Static3D(0,0,0);
     mScale= new Static3D(1,1,1);
-    mEffects.apply(new MatrixEffectMove(mMove));
     mEffects.apply(new MatrixEffectScale(mScale));
+    mEffects.apply(new MatrixEffectMove(mMove));
 
     mScreen = new DistortedScreen();
     }
diff --git a/src/main/java/org/distorted/examples/postprocesstree/PostprocessTreeRenderer.java b/src/main/java/org/distorted/examples/postprocesstree/PostprocessTreeRenderer.java
index 1a527e3..4ea30c2 100644
--- a/src/main/java/org/distorted/examples/postprocesstree/PostprocessTreeRenderer.java
+++ b/src/main/java/org/distorted/examples/postprocesstree/PostprocessTreeRenderer.java
@@ -89,8 +89,8 @@ class PostprocessTreeRenderer implements GLSurfaceView.Renderer
 
       DistortedNode root = new DistortedNode(new DistortedTexture(mScreenW,mScreenH), rootEffects, mesh);
 
-      rootEffects.apply(new MatrixEffectMove(mMove));
       rootEffects.apply(new MatrixEffectScale(mScale));
+      rootEffects.apply(new MatrixEffectMove(mMove));
       rootEffects.apply(blurEffect);
 
       Dynamic1D rotate = new Dynamic1D(5000,0.0f);
@@ -108,14 +108,14 @@ class PostprocessTreeRenderer implements GLSurfaceView.Renderer
       for(int j=0; j<NUM_LEAVES; j++)
         {
         outerLeafEffects[j] = new DistortedEffects();
-        outerLeafEffects[j].apply( new MatrixEffectRotate(new Static1D(j*(360/NUM_LEAVES)), axis, outerCenter) );
         outerLeafEffects[j].apply(new MatrixEffectMove(outerMoveVector));
+        outerLeafEffects[j].apply( new MatrixEffectRotate(new Static1D(j*(360/NUM_LEAVES)), axis, outerCenter) );
 
         root.attach(mLeaf, outerLeafEffects[j], mesh);
         }
 
-      innerEffects.apply( new MatrixEffectMove(new Static3D( (OUTER-INNER)*LEAF_SIZE/2,(OUTER-INNER)*LEAF_SIZE/2, 0)) );
       innerEffects.apply( new MatrixEffectRotate(rotate, axis, innerCenter) );
+      innerEffects.apply( new MatrixEffectMove(new Static3D( (OUTER-INNER)*LEAF_SIZE/2,(OUTER-INNER)*LEAF_SIZE/2, 0)) );
       innerEffects.apply( new FragmentEffectChroma(new Static1D(0.5f), new Static3D(1,0,0) ) );
       innerEffects.apply(blurEffect);
 
@@ -125,8 +125,8 @@ class PostprocessTreeRenderer implements GLSurfaceView.Renderer
       for(int j=0; j<NUM_LEAVES; j++)
         {
         innerLeafEffects[j] = new DistortedEffects();
-        innerLeafEffects[j].apply( new MatrixEffectRotate(new Static1D(j*(360/NUM_LEAVES)), axis, innerCenter) );
         innerLeafEffects[j].apply(new MatrixEffectMove(innerMoveVector));
+        innerLeafEffects[j].apply( new MatrixEffectRotate(new Static1D(j*(360/NUM_LEAVES)), axis, innerCenter) );
 
         innerNode.attach( mLeaf, innerLeafEffects[j], mesh );
         }
diff --git a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
index 190ab60..32c3abd 100644
--- a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
+++ b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
@@ -92,9 +92,9 @@ class QuaternionRenderer implements GLSurfaceView.Renderer
     mScale  = new Static3D(1,1,1);
     mCenter = new Static3D(0,0,0);
 
-    effects.apply( new MatrixEffectMove(mMove));
-    effects.apply(new MatrixEffectScale(mScale));
     effects.apply( new MatrixEffectQuaternion(rot,mCenter) );
+    effects.apply( new MatrixEffectScale(mScale));
+    effects.apply( new MatrixEffectMove(mMove));
 
     mScreen = new DistortedScreen();
     mScreen.attach(mTexture,effects,mMesh);
diff --git a/src/main/java/org/distorted/examples/rubik/RubikCube.java b/src/main/java/org/distorted/examples/rubik/RubikCube.java
index a9a6360..efa5ec2 100644
--- a/src/main/java/org/distorted/examples/rubik/RubikCube.java
+++ b/src/main/java/org/distorted/examples/rubik/RubikCube.java
@@ -139,12 +139,12 @@ class RubikCube
               mRotate[x][y][z] = new MatrixEffectRotate( mRotationAngle[x][y][z], mRotationAxis[x][y][z], center);
 
               mEffects[x][y][z] = new DistortedEffects();
-              mEffects[x][y][z].apply(sinkEffect);
-              mEffects[x][y][z].apply(moveEffect);
-              mEffects[x][y][z].apply(scaleEffect);
-              mEffects[x][y][z].apply(quatEffect);
-              mEffects[x][y][z].apply( mRotate[x][y][z] );
               mEffects[x][y][z].apply( new MatrixEffectMove(cubeVectors[x][y][z]) );
+              mEffects[x][y][z].apply( mRotate[x][y][z] );
+              mEffects[x][y][z].apply(quatEffect);
+              mEffects[x][y][z].apply(scaleEffect);
+              mEffects[x][y][z].apply(moveEffect);
+              mEffects[x][y][z].apply(sinkEffect);
               }
             }
       }
diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
index be5d12b..10b8048 100644
--- a/src/main/java/org/distorted/examples/save/SaveRenderer.java
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -96,9 +96,9 @@ class SaveRenderer implements GLSurfaceView.Renderer
     mEffects = new DistortedEffects();
     mEffects.apply( new VertexEffectSink(diSink, pLeft , sinkRegion) );
     mEffects.apply( new VertexEffectSink(diSink, pRight, sinkRegion) );
-    mEffects.apply( new MatrixEffectMove(mMove));
     mEffects.apply( new MatrixEffectScale(mScaleMain));
     mEffects.apply( new MatrixEffectScale(mScaleFactor));
+    mEffects.apply( new MatrixEffectMove(mMove));
 
     mScreen = new DistortedScreen();
     }
diff --git a/src/main/java/org/distorted/examples/sink/SinkRenderer.java b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
index 7f2838c..4e8f792 100644
--- a/src/main/java/org/distorted/examples/sink/SinkRenderer.java
+++ b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
@@ -71,8 +71,8 @@ class SinkRenderer implements GLSurfaceView.Renderer
 
     mScale = new Static3D(1,1,1);
     mMove  = new Static3D(0,0,0);
-    mEffects.apply(new MatrixEffectMove(mMove));
     mEffects.apply(new MatrixEffectScale(mScale));
+    mEffects.apply(new MatrixEffectMove(mMove));
 
     mScreen = new DistortedScreen();
     }
diff --git a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
index 8b0b393..90d36f9 100644
--- a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
+++ b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
@@ -223,11 +223,11 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
       randomAlpha1 = 0.2f + 0.8f*mRnd.nextFloat();
       randomAlpha2 = 0.8f + 0.2f*mRnd.nextFloat();
       randomTime = 500+mRnd.nextInt(2000);
-      
-      mStarEffects[i].apply( new MatrixEffectMove(new Static3D(randomX,randomY,0)) );
-      mStarEffects[i].apply( new MatrixEffectScale(randomS) );
+
       mStarEffects[i].apply( new MatrixEffectRotate(new Static1D(randomA), axis, center) );
-      
+      mStarEffects[i].apply( new MatrixEffectScale(randomS) );
+      mStarEffects[i].apply( new MatrixEffectMove(new Static3D(randomX,randomY,0)) );
+
       Dynamic1D di = new Dynamic1D(randomTime,0.0f);
       di.setNoise(alphaNoise);
       di.add(new Static1D(randomAlpha1));
@@ -249,8 +249,8 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
     alpha.notifyWhenFinished(this);
     alphaEffectID = alpha.getID();
 
-    mGFFAEffects.apply( new MatrixEffectMove(new Static3D(w/5,2*h/3,0)) );
     mGFFAEffects.apply( new MatrixEffectScale(scale) );
+    mGFFAEffects.apply( new MatrixEffectMove(new Static3D(w/5,2*h/3,0)) );
     mGFFAEffects.apply( alpha );
       
     mScreen.attach(mGFFATexture, mGFFAEffects, mQuad);
@@ -392,10 +392,10 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
       scale.notifyWhenFinished(this);
       scaleEffectID = scale.getID();
 
-      mLogoEffects.apply( new MatrixEffectMove(new Static3D(screenW/2,screenH/2,0)) );
-      mLogoEffects.apply( scale );
       mLogoEffects.apply( new MatrixEffectMove(new Static3D(-logoW/2,-logoH/2,0)) );
-      
+      mLogoEffects.apply( scale );
+      mLogoEffects.apply( new MatrixEffectMove(new Static3D(screenW/2,screenH/2,0)) );
+
       mScreen.attach(mLogoTexture, mLogoEffects,mQuad);
       }
     else if( effectID == scaleEffectID )
@@ -423,10 +423,10 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
       move.notifyWhenFinished(this);
       moveEffectID = move.getID();
 
-      mCrawlEffects.apply( move );
-      mCrawlEffects.apply( new MatrixEffectScale(new Static3D(scale,scale,scale)) );
       mCrawlEffects.apply( new MatrixEffectMove(new Static3D(-crawlW/2,-crawlH/2,0)) );
-        
+      mCrawlEffects.apply( new MatrixEffectScale(new Static3D(scale,scale,scale)) );
+      mCrawlEffects.apply( move );
+
       mBackground = mScreen.attach(mCrawlBackgroundTexture, mCrawlBackgroundEffects,mQuad);
       mBackground.attach(mCrawlTexture, mCrawlEffects,mQuad);
       mBackground.glDisable(GLES31.GL_DEPTH_TEST);
diff --git a/src/main/java/org/distorted/examples/stencil/StencilRenderer.java b/src/main/java/org/distorted/examples/stencil/StencilRenderer.java
index 9334536..552ba2f 100644
--- a/src/main/java/org/distorted/examples/stencil/StencilRenderer.java
+++ b/src/main/java/org/distorted/examples/stencil/StencilRenderer.java
@@ -162,25 +162,25 @@ class StencilRenderer implements GLSurfaceView.Renderer
       // middle of the screen.
       /////////////////////////////////////////////////////////////////////////////////////////////////////
       // The cube
-      cube1Effects.apply( move2 );
-      cube1Effects.apply( rotaX );
-      cube1Effects.apply( rotaZ );
-      cube1Effects.apply( scale );
       cube1Effects.apply( move1 );
+      cube1Effects.apply( scale );
+      cube1Effects.apply( rotaZ );
+      cube1Effects.apply( rotaX );
+      cube1Effects.apply( move2 );
       /////////////////////////////////////////////////////////////////////////////////////////////////////
       // Floor
-      floorEffects.apply( move2 );
-      floorEffects.apply( rotaX );
-      floorEffects.apply( rotaZ );
       floorEffects.apply( scale );
+      floorEffects.apply( rotaZ );
+      floorEffects.apply( rotaX );
+      floorEffects.apply( move2 );
       /////////////////////////////////////////////////////////////////////////////////////////////////////
       // Reflection
-      cube2Effects.apply( move2 );
-      cube2Effects.apply( rotaX );
-      cube2Effects.apply( rotaZ );
-      cube2Effects.apply( scale );
-      cube2Effects.apply( move1 );
       cube2Effects.apply( new MatrixEffectScale(new Static3D(1,1,-1)) );
+      cube2Effects.apply( move1 );
+      cube2Effects.apply( scale );
+      cube2Effects.apply( rotaZ );
+      cube2Effects.apply( rotaX );
+      cube2Effects.apply( move2 );
       cube2Effects.apply( new FragmentEffectBrightness(new Static1D(0.5f)) );
 
       /////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java b/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java
index 1d5175c..ac4e8db 100644
--- a/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java
+++ b/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java
@@ -114,11 +114,11 @@ class TransparencyRenderer implements GLSurfaceView.Renderer
 
         mEffects[i].apply(mBlur[i]);
         mEffects[i].apply(alpha[i]);
-        mEffects[i].apply(moveEffect);
-        mEffects[i].apply(scaleEffect);
-        mEffects[i].apply(quatEffect1);
-        mEffects[i].apply(quatEffect2);
         mEffects[i].apply(new MatrixEffectMove(mMoveVector[i]));
+        mEffects[i].apply(quatEffect2);
+        mEffects[i].apply(quatEffect1);
+        mEffects[i].apply(scaleEffect);
+        mEffects[i].apply(moveEffect);
 
         mNode[i] = new DistortedNode(mTex[i], mEffects[i], mesh );
         mScreen.attach(mNode[i]);
diff --git a/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java b/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
index 454938c..557eb4f 100644
--- a/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
+++ b/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
@@ -130,11 +130,12 @@ class TriblurRenderer implements GLSurfaceView.Renderer
 
         effects[i].apply(mBlur[i]);
         effects[i].apply(chroma[i]);
-        effects[i].apply( (i==0||i==NUM_OBJECTS-1) ?  moveEffect1 :  moveEffect2 );
-        effects[i].apply( (i==0||i==NUM_OBJECTS-1) ? scaleEffect1 : scaleEffect2 );
-        effects[i].apply(quatEffect1);
-        effects[i].apply(quatEffect2);
+
         effects[i].apply(new MatrixEffectMove(moveVector[i]));
+        effects[i].apply(quatEffect2);
+        effects[i].apply(quatEffect1);
+        effects[i].apply( (i==0||i==NUM_OBJECTS-1) ? scaleEffect1 : scaleEffect2 );
+        effects[i].apply( (i==0||i==NUM_OBJECTS-1) ?  moveEffect1 :  moveEffect2 );
 
         mEffectStatus[i] = 1;
         mNode[i] = new DistortedNode(mTex, effects[i], mesh );
diff --git a/src/main/java/org/distorted/examples/wind/WindEffectsManager.java b/src/main/java/org/distorted/examples/wind/WindEffectsManager.java
index 6e3066a..80ddee4 100644
--- a/src/main/java/org/distorted/examples/wind/WindEffectsManager.java
+++ b/src/main/java/org/distorted/examples/wind/WindEffectsManager.java
@@ -112,8 +112,8 @@ class WindEffectsManager
 
     setWind(0);
 
-    effects.apply( new MatrixEffectShear(shearFactor,midLeft) );
     effects.apply( new MatrixEffectScale(scaleFactor) );
+    effects.apply( new MatrixEffectShear(shearFactor,midLeft) );
     effects.apply( new VertexEffectDeform(deformForce,midRight) );
     effects.apply( new VertexEffectWave(windDynamic1, midRight, windRegion) );
     effects.apply( new VertexEffectWave(windDynamic2, midRight, windRegion) );
diff --git a/src/main/java/org/distorted/examples/wind/WindRenderer.java b/src/main/java/org/distorted/examples/wind/WindRenderer.java
index b39a02a..31c367c 100644
--- a/src/main/java/org/distorted/examples/wind/WindRenderer.java
+++ b/src/main/java/org/distorted/examples/wind/WindRenderer.java
@@ -73,17 +73,18 @@ class WindRenderer implements GLSurfaceView.Renderer
       mObjWidth = mTexture.getWidth();
       mObjHeight= mTexture.getHeight();
 
+      mManager.apply(effects);
+
       mMove = new Static3D(0,0,0);
       mScale= new Static3D(1,1,1);
-      effects.apply( new MatrixEffectMove(mMove));
-      effects.apply( new MatrixEffectScale(mScale));
 
       Static1D angle = new Static1D(-45);
       Static3D axis  = new Static3D(0,0,1);
       Static3D center= new Static3D(0,mObjHeight/2,0);
 
       effects.apply( new MatrixEffectRotate(angle, axis, center) );
-      mManager.apply(effects);
+      effects.apply( new MatrixEffectScale(mScale));
+      effects.apply( new MatrixEffectMove(mMove));
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
