commit 227b03bda5054dc3d9a6adb19d26186eb1d684e8
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Mon Jun 19 16:49:29 2017 +0100

    Move all knowledge about a MatrixEffect from the EffectQueueMatrix to the classes.

diff --git a/src/main/java/org/distorted/library/effect/MatrixEffect.java b/src/main/java/org/distorted/library/effect/MatrixEffect.java
index 36bd7df..0189e99 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffect.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffect.java
@@ -26,6 +26,10 @@ public abstract class MatrixEffect extends Effect
   {
   public static final int NUM_UNIFORMS = 7; // 4 per-effect interpolated values + 3 dimensional center.
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public abstract void apply(float[] matrix, float[] uniforms, int index);
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   MatrixEffect(EffectName name)
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectMove.java b/src/main/java/org/distorted/library/effect/MatrixEffectMove.java
index 2195920..c901f8e 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectMove.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectMove.java
@@ -19,6 +19,8 @@
 
 package org.distorted.library.effect;
 
+import android.opengl.Matrix;
+
 import org.distorted.library.type.Data3D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -45,4 +47,15 @@ public class MatrixEffectMove extends MatrixEffect
     {
     return mVector.get(uniforms,index,currentDuration,step);
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void apply(float[] matrix, float[] uniforms, int index)
+    {
+    float sx = uniforms[NUM_UNIFORMS*index  ];
+    float sy = uniforms[NUM_UNIFORMS*index+1];
+    float sz = uniforms[NUM_UNIFORMS*index+2];
+
+    Matrix.translateM(matrix, 0, sx,-sy, sz);
+    }
   }
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectQuaternion.java b/src/main/java/org/distorted/library/effect/MatrixEffectQuaternion.java
index 6f32d87..7e7b315 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectQuaternion.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectQuaternion.java
@@ -19,6 +19,8 @@
 
 package org.distorted.library.effect;
 
+import android.opengl.Matrix;
+
 import org.distorted.library.type.Data3D;
 import org.distorted.library.type.Data4D;
 
@@ -29,6 +31,9 @@ public class MatrixEffectQuaternion extends MatrixEffect
   private Data4D mQuaternion;
   private Data3D mCenter;
 
+  private static float[] mTmpMatrix1 = new float[16];
+  private static float[] mTmpMatrix2 = new float[16];
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Rotates the Object by quaternion.
@@ -50,4 +55,68 @@ public class MatrixEffectQuaternion extends MatrixEffect
     mCenter.get(uniforms,index+4,currentDuration,step);
     return mQuaternion.get(uniforms,index,currentDuration,step);
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void apply(float[] matrix, float[] uniforms, int index)
+    {
+    float qX = uniforms[NUM_UNIFORMS*index  ];
+    float qY = uniforms[NUM_UNIFORMS*index+1];
+    float qZ = uniforms[NUM_UNIFORMS*index+2];
+    float qW = uniforms[NUM_UNIFORMS*index+3];
+
+    float x = uniforms[NUM_UNIFORMS*index+4];
+    float y = uniforms[NUM_UNIFORMS*index+5];
+    float z = uniforms[NUM_UNIFORMS*index+6];
+
+    Matrix.translateM(matrix, 0, x,-y, z);
+    multiplyByQuat( matrix, qX, qY, qZ, qW);
+    Matrix.translateM(matrix, 0,-x, y,-z);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private static void multiplyByQuat(float[] matrix, float X, float Y, float Z, float W)
+    {
+    float xx= X * X;
+    float xy= X * Y;
+    float xz= X * Z;
+    float xw= X * W;
+    float yy= Y * Y;
+    float yz= Y * Z;
+    float yw= Y * W;
+    float zz= Z * Z;
+    float zw= Z * W;
+
+    mTmpMatrix1[0]  = 1 - 2 * ( yy + zz );
+    mTmpMatrix1[1]  =     2 * ( xy - zw );
+    mTmpMatrix1[2]  =     2 * ( xz + yw );
+    mTmpMatrix1[4]  =     2 * ( xy + zw );
+    mTmpMatrix1[5]  = 1 - 2 * ( xx + zz );
+    mTmpMatrix1[6]  =     2 * ( yz - xw );
+    mTmpMatrix1[8]  =     2 * ( xz - yw );
+    mTmpMatrix1[9]  =     2 * ( yz + xw );
+    mTmpMatrix1[10] = 1 - 2 * ( xx + yy );
+    mTmpMatrix1[3]  = mTmpMatrix1[7] = mTmpMatrix1[11] = mTmpMatrix1[12] = mTmpMatrix1[13] = mTmpMatrix1[14] = 0;
+    mTmpMatrix1[15] = 1;
+
+    Matrix.multiplyMM(mTmpMatrix2, 0, matrix, 0, mTmpMatrix1, 0);
+
+    matrix[ 0] = mTmpMatrix2[ 0];
+    matrix[ 1] = mTmpMatrix2[ 1];
+    matrix[ 2] = mTmpMatrix2[ 2];
+    matrix[ 3] = mTmpMatrix2[ 3];
+    matrix[ 4] = mTmpMatrix2[ 4];
+    matrix[ 5] = mTmpMatrix2[ 5];
+    matrix[ 6] = mTmpMatrix2[ 6];
+    matrix[ 7] = mTmpMatrix2[ 7];
+    matrix[ 8] = mTmpMatrix2[ 8];
+    matrix[ 9] = mTmpMatrix2[ 9];
+    matrix[10] = mTmpMatrix2[10];
+    matrix[11] = mTmpMatrix2[11];
+    matrix[12] = mTmpMatrix2[12];
+    matrix[13] = mTmpMatrix2[13];
+    matrix[14] = mTmpMatrix2[14];
+    matrix[15] = mTmpMatrix2[15];
+    }
   }
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java b/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java
index a251e5a..febdb97 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java
@@ -19,6 +19,8 @@
 
 package org.distorted.library.effect;
 
+import android.opengl.Matrix;
+
 import org.distorted.library.type.Data1D;
 import org.distorted.library.type.Data3D;
 
@@ -54,4 +56,22 @@ public class MatrixEffectRotate extends MatrixEffect
     mAxis.get(uniforms,index+1,currentDuration,step);
     return mAngle.get(uniforms,index,currentDuration,step);
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void apply(float[] matrix, float[] uniforms, int index)
+    {
+    float alpha = uniforms[NUM_UNIFORMS*index  ];
+    float axisX = uniforms[NUM_UNIFORMS*index+1];
+    float axisY = uniforms[NUM_UNIFORMS*index+2];
+    float axisZ = uniforms[NUM_UNIFORMS*index+3];
+
+    float x = uniforms[NUM_UNIFORMS*index+4];
+    float y = uniforms[NUM_UNIFORMS*index+5];
+    float z = uniforms[NUM_UNIFORMS*index+6];
+
+    Matrix.translateM(matrix, 0, x,-y, z);
+    Matrix.rotateM( matrix, 0, alpha, axisX, axisY, axisZ);
+    Matrix.translateM(matrix, 0,-x, y,-z);
+    }
   }
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectScale.java b/src/main/java/org/distorted/library/effect/MatrixEffectScale.java
index 2ec5407..30e3958 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectScale.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectScale.java
@@ -19,6 +19,8 @@
 
 package org.distorted.library.effect;
 
+import android.opengl.Matrix;
+
 import org.distorted.library.type.Data3D;
 import org.distorted.library.type.Static3D;
 
@@ -58,4 +60,15 @@ public class MatrixEffectScale extends MatrixEffect
     {
     return mScale.get(uniforms,index,currentDuration,step);
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void apply(float[] matrix, float[] uniforms, int index)
+    {
+    float sx = uniforms[NUM_UNIFORMS*index  ];
+    float sy = uniforms[NUM_UNIFORMS*index+1];
+    float sz = uniforms[NUM_UNIFORMS*index+2];
+
+    Matrix.scaleM(matrix, 0, sx, sy, sz);
+    }
   }
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectShear.java b/src/main/java/org/distorted/library/effect/MatrixEffectShear.java
index 6560c75..73809f3 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectShear.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectShear.java
@@ -19,6 +19,8 @@
 
 package org.distorted.library.effect;
 
+import android.opengl.Matrix;
+
 import org.distorted.library.type.Data3D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -51,4 +53,36 @@ public class MatrixEffectShear extends MatrixEffect
     mCenter.get(uniforms,index+4,currentDuration,step);
     return mShear.get(uniforms,index,currentDuration,step);
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void apply(float[] matrix, float[] uniforms, int index)
+    {
+    float sx = uniforms[NUM_UNIFORMS*index  ];
+    float sy = uniforms[NUM_UNIFORMS*index+1];
+    float sz = uniforms[NUM_UNIFORMS*index+2];
+
+    float x  = uniforms[NUM_UNIFORMS*index+4];
+    float y  = uniforms[NUM_UNIFORMS*index+5];
+    float z  = uniforms[NUM_UNIFORMS*index+6];
+
+    Matrix.translateM(matrix, 0, x,-y, z);
+
+    matrix[4] += sx*matrix[0]; // Multiply viewMatrix by 1 x 0 0 , i.e. X-shear.
+    matrix[5] += sx*matrix[1]; //                        0 1 0 0
+    matrix[6] += sx*matrix[2]; //                        0 0 1 0
+    matrix[7] += sx*matrix[3]; //                        0 0 0 1
+
+    matrix[0] += sy*matrix[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. Y-shear.
+    matrix[1] += sy*matrix[5]; //                        y 1 0 0
+    matrix[2] += sy*matrix[6]; //                        0 0 1 0
+    matrix[3] += sy*matrix[7]; //                        0 0 0 1
+
+    matrix[4] += sz*matrix[8]; // Multiply viewMatrix by 1 0 0 0 , i.e. Z-shear.
+    matrix[5] += sz*matrix[9]; //                        0 1 0 0
+    matrix[6] += sz*matrix[10];//                        0 z 1 0
+    matrix[7] += sz*matrix[11];//                        0 0 0 1
+
+    Matrix.translateM(matrix, 0,-x, y, -z);
+    }
   }
diff --git a/src/main/java/org/distorted/library/main/EffectQueueMatrix.java b/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
index 79d3c50..d6caa07 100644
--- a/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
+++ b/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
@@ -34,7 +34,6 @@ class EffectQueueMatrix extends EffectQueue
   private static final int INDEX = EffectType.MATRIX.ordinal();
 
   private static float[] mMVPMatrix = new float[16];
-  private static float[] mTmpMatrix = new float[16];
   private static float[] mViewMatrix= new float[16];
 
   private static int mObjDH;      // This is a handle to half a Object dimensions
@@ -48,52 +47,6 @@ class EffectQueueMatrix extends EffectQueue
     super(id,NUM_UNIFORMS,INDEX );
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private static void multiplyByQuat(float[] matrix, float X, float Y, float Z, float W)
-    {
-    float xx= X * X;
-    float xy= X * Y;
-    float xz= X * Z;
-    float xw= X * W;
-    float yy= Y * Y;
-    float yz= Y * Z;
-    float yw= Y * W;
-    float zz= Z * Z;
-    float zw= Z * W;
-
-    mTmpMatrix[0]  = 1 - 2 * ( yy + zz );
-    mTmpMatrix[1]  =     2 * ( xy - zw );
-    mTmpMatrix[2]  =     2 * ( xz + yw );
-    mTmpMatrix[4]  =     2 * ( xy + zw );
-    mTmpMatrix[5]  = 1 - 2 * ( xx + zz );
-    mTmpMatrix[6]  =     2 * ( yz - xw );
-    mTmpMatrix[8]  =     2 * ( xz - yw );
-    mTmpMatrix[9]  =     2 * ( yz + xw );
-    mTmpMatrix[10] = 1 - 2 * ( xx + yy );
-    mTmpMatrix[3]  = mTmpMatrix[7] = mTmpMatrix[11] = mTmpMatrix[12] = mTmpMatrix[13] = mTmpMatrix[14] = 0;
-    mTmpMatrix[15] = 1;
-    
-    Matrix.multiplyMM(mMVPMatrix, 0, matrix, 0, mTmpMatrix, 0);  
-
-    matrix[ 0] = mMVPMatrix[ 0];
-    matrix[ 1] = mMVPMatrix[ 1];
-    matrix[ 2] = mMVPMatrix[ 2];
-    matrix[ 3] = mMVPMatrix[ 3];
-    matrix[ 4] = mMVPMatrix[ 4];
-    matrix[ 5] = mMVPMatrix[ 5];
-    matrix[ 6] = mMVPMatrix[ 6];
-    matrix[ 7] = mMVPMatrix[ 7];
-    matrix[ 8] = mMVPMatrix[ 8];
-    matrix[ 9] = mMVPMatrix[ 9];
-    matrix[10] = mMVPMatrix[10];
-    matrix[11] = mMVPMatrix[11];
-    matrix[12] = mMVPMatrix[12];
-    matrix[13] = mMVPMatrix[13];
-    matrix[14] = mMVPMatrix[14];
-    matrix[15] = mMVPMatrix[15];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private void magnify(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels)
@@ -200,78 +153,13 @@ class EffectQueueMatrix extends EffectQueue
     {
     Matrix.setIdentityM(mViewMatrix, 0);
     Matrix.translateM(mViewMatrix, 0, -projection.mWidth/2, projection.mHeight/2, -projection.mDistance);
-
-    float x,y,z, sx,sy,sz;
     float mipmap = projection.mMipmap;
-
     if( mipmap!=1 ) Matrix.scaleM(mViewMatrix, 0, mipmap, mipmap, mipmap);
 
-    for(int i=0; i<mNumEffects; i++)
-      {
-      switch( mEffects[i].getName() )
-        {
-        case ROTATE     : x = mUniforms[NUM_UNIFORMS*i+4];
-                          y = mUniforms[NUM_UNIFORMS*i+5];
-                          z = mUniforms[NUM_UNIFORMS*i+6];
-
-                          Matrix.translateM(mViewMatrix, 0, x,-y, z);
-                          Matrix.rotateM( mViewMatrix, 0, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
-                          Matrix.translateM(mViewMatrix, 0,-x, y,-z);
-                          break;
-        case QUATERNION : x = mUniforms[NUM_UNIFORMS*i+4];
-                          y = mUniforms[NUM_UNIFORMS*i+5];
-                          z = mUniforms[NUM_UNIFORMS*i+6];
-
-                          Matrix.translateM(mViewMatrix, 0, x,-y, z);
-                          multiplyByQuat(mViewMatrix, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
-                          Matrix.translateM(mViewMatrix, 0,-x, y,-z);
-                          break;
-        case MOVE       : sx = mUniforms[NUM_UNIFORMS*i  ];
-                          sy = mUniforms[NUM_UNIFORMS*i+1];
-                          sz = mUniforms[NUM_UNIFORMS*i+2];
-
-                          Matrix.translateM(mViewMatrix, 0, sx,-sy, sz);
-                          break;
-        case SCALE      : sx = mUniforms[NUM_UNIFORMS*i  ];
-                          sy = mUniforms[NUM_UNIFORMS*i+1];
-                          sz = mUniforms[NUM_UNIFORMS*i+2];
-
-                          Matrix.scaleM(mViewMatrix, 0, sx, sy, sz);
-                          break;
-        case SHEAR      : sx = mUniforms[NUM_UNIFORMS*i  ];
-                          sy = mUniforms[NUM_UNIFORMS*i+1];
-                          sz = mUniforms[NUM_UNIFORMS*i+2];
-
-                          x  = mUniforms[NUM_UNIFORMS*i+4];
-                          y  = mUniforms[NUM_UNIFORMS*i+5];
-                          z  = mUniforms[NUM_UNIFORMS*i+6];
-
-                          Matrix.translateM(mViewMatrix, 0, x,-y, z);
-
-                          mViewMatrix[4] += sx*mViewMatrix[0]; // Multiply viewMatrix by 1 x 0 0 , i.e. X-shear.
-                          mViewMatrix[5] += sx*mViewMatrix[1]; //                        0 1 0 0
-                          mViewMatrix[6] += sx*mViewMatrix[2]; //                        0 0 1 0
-                          mViewMatrix[7] += sx*mViewMatrix[3]; //                        0 0 0 1
-
-                          mViewMatrix[0] += sy*mViewMatrix[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. Y-shear.
-                          mViewMatrix[1] += sy*mViewMatrix[5]; //                        y 1 0 0
-                          mViewMatrix[2] += sy*mViewMatrix[6]; //                        0 0 1 0
-                          mViewMatrix[3] += sy*mViewMatrix[7]; //                        0 0 0 1
-
-                          mViewMatrix[4] += sz*mViewMatrix[8]; // Multiply viewMatrix by 1 0 0 0 , i.e. Z-shear.
-                          mViewMatrix[5] += sz*mViewMatrix[9]; //                        0 1 0 0
-                          mViewMatrix[6] += sz*mViewMatrix[10];//                        0 z 1 0
-                          mViewMatrix[7] += sz*mViewMatrix[11];//                        0 0 0 1
-
-                          Matrix.translateM(mViewMatrix, 0,-x, y, -z);
-                          break;
-        }
-      }
+    for(int i=0; i<mNumEffects; i++) ((MatrixEffect)mEffects[i]).apply(mViewMatrix,mUniforms,i);
 
     Matrix.translateM(mViewMatrix, 0, halfX,-halfY,-halfZ);
-
     if( marginInPixels!=0 ) magnify(projection,halfX,halfY,halfZ, marginInPixels);
-
     Matrix.multiplyMM(mMVPMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0);
     }
 
