commit 06c636a593a3ddd1e4fe33a6174cfd8414019523
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Jul 30 15:49:42 2018 +0100

    More progress with Effects3D app.

diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DActivity2.java b/src/main/java/org/distorted/examples/effects3d/Effects3DActivity2.java
index 5a5b773..2304674 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DActivity2.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DActivity2.java
@@ -47,6 +47,8 @@ import java.io.InputStream;
 
 public class Effects3DActivity2 extends AppCompatActivity
   {
+  public static final int NUM_TABS = 3;
+
   private int mNumCols;
   private int mNumRows;
   private int mNumSlic;
@@ -69,6 +71,8 @@ public class Effects3DActivity2 extends AppCompatActivity
   private static boolean mShowNormal = true;
   private static boolean mUseOIT     = false;
 
+  private Effects3DTab[] mTab;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   @Override
@@ -78,6 +82,8 @@ public class Effects3DActivity2 extends AppCompatActivity
 
     setTheme(R.style.Theme_AppCompat_NoActionBar);
 
+    mTab = new Effects3DTab[NUM_TABS];
+
     Bundle b = getIntent().getExtras();
 
     mObjectType = b.getInt("type");
@@ -102,7 +108,7 @@ public class Effects3DActivity2 extends AppCompatActivity
     setContentView(view);
 
     mViewPager = findViewById(R.id.effects3d_viewpager);
-    mViewPager.setOffscreenPageLimit(2);
+    mViewPager.setOffscreenPageLimit( (NUM_TABS+1)/2 );
     mPager = new Effects3DTabViewPager(this, getSupportFragmentManager() );
     mViewPager.setAdapter(mPager);
     TabLayout tabLayout = findViewById(R.id.effects3d_sliding_tabs);
@@ -291,21 +297,34 @@ public class Effects3DActivity2 extends AppCompatActivity
 
   public void newEffect(View v)
     {
-    mPager.newEffect(v,mViewPager.getCurrentItem());
+    int pos = mViewPager.getCurrentItem();
+
+    if( pos>=0 && pos<NUM_TABS ) mTab[pos].newEffect();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void removeAll(View v)
     {
-    mPager.removeAll(v,mViewPager.getCurrentItem());
+    int pos = mViewPager.getCurrentItem();
+
+    if( pos>=0 && pos<NUM_TABS ) mTab[pos].removeAll();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void remove(View v)
     {
-    mPager.remove(v,mViewPager.getCurrentItem());
+    int pos = mViewPager.getCurrentItem();
+
+    if( pos>=0 && pos<NUM_TABS ) mTab[pos].remove(v);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void setTab(int pos, Effects3DTab tab)
+    {
+    if( pos>=0 && pos<NUM_TABS ) mTab[pos] = tab;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java b/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java
index b9ba6ee..fe863b2 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java
@@ -37,6 +37,8 @@ import org.distorted.library.effect.MatrixEffectQuaternion;
 import org.distorted.library.effect.MatrixEffectRotate;
 import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.effect.MatrixEffectShear;
+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.VertexEffectPinch;
@@ -123,6 +125,9 @@ class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
       case SMOOTH_SATURATION: effect = new FragmentEffectSaturation(mDyn1,        mRegionDyn, true ); break;
       case CONTRAST         : effect = new FragmentEffectContrast  (mDyn1,        mRegionDyn, false); break;
       case SMOOTH_CONTRAST  : effect = new FragmentEffectContrast  (mDyn1,        mRegionDyn, true ); break;
+
+      case BLUR             : effect = new PostprocessEffectBlur   (mDyn1       ); break;
+      case GLOW             : effect = new PostprocessEffectGlow   (mDyn1, mDyn4); break;
       }
 
     if( effect!=null )
@@ -139,6 +144,10 @@ class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
     {
     switch(mName)
       {
+      ///////////////////////////////////////////////////////////////////////////////////////
+      // MATRIX
+      ///////////////////////////////////////////////////////////////////////////////////////
+
       case ROTATE           : float an = (mInter[0]-50)*180/50;
                               float rx = (mInter[1]-50)/ 50.0f;
                               float ry = (mInter[2]-50)/ 50.0f;
@@ -173,6 +182,10 @@ class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
                               mSta3.set(xsh,ysh,zsh);
                               break;
 
+      ///////////////////////////////////////////////////////////////////////////////////////
+      // VERTEX
+      ///////////////////////////////////////////////////////////////////////////////////////
+
       case DISTORT          :
       case DEFORM           : float ld = mAct.get().getWidth()/50.0f;
                               float xd = (mInter[0]-50)*ld;
@@ -197,6 +210,10 @@ class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
                               mSta2.set(dp,ap);
                               break;
 
+      ///////////////////////////////////////////////////////////////////////////////////////
+      // FRAGMENT
+      ///////////////////////////////////////////////////////////////////////////////////////
+
       case ALPHA            :
       case SMOOTH_ALPHA     : mSta1.set(mInter[0]/100.0f);
                               break;
@@ -213,6 +230,19 @@ class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
                                         mInter[2]/100.0f,
                                         mInter[3]/100.0f);
                               break;
+
+      ///////////////////////////////////////////////////////////////////////////////////////
+      // POSTPROCESS
+      ///////////////////////////////////////////////////////////////////////////////////////
+
+      case BLUR             : mSta1.set(mInter[0]/2.0f);
+                              break;
+      case GLOW             : mSta1.set(mInter[0]/2.0f);
+                              mSta4.set(mInter[1]/100.0f,
+                                        mInter[2]/100.0f,
+                                        mInter[3]/100.0f,
+                                        mInter[4]/100.0f );
+                              break;
       }
     }
 
@@ -405,9 +435,21 @@ class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
                  mDyn1.add(mSta1);
                  }
                break;
-      case 5 : mDyn5 = new Dynamic5D();
-               mSta5 = new Static5D(0,0,0,0,0);
-               mDyn5.add(mSta5);
+      case 5 : if( mName == EffectName.WAVE )
+                 {
+                 mDyn5 = new Dynamic5D();
+                 mSta5 = new Static5D(0, 0, 0, 0, 0);
+                 mDyn5.add(mSta5);
+                 }
+               else
+                 {
+                 mDyn4 = new Dynamic4D();
+                 mSta4 = new Static4D(0,0,0,0);
+                 mDyn4.add(mSta4);
+                 mDyn1 = new Dynamic1D();
+                 mSta1 = new Static1D(0);
+                 mDyn1.add(mSta1);
+                 }
                break;
       default: throw new RuntimeException("unsupported effect");
       }
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DTab.java b/src/main/java/org/distorted/examples/effects3d/Effects3DTab.java
index 0d894c1..550daea 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DTab.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DTab.java
@@ -87,6 +87,8 @@ public class Effects3DTab extends Fragment implements AdapterView.OnItemSelected
       }
 
     Effects3DActivity2 act = (Effects3DActivity2)getActivity();
+    act.setTab(position, this);
+
     mEffects = act.getEffects();
 
     createEffectNames(mType);
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DTabViewPager.java b/src/main/java/org/distorted/examples/effects3d/Effects3DTabViewPager.java
index dc8a264..53d11d9 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DTabViewPager.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DTabViewPager.java
@@ -22,7 +22,6 @@ package org.distorted.examples.effects3d;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentPagerAdapter;
-import android.view.View;
 import android.os.Bundle;
 
 import org.distorted.examples.R;
@@ -33,43 +32,18 @@ import java.lang.ref.WeakReference;
 
 public class Effects3DTabViewPager extends FragmentPagerAdapter
   {
-  private static final int NUM_TABS = 3;
-
   private WeakReference<Effects3DActivity2> mAct;
-  private Effects3DTab[] mTab;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public Effects3DTabViewPager(Effects3DActivity2 act, FragmentManager fm)
+  Effects3DTabViewPager(Effects3DActivity2 act, FragmentManager fm)
     {
     super(fm);
     mAct = new WeakReference<>(act);
-    mTab = new Effects3DTab[NUM_TABS];
 
     android.util.Log.e("viewPager"," CONSTRUCTOR ");
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  void newEffect(View v, int pos)
-    {
-    if( pos>=0 && pos<NUM_TABS ) mTab[pos].newEffect();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  void removeAll(View v, int pos)
-    {
-    if( pos>=0 && pos<NUM_TABS ) mTab[pos].removeAll();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  void remove(View v, int pos)
-    {
-    if( pos>=0 && pos<NUM_TABS ) mTab[pos].remove(v);
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   @Override
@@ -77,14 +51,14 @@ public class Effects3DTabViewPager extends FragmentPagerAdapter
     {
     android.util.Log.e("viewPager","creating tab "+position);
 
-    if( position>=0 && position<NUM_TABS )
+    if( position>=0 && position<Effects3DActivity2.NUM_TABS )
       {
       Bundle bundle = new Bundle();
       bundle.putInt("position", position);
 
-      mTab[position] = new Effects3DTab();
-      mTab[position].setArguments(bundle);
-      return mTab[position];
+      Effects3DTab tab = new Effects3DTab();
+      tab.setArguments(bundle);
+      return tab;
       }
 
     return null;
@@ -95,7 +69,7 @@ public class Effects3DTabViewPager extends FragmentPagerAdapter
   @Override
   public int getCount()
     {
-    return NUM_TABS;
+    return Effects3DActivity2.NUM_TABS;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 5c3e2db..693ed1d 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -144,8 +144,8 @@
     <string name="example_quaternion_subtitle">Random rotations using quaternions.</string>
     <string name="example_matrix3d">Matrix Effects</string>
     <string name="example_matrix3d_subtitle">Test results of Matrix effects on a 3D object.</string>
-    <string name="example_effects3d">Vertex and Fragment effects</string>
-    <string name="example_effects3d_subtitle">Test results of Vertex and Fragment effects on a 3D object.</string>
+    <string name="example_effects3d">Generic Test</string>
+    <string name="example_effects3d_subtitle">Apply any Effect on a 3D object.</string>
     <string name="example_plainmonalisa">SurfaceView</string>
     <string name="example_plainmonalisa_subtitle">MonaLisa rendered on a plain SurfaceView</string>
     <string name="example_save">Save to PNG</string>
