commit 4282d39a02a1cb4e084725c02d932545e19ccd75
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Apr 25 01:18:36 2020 +0100

    Add the first two VERTEX 'pseudo-matrix' effects: VERTEX_MOVE & VERTEX_QUATERNION i.e. implementations of those two MATRIX effects in VERTEX queue.
    
    The point(s):
    
    1) preparation for the upcoming MeshBase.preApply(VertexEffect effect) API that's going to supersede the current much more limited MeshBase.apply(MatrixEffect effect)
    2) those can be put in any position in the VERTEX queue, whereas the Matrix effects always have to come last

diff --git a/src/main/java/org/distorted/examples/generic/GenericEffect.java b/src/main/java/org/distorted/examples/generic/GenericEffect.java
index b46cdfc..7164dfa 100644
--- a/src/main/java/org/distorted/examples/generic/GenericEffect.java
+++ b/src/main/java/org/distorted/examples/generic/GenericEffect.java
@@ -41,7 +41,9 @@ import org.distorted.library.effect.PostprocessEffectBlur;
 import org.distorted.library.effect.PostprocessEffectGlow;
 import org.distorted.library.effect.VertexEffectDeform;
 import org.distorted.library.effect.VertexEffectDistort;
+import org.distorted.library.effect.VertexEffectMove;
 import org.distorted.library.effect.VertexEffectPinch;
+import org.distorted.library.effect.VertexEffectQuaternion;
 import org.distorted.library.effect.VertexEffectSink;
 import org.distorted.library.effect.VertexEffectSwirl;
 import org.distorted.library.effect.VertexEffectWave;
@@ -99,7 +101,7 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
   private long mId;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// requires knowledge dialog_about effect nature
+// requires knowledge about effect nature
 
   void apply(DistortedEffects effects)
     {
@@ -119,6 +121,8 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
       case PINCH            : effect = new VertexEffectPinch       (mDyn3, mCenterDyn, mRegion4Dyn); break;
       case SWIRL            : effect = new VertexEffectSwirl       (mDyn1, mCenterDyn, mRegion4Dyn); break;
       case WAVE             : effect = new VertexEffectWave        (mDyn5, mCenterDyn, mRegion4Dyn); break;
+      case VERTEX_MOVE      : effect = new VertexEffectMove        (mDyn3)                         ; break;
+      case VERTEX_QUATERNION: effect = new VertexEffectQuaternion  (mDyn4, mCenterDyn)             ; break;
 
       case ALPHA            : effect = new FragmentEffectAlpha     (mDyn1,        mCenterDyn, mRegion3Dyn, false); break;
       case SMOOTH_ALPHA     : effect = new FragmentEffectAlpha     (mDyn1,        mCenterDyn, mRegion3Dyn, true ); break;
@@ -143,14 +147,14 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// requires knowledge dialog_about effect nature
+// requires knowledge about effect nature
 
   private void fillStatics()
     {
     switch(mName)
       {
       ///////////////////////////////////////////////////////////////////////////////////////
-      // MATRIX
+      // MATRIX (and VERTEX-pseudo-matrix)
       ///////////////////////////////////////////////////////////////////////////////////////
 
       case ROTATE           : float an = (mInter[0]-50)*180/50.0f;
@@ -160,13 +164,14 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
                               mSta1.set(an);
                               mSta3.set(rx,ry,rz);
                               break;
+      case VERTEX_QUATERNION:
       case QUATERNION       : float qx = (mInter[0]-50)/ 50.0f;
                               float qy = (mInter[1]-50)/ 50.0f;
                               float qz = (mInter[2]-50)/ 50.0f;
-                              float qa = (mInter[3]-50)*3.1415f/50;
-                              float cosA = (float)Math.cos(qa/2);
+                              float qw = (mInter[3]-50)*3.1415f/50;
+                              float cosA = (float)Math.cos(qw/2);
                               float len = (float)Math.sqrt(qx*qx+qy*qy+qz*qz);
-                              float sinAnorm = (float)Math.sin(qa/2)/len;
+                              float sinAnorm = (float)Math.sin(qw/2)/len;
                               mSta4.set(sinAnorm*qx,sinAnorm*qy,sinAnorm*qz, cosA);
                               break;
       case MOVE             : float scr= mAct.get().getScreenWidth();
@@ -192,6 +197,7 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
       // VERTEX
       ///////////////////////////////////////////////////////////////////////////////////////
 
+      case VERTEX_MOVE      :
       case DISTORT          :
       case DEFORM           : float ld = mAct.get().getWidth()/50.0f;
                               float xd = (mInter[0]-50)*ld;
@@ -266,7 +272,12 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
       case 1: mInter[0] = 50;
       }
 
-    if( mName==EffectName.ROTATE || mName==EffectName.QUATERNION ) mInter[1]= 100;
+    if( mName==EffectName.ROTATE         ||
+        mName==EffectName.QUATERNION     ||
+        mName==EffectName.VERTEX_QUATERNION )
+      {
+      mInter[0]= 100;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -452,7 +463,7 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
                mSta3 = new Static3D(0,0,0);
                mDyn3.add(mSta3);
                break;
-      case 4 : if( mName == EffectName.QUATERNION )
+      case 4 : if( mName == EffectName.QUATERNION || mName == EffectName.VERTEX_QUATERNION )
                  {
                  mDyn4 = new Dynamic4D();
                  mSta4 = new Static4D(0,0,0,0);
@@ -692,77 +703,51 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
 
   public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
     {
-    if ( mDimension>=1 && bar.getId()==mSeekID[0] )
-      {
-      mInter[0] = progress;
-      fillStatics();
-      setText();
-      }
-    if ( mDimension>=2 && bar.getId()==mSeekID[1] )
-      {
-      mInter[1] = progress;
-      fillStatics();
-      setText();
-      }
-    if ( mDimension>=3 && bar.getId()==mSeekID[2] )
-      {
-      mInter[2] = progress;
-      fillStatics();
-      setText();
-      }
-    if ( mDimension>=4 && bar.getId()==mSeekID[3] )
+    boolean vectorChanged=false;
+    boolean regionChanged=false;
+    boolean centerChanged=false;
+
+    for(int dim=0; dim<5; dim++)
       {
-      mInter[3] = progress;
-      fillStatics();
-      setText();
+      if ( mDimension>dim && bar.getId()==mSeekID[dim] )
+        {
+        mInter[dim] = progress;
+        vectorChanged = true;
+        }
       }
-    if ( mDimension>=5 && bar.getId()==mSeekID[4] )
+
+    if( vectorChanged )
       {
-      mInter[4] = progress;
       fillStatics();
       setText();
       }
 
-    if( mRegionDimension>=1 && bar.getId() == mSeekRegionID[0] )
-      {
-      mInterRegion[0] = progress;
-      fillRegionStatics();
-      setRegionText();
-      }
-    if( mRegionDimension>=2 && bar.getId() == mSeekRegionID[1] )
+    for(int reg=0; reg<4; reg++)
       {
-      mInterRegion[1] = progress;
-      fillRegionStatics();
-      setRegionText();
-      }
-    if( mRegionDimension>=3 && bar.getId() == mSeekRegionID[2] )
-      {
-      mInterRegion[2] = progress;
-      fillRegionStatics();
-      setRegionText();
+      if( mRegionDimension>reg && bar.getId() == mSeekRegionID[reg] )
+        {
+        mInterRegion[reg] = progress;
+        regionChanged = true;
+        }
       }
-    if( mRegionDimension>=4 && bar.getId() == mSeekRegionID[3] )
+
+    if( regionChanged )
       {
-      mInterRegion[3] = progress;
       fillRegionStatics();
       setRegionText();
       }
 
-    if( bar.getId() == mSeekCenterID[0] )
-      {
-      mInterCenter[0] = progress;
-      fillCenterStatics();
-      setCenterText();
-      }
-    if( bar.getId() == mSeekCenterID[1] )
+    for(int cen=0; cen<3; cen++)
       {
-      mInterCenter[1] = progress;
-      fillCenterStatics();
-      setCenterText();
+      if( bar.getId() == mSeekCenterID[cen] )
+        {
+        mInterCenter[cen] = progress;
+        centerChanged = true;
+        }
       }
-    if( bar.getId() == mSeekCenterID[2] )
+
+    if( centerChanged )
       {
-      mInterCenter[2] = progress;
       fillCenterStatics();
       setCenterText();
       }
