commit 7490d738913e4727f284b4ea36b91d303de198d6
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Mar 10 17:39:48 2020 +0000

    Fixes for the Projection matrix, FOV.
    
    There was a confusion between the Projection of the Node onto the Screen, and the Projection of the Cubits on the Node.

diff --git a/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java b/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java
index 40c60eb..614cf67 100644
--- a/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java
+++ b/src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java
@@ -34,8 +34,8 @@ class EffectQueueMatrix extends EffectQueue
   private static final int NUM_UNIFORMS = MatrixEffect.NUM_UNIFORMS;
   private static final int INDEX = EffectType.MATRIX.ordinal();
 
-  private static float[] mMVPMatrix = new float[16];
-  private static float[] mViewMatrix= new float[16];
+  private static float[] mMVPMatrix       = new float[16];
+  private static float[] mModelViewMatrix = new float[16];
 
   private static int[] mBoundingH  = new int[MAIN_VARIANTS];
   private static int[] mStretchH   = new int[MAIN_VARIANTS];
@@ -91,7 +91,7 @@ class EffectQueueMatrix extends EffectQueue
 
     mTmpPoint[3] = 1.0f;
 
-    Matrix.multiplyMM(mTmpMatrix, 0, projection, 0, mViewMatrix, 0);
+    Matrix.multiplyMM(mTmpMatrix, 0, projection, 0, mModelViewMatrix, 0);
 
     float halfX = mesh.getBoundingX();
     float halfY = mesh.getBoundingY();
@@ -152,17 +152,21 @@ class EffectQueueMatrix extends EffectQueue
 
   void send(float distance, float mipmap, float[] projection, MeshBase mesh, int variant)
     {
-    Matrix.setIdentityM(mViewMatrix, 0);
-    Matrix.translateM(mViewMatrix, 0, 0,0, -distance);
+    Matrix.setIdentityM(mModelViewMatrix, 0);
 
-    if( mipmap!=1 ) Matrix.scaleM(mViewMatrix, 0, mipmap, mipmap, mipmap);
+    // The 'View' part of the MV matrix
+    Matrix.translateM(mModelViewMatrix, 0, 0,0, -distance);
+    if( mipmap!=1 ) Matrix.scaleM(mModelViewMatrix, 0, mipmap, mipmap, mipmap);
 
-    for(int i=mNumEffects-1; i>=0; i--) ((MatrixEffect)mEffects[i]).apply(mViewMatrix,mUniforms,i);
-    Matrix.multiplyMM(mMVPMatrix, 0, projection, 0, mViewMatrix, 0);
+    // the 'Model' part of the MV matrix
+    for(int i=mNumEffects-1; i>=0; i--) ((MatrixEffect)mEffects[i]).apply(mModelViewMatrix,mUniforms,i);
+
+    // combined Model-View-Projection matrix
+    Matrix.multiplyMM(mMVPMatrix, 0, projection, 0, mModelViewMatrix, 0);
 
     GLES31.glUniform3f( mBoundingH[variant] , mesh.getBoundingX(), mesh.getBoundingY(), mesh.getBoundingZ());
     GLES31.glUniform3f( mStretchH[variant]  , mesh.getStretchX() , mesh.getStretchY() , mesh.getStretchZ() );
-    GLES31.glUniformMatrix4fv(mMVMatrixH[variant] , 1, false, mViewMatrix, 0);
-    GLES31.glUniformMatrix4fv(mMVPMatrixH[variant], 1, false, mMVPMatrix , 0);
+    GLES31.glUniformMatrix4fv(mMVMatrixH[variant] , 1, false, mModelViewMatrix, 0);
+    GLES31.glUniformMatrix4fv(mMVPMatrixH[variant], 1, false, mMVPMatrix      , 0);
     }
   }
