commit 5e23b17b5ee031ea84cce3cac01fe79ebdac8a2e
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Apr 2 22:58:17 2019 +0100

    Make the 'PINCH' effect fully 3D (define its acting line in terms of (latitude,longitude) angle pair).
    
    Still, something is not fully working in the Earth app with the effect - investigate.

diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java
index 7e357e2..8d4baec 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java
@@ -29,10 +29,8 @@ import org.distorted.library.effect.VertexEffectSink;
 import org.distorted.library.effect.VertexEffectSwirl;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.type.Dynamic1D;
-import org.distorted.library.type.Dynamic2D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static1D;
-import org.distorted.library.type.Static2D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 
@@ -58,8 +56,8 @@ class AroundTheWorldEffectsManager
   // b) make the nose broader (PINCH)
   private Static4D aNoseBroaderRegion;
   private Static3D aNoseBroaderCenter;
-  private Static2D aNoseBroaderFactor;
-  private Dynamic2D aNoseBroaderDyn;
+  private Static3D aNoseBroaderFactor;
+  private Dynamic3D aNoseBroaderDyn;
   // c) make the nostrils more visible (DISTORT)
   private Static4D aNostrilsRegion;
   private Static3D aNostrilsCenter;
@@ -95,8 +93,8 @@ class AroundTheWorldEffectsManager
   // a) make the whole face broader (PINCH)
   private Static4D bFaceRegion;
   private Static3D bFaceCenter;
-  private Static2D bFaceFactor;
-  private Dynamic2D bFaceDyn;
+  private Static3D bFaceFactor;
+  private Dynamic3D bFaceDyn;
   // b) tip of the nose lower (DISTORT)
   private Static4D bTipLowerRegion;
   private Static3D bTipLowerCenter;
@@ -105,18 +103,18 @@ class AroundTheWorldEffectsManager
   // c) broaden the whole nose: (PINCH)
   private Static4D bWholeNoseRegion;
   private Static3D bWholeNoseCenter;
-  private Static2D bWholeNoseFactor;
-  private Dynamic2D bWholeNoseDyn;
+  private Static3D bWholeNoseFactor;
+  private Dynamic3D bWholeNoseDyn;
   // d) broaden the tip of the nose some more: (PINCH)
   private Static4D bNoseBroaderRegion;
   private Static3D bNoseBroaderCenter;
-  private Static2D bNoseBroaderFactor;
-  private Dynamic2D bNoseBroaderDyn;
+  private Static3D bNoseBroaderFactor;
+  private Dynamic3D bNoseBroaderDyn;
   // 3) make lips higher: (PINCH)
   private Static4D bLipsRegion;
   private Static3D bLipsCenter;
-  private Static2D bLipsFactor;
-  private Dynamic2D bLipsDyn;
+  private Static3D bLipsFactor;
+  private Dynamic3D bLipsDyn;
   // Fragment effects
   // a) make the whole face darker (CHROMA)
   private Static3D bSkinColorCenter;
@@ -166,8 +164,8 @@ class AroundTheWorldEffectsManager
 
     aNoseBroaderRegion = new Static4D(0,0,0,130);
     aNoseBroaderCenter = new Static3D(300,293,0);
-    aNoseBroaderDyn    = new Dynamic2D();
-    aNoseBroaderFactor = new Static2D(0,90);
+    aNoseBroaderDyn    = new Dynamic3D();
+    aNoseBroaderFactor = new Static3D(0,0,90);
     aNoseBroaderDyn.add(aNoseBroaderFactor);
 
     aNostrilsRegion    = new Static4D(0,0,0,60);
@@ -214,8 +212,8 @@ class AroundTheWorldEffectsManager
     // Vertex Effects
     bFaceRegion        = new Static4D(0,0,0,600);
     bFaceCenter        = new Static3D(300,300,0);
-    bFaceFactor        = new Static2D(1.0f,90.0f);
-    bFaceDyn           = new Dynamic2D();
+    bFaceFactor        = new Static3D(1.0f,0.0f,90.0f);
+    bFaceDyn           = new Dynamic3D();
     bFaceDyn.add(bFaceFactor);
 
     bTipLowerRegion    = new Static4D(0,0,0,41);
@@ -226,20 +224,20 @@ class AroundTheWorldEffectsManager
 
     bWholeNoseRegion   = new Static4D(0,0,0,130);
     bWholeNoseCenter   = new Static3D(300,243,0);
-    bWholeNoseFactor   = new Static2D(1.0f,90.0f);
-    bWholeNoseDyn      = new Dynamic2D();
+    bWholeNoseFactor   = new Static3D(1.0f,0.0f,90.0f);
+    bWholeNoseDyn      = new Dynamic3D();
     bWholeNoseDyn.add(bWholeNoseFactor);
 
     bNoseBroaderRegion = new Static4D(0,0,0,95);
     bNoseBroaderCenter = new Static3D(300,192,0);
-    bNoseBroaderFactor = new Static2D(1.0f,90.0f);
-    bNoseBroaderDyn    = new Dynamic2D();
+    bNoseBroaderFactor = new Static3D(1.0f,0.0f,90.0f);
+    bNoseBroaderDyn    = new Dynamic3D();
     bNoseBroaderDyn.add(bNoseBroaderFactor);
 
     bLipsRegion        = new Static4D(0,-96,0,118);
     bLipsCenter        = new Static3D(300,142,0);
-    bLipsFactor        = new Static2D(1.0f,0.0f);
-    bLipsDyn           = new Dynamic2D();
+    bLipsFactor        = new Static3D(1.0f,90.0f,0.0f);
+    bLipsDyn           = new Dynamic3D();
     bLipsDyn.add(bLipsFactor);
 
     // Fragment Effects
diff --git a/src/main/java/org/distorted/examples/earth/EarthRenderer.java b/src/main/java/org/distorted/examples/earth/EarthRenderer.java
index 7ef64a8..8842de4 100644
--- a/src/main/java/org/distorted/examples/earth/EarthRenderer.java
+++ b/src/main/java/org/distorted/examples/earth/EarthRenderer.java
@@ -50,7 +50,6 @@ import org.distorted.library.mesh.MeshSphere;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.DynamicQuat;
 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;
@@ -89,7 +88,7 @@ class EarthRenderer implements GLSurfaceView.Renderer
     private Static3D mRegionF;
     private Static4D mRegionV;
     private Static1D mStrength;
-    private Static2D mPinch;
+    private Static3D mPinch;
     private Static1D mSwirl;
 
     Static4D mQuat1, mQuat2;
@@ -110,7 +109,7 @@ class EarthRenderer implements GLSurfaceView.Renderer
       mMove       = new Static3D(0,0,0);
       mScaleFactor= new Static3D(1,1,1);
       mCenter     = new Static3D(0,0,0);
-      mPinch      = new Static2D(0.5f,0.0f);
+      mPinch      = new Static3D(0.5f,0.0f,0.0f);
       mSwirl      = new Static1D(45.0f);
 
       Dynamic3D scale = new Dynamic3D(0,0.5f);
@@ -214,10 +213,12 @@ class EarthRenderer implements GLSurfaceView.Renderer
         case DEFORM           : vector = new Static3D( +x*mObjWidth/CORR, +y*mObjHeight/CORR, +z*mObjDepth/CORR);
                                 effect = new VertexEffectDeform (   vector, center, mRegionV); break;
         case SINK             : effect = new VertexEffectSink   (mStrength, center, mRegionV); break;
-        case PINCH            : effect = new VertexEffectPinch  (mPinch   , center, mRegionV); break;      // Those 3 are not really
-        case SWIRL            : effect = new VertexEffectSwirl  (mSwirl   , center, mRegionV); break;      // fully 3D effects. They
-        case WAVE             : Static5D wave = new Static5D( RADIUS_V/2, RADIUS_V/2, 0, 90-latitude, 90); // will not look good
-                                effect = new VertexEffectWave   (wave     , center, mRegionV); break;      // everywhere on the sphere.
+        case PINCH            : mPinch.set2(latitude);//>0 ? (float)(Math.PI/2 - latitude) : (float)(-Math.PI/2 - latitude) );
+                                mPinch.set3(longitude);// (float)(Math.PI+longitude) );
+                                effect = new VertexEffectPinch  (mPinch   , center, mRegionV); break;
+        case SWIRL            : effect = new VertexEffectSwirl  (mSwirl   , center, mRegionV); break;      // SWIRL & WAVE are not really fully
+        case WAVE             : Static5D wave = new Static5D( RADIUS_V/2, RADIUS_V/2, 0, 90-latitude, 90); // 3D effects. They will not look
+                                effect = new VertexEffectWave   (wave     , center, mRegionV); break;      // good everywhere on the sphere.
 
         case ALPHA            : effect = new FragmentEffectAlpha     (mStrength,        center, mRegionF, false); break;
         case SMOOTH_ALPHA     : effect = new FragmentEffectAlpha     (mStrength,        center, mRegionF, true ); break;
diff --git a/src/main/java/org/distorted/examples/generic/GenericEffect.java b/src/main/java/org/distorted/examples/generic/GenericEffect.java
index 8a648c0..324f053 100644
--- a/src/main/java/org/distorted/examples/generic/GenericEffect.java
+++ b/src/main/java/org/distorted/examples/generic/GenericEffect.java
@@ -116,7 +116,7 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
       case DISTORT          : effect = new VertexEffectDistort     (mDyn3, mCenterDyn, mRegion4Dyn); break;
       case DEFORM           : effect = new VertexEffectDeform      (mDyn3, mCenterDyn, mRegion4Dyn); break;
       case SINK             : effect = new VertexEffectSink        (mDyn1, mCenterDyn, mRegion4Dyn); break;
-      case PINCH            : effect = new VertexEffectPinch       (mDyn2, mCenterDyn, mRegion4Dyn); break;
+      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;
 
@@ -153,7 +153,7 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
       // MATRIX
       ///////////////////////////////////////////////////////////////////////////////////////
 
-      case ROTATE           : float an = (mInter[0]-50)*180/50;
+      case ROTATE           : float an = (mInter[0]-50)*180/50.0f;
                               float rx = (mInter[1]-50)/ 50.0f;
                               float ry = (mInter[2]-50)/ 50.0f;
                               float rz = (mInter[3]-50)/ 50.0f;
@@ -202,9 +202,9 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
       case WAVE             : float l2 = mAct.get().getWidth()/50.0f;
                               float x2 = (mInter[0]-50)*l2;
                               float y2 = (mInter[1]-50)*l2;
-                              float z2 = (mInter[2]-50)*180 / 50;
-                              float w2 = (mInter[3]-50)*180 / 50;
-                              float v2 = (mInter[4]-50)*180 / 50;
+                              float z2 = (mInter[2]-50)*180 / 50.0f;
+                              float w2 = (mInter[3]-50)*180 / 50.0f;
+                              float v2 = (mInter[4]-50)*180 / 50.0f;
                               mSta5.set(x2,y2,z2,w2,v2);
                               break;
       case SWIRL            : mSta1.set( 3.6f*(mInter[0]-50) );
@@ -212,8 +212,9 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
       case SINK             : mSta1.set(mInter[0] > 50 ? 50.0f/(100.01f-mInter[0]) : mInter[0] / 50.0f);
                               break;
       case PINCH            : float dp = mInter[0] > 50 ? 50.0f/(100.01f-mInter[0]) : mInter[0] / 50.0f;
-                              float ap = (mInter[1]-50)*180 / 50;
-                              mSta2.set(dp,ap);
+                              float ap = (mInter[1]-50)*180 / 50.0f;
+                              float bp = (mInter[2]-50)*180 / 50.0f;
+                              mSta3.set(dp,ap,bp);
                               break;
 
       ///////////////////////////////////////////////////////////////////////////////////////
