commit 2f2f617665f2c1dd050fb007ae26f4848d8398f6
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Tue Oct 18 12:19:31 2016 +0100

    Make the WAVE effect 5D (extra parameter 'offset')

diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java b/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java
index 25f72be..5acb93f 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java
@@ -31,16 +31,18 @@ import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic2D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Dynamic4D;
+import org.distorted.library.type.Dynamic5D;
 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;
 
 import java.lang.ref.WeakReference;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
+class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
   {
   private WeakReference<Effects3DActivity> mAct;
 
@@ -56,10 +58,10 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
 
   private Dynamic1D mDyn1;
   private Dynamic3D mDyn3;
-  private Dynamic4D mDyn4;
+  private Dynamic5D mDyn5;
   private Static1D  mSta1;
   private Static3D  mSta3;
-  private Static4D  mSta4;
+  private Static5D  mSta5;
   private Dynamic4D mRegionDyn;
   private Static4D  mRegionSta;
   private Dynamic2D mCenterDyn;
@@ -76,8 +78,9 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
       case DEFORM       : return 3;
 
       case CHROMA       :
-      case SMOOTH_CHROMA:
-      case WAVE         : return 4;
+      case SMOOTH_CHROMA: return 4;
+
+      case WAVE         : return 5;
 
       default           : return 1;
       }
@@ -86,7 +89,7 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // requires knowledge about effect nature
 
-  public void apply(DistortedObject object)
+  void apply(DistortedObject object)
     {
     switch(mName)
       {
@@ -94,7 +97,7 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
       case DEFORM : object.deform (mDyn3, mCenterDyn            ); break;
       case SINK   : object.sink   (mDyn1, mCenterDyn, mRegionDyn); break;
       case SWIRL  : object.swirl  (mDyn1, mCenterDyn, mRegionDyn); break;
-      case WAVE   : object.wave   (mDyn4, mCenterDyn, mRegionDyn); break;
+      case WAVE   : object.wave   (mDyn5, mCenterDyn, mRegionDyn); break;
 
       case ALPHA            : object.alpha     (mDyn1,        mRegionDyn, false); break;
       case SMOOTH_ALPHA     : object.alpha     (mDyn1,        mRegionDyn, true ); break;
@@ -114,7 +117,7 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
 
   private boolean supportsRegion()
     {
-    return mName == EffectNames.DEFORM ? false : true;
+    return mName != EffectNames.DEFORM;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -136,7 +139,8 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
                               float y2 = (mInter[1]-50)*l2;
                               float z2 = (mInter[2]-50)*180 / 50;
                               float w2 = (mInter[3]-50)*180 / 50;
-                              mSta4.set(x2,y2,z2,w2);
+                              float v2 = (mInter[4]-50)*180 / 50;
+                              mSta5.set(x2,y2,z2,w2,v2);
                               break;
       case SINK             : mSta1.set(mInter[0] > 50 ? 50.0f/(100.01f-mInter[0]) : mInter[0] / 50.0f);
                               break;
@@ -178,6 +182,7 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
                               mInter[1] = 50;
                               mInter[2] = 50;
                               mInter[3] = 50;
+                              mInter[4] = 50;
                               break;
       case SINK             :
       case SWIRL            : mInter[0] = 50;
@@ -222,13 +227,14 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
       text += " ("+f1+","+f2+","+f3+")";
       }
 
-    if( mSta4 !=null )
+    if( mSta5 !=null )
       {
-      int f1 = (int)mSta4.getX();
-      int f2 = (int)mSta4.getY();
-      int f3 = (int)mSta4.getZ();
-      int f4 = (int)mSta4.getW();
-      text += " ("+f1+","+f2+","+f3+","+f4+")";
+      int f1 = (int)mSta5.getX();
+      int f2 = (int)mSta5.getY();
+      int f3 = (int)mSta5.getZ();
+      int f4 = (int)mSta5.getW();
+      int f5 = (int)mSta5.getV();
+      text += " ("+f1+","+f2+","+f3+","+f4+","+f5+")";
       }
 
     mText.setText(text);
@@ -306,17 +312,17 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public Effects3DEffect(EffectNames name, Effects3DActivity act)
+  Effects3DEffect(EffectNames name, Effects3DActivity act)
     {
     mAct = new WeakReference<>(act);
     mName = name;
 
     mDyn1 = null;
     mDyn3 = null;
-    mDyn4 = null;
+    mDyn5 = null;
     mSta1 = null;
     mSta3 = null;
-    mSta4 = null;
+    mSta5 = null;
 
     mDimension = getDimension();
 
@@ -330,21 +336,16 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
                mSta3 = new Static3D(0,0,0);
                mDyn3.add(mSta3);
                break;
-      case 4 : if( mName == EffectNames.WAVE )
-                 {
-                 mDyn4 = new Dynamic4D();
-                 mSta4 = new Static4D(0,0,0,0);
-                 mDyn4.add(mSta4);
-                 }
-               else
-                 {
-                 mDyn3 = new Dynamic3D();
-                 mSta3 = new Static3D(0,0,0);
-                 mDyn3.add(mSta3);
-                 mDyn1 = new Dynamic1D();
-                 mSta1 = new Static1D(0);
-                 mDyn1.add(mSta1);
-                 }
+      case 4 : mDyn3 = new Dynamic3D();
+               mSta3 = new Static3D(0,0,0);
+               mDyn3.add(mSta3);
+               mDyn1 = new Dynamic1D();
+               mSta1 = new Static1D(0);
+               mDyn1.add(mSta1);
+               break;
+      case 5 : mDyn5 = new Dynamic5D();
+               mSta5 = new Static5D(0,0,0,0,0);
+               mDyn5.add(mSta5);
                break;
       default: throw new RuntimeException("unsupported effect");
       }
@@ -367,7 +368,7 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public View createView()
+  View createView()
     {
     View effect;
     SeekBar[] seek = new SeekBar[mDimension];
@@ -408,6 +409,19 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
                mSeekID[2] = seek[2].getId();
                mSeekID[3] = seek[3].getId();
                break;
+      case 5 : effect     = act.getLayoutInflater().inflate(R.layout.effect5d, null);
+               mText      = (TextView)effect.findViewById(R.id.effect5dText);
+               seek[0]    = (SeekBar)effect.findViewById(R.id.effect5dbar1);
+               seek[1]    = (SeekBar)effect.findViewById(R.id.effect5dbar2);
+               seek[2]    = (SeekBar)effect.findViewById(R.id.effect5dbar3);
+               seek[3]    = (SeekBar)effect.findViewById(R.id.effect5dbar4);
+               seek[4]    = (SeekBar)effect.findViewById(R.id.effect5dbar5);
+               mSeekID[0] = seek[0].getId();
+               mSeekID[1] = seek[1].getId();
+               mSeekID[2] = seek[2].getId();
+               mSeekID[3] = seek[3].getId();
+               mSeekID[4] = seek[4].getId();
+               break;
       default: android.util.Log.e("Effects3DEffect", "dimension "+mDimension+" not supported!");
                return null;
       }
@@ -428,7 +442,7 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public View createRegion()
+  View createRegion()
     {
     Effects3DActivity act = mAct.get();
 
@@ -463,7 +477,7 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public View createCenter()
+  View createCenter()
     {
     Effects3DActivity act = mAct.get();
 
@@ -520,6 +534,12 @@ public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
       fillStatics();
       setText();
       }
+    if ( mDimension>=5 && bar.getId()==mSeekID[4] )
+      {
+      mInter[4] = progress;
+      fillStatics();
+      setText();
+      }
 
     if( bar.getId() == mSeekRegionID[0] )
       {
diff --git a/src/main/res/layout/effect5d.xml b/src/main/res/layout/effect5d.xml
new file mode 100644
index 0000000..4f56e5c
--- /dev/null
+++ b/src/main/res/layout/effect5d.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:id="@+id/effect5dLayout"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/effect5dText"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="5dp"
+            android:layout_marginStart="5dp"
+            android:layout_marginTop="3dp" />
+
+        <SeekBar
+            android:id="@+id/effect5dbar1"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="5dp"
+            android:layout_marginLeft="5dp"
+            android:layout_marginRight="5dp" />
+
+        <SeekBar
+            android:id="@+id/effect5dbar2"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="5dp"
+            android:layout_marginLeft="5dp"
+            android:layout_marginRight="5dp" />
+
+        <SeekBar
+            android:id="@+id/effect5dbar3"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="5dp"
+            android:layout_marginLeft="5dp"
+            android:layout_marginRight="5dp" />
+
+        <SeekBar
+            android:id="@+id/effect5dbar4"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="5dp"
+            android:layout_marginLeft="5dp"
+            android:layout_marginRight="5dp" />
+
+        <SeekBar
+            android:id="@+id/effect5dbar5"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="5dp"
+            android:layout_marginLeft="5dp"
+            android:layout_marginRight="5dp" />
+
+</LinearLayout>
\ No newline at end of file
