commit 8fd9f5fac166e3fc688b174d66a4402b9dbea839
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Sat Jul 16 00:53:13 2016 +0100

    Vertex3D: make the Activity independent of Effects

diff --git a/src/main/java/org/distorted/examples/vertex3d/Vertex3DActivity.java b/src/main/java/org/distorted/examples/vertex3d/Vertex3DActivity.java
index 97aecee..8df4bca 100644
--- a/src/main/java/org/distorted/examples/vertex3d/Vertex3DActivity.java
+++ b/src/main/java/org/distorted/examples/vertex3d/Vertex3DActivity.java
@@ -79,10 +79,7 @@ public class Vertex3DActivity extends Activity
   private float mCenterX, mCenterY;
   private float mRegionX, mRegionY, mRegionR;
 
-  private final EffectNames[] mEffectNames = { EffectNames.DISTORT,
-                                               EffectNames.DEFORM ,
-                                               EffectNames.SINK   ,
-                                               EffectNames.SWIRL  };
+  private EffectNames[] mEffectNames;
 
   private static boolean mSupportsRegion = true;
 
@@ -95,6 +92,8 @@ public class Vertex3DActivity extends Activity
 
     mEffects = new ArrayList<>();
 
+    createEffectNames();
+
     setContentView(R.layout.objectpickerlayout);
 
     mColsPicker = (NumberPicker)findViewById(R.id.objectpicker_cols);
@@ -146,6 +145,28 @@ public class Vertex3DActivity extends Activity
     bitmapSpinner.setAdapter(adapterBitmap);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void createEffectNames()
+    {
+    EffectNames[] names = EffectNames.values();
+
+    int numVertex=0;
+
+    for(int i=0; i<names.length; i++)
+      if( names[i].getType() == EffectTypes.VERTEX ) numVertex++;
+
+    mEffectNames = new EffectNames[numVertex];
+
+    numVertex=0;
+
+    for(int i=0; i<names.length; i++)
+      if( names[i].getType() == EffectTypes.VERTEX )
+        {
+        mEffectNames[numVertex++] = names[i];
+        }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private void setGrid()
diff --git a/src/main/java/org/distorted/examples/vertex3d/Vertex3DEffect.java b/src/main/java/org/distorted/examples/vertex3d/Vertex3DEffect.java
index 20b886d..7d92d01 100644
--- a/src/main/java/org/distorted/examples/vertex3d/Vertex3DEffect.java
+++ b/src/main/java/org/distorted/examples/vertex3d/Vertex3DEffect.java
@@ -63,12 +63,105 @@ public class Vertex3DEffect implements SeekBar.OnSeekBarChangeListener
   private Static2D  mCenterSta;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
+// requires knowledge about effect nature
+
+  private int getDimension()
+    {
+    switch(mName)
+      {
+      case SWIRL  :
+      case SINK   : return 1;
+      case DISTORT:
+      case DEFORM : return 3;
+      }
+
+    return 0;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// requires knowledge about effect nature
+
+  public void apply(DistortedObject object)
+    {
+    switch(mName)
+      {
+      case DISTORT: object.distort(mDyn3, mCenterDyn, mRegionDyn); break;
+      case DEFORM : object.deform (mDyn3, mCenterDyn            ); break;
+      case SINK   : object.sink   (mDyn1, mCenterDyn, mRegionDyn); break;
+      case SWIRL  : object.swirl  (mDyn1, mCenterDyn, mRegionDyn); break;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// requires knowledge about effect nature
 
   public boolean supportsRegion()
     {
     return mName == EffectNames.DEFORM ? false : true;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// requires knowledge about effect nature
+
+  private void fillStatics()
+    {
+    switch(mName)
+      {
+      case DISTORT:
+      case DEFORM : float l = mAct.get().getWidth()/50.0f;
+                    float x = (mInter[0]-50)*l;
+                    float y = (mInter[1]-50)*l;
+                    float z = (mInter[2]-50)*l;
+                    mSta3.set(x,y,z);
+                    break;
+      case SINK   : mSta1.set(mInter[0] > 50 ? 50.0f/(100.01f-mInter[0]) : mInter[0] / 50.0f);
+                    break;
+      case SWIRL  : mSta1.set( 3.6f*(mInter[0]-50) );
+                    break;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// requires knowledge about effect nature
+
+  private void setDefaultInter()
+    {
+    switch(mName)
+      {
+      case DISTORT:
+      case DEFORM : mInter[0] = 50;
+                    mInter[1] = 50;
+                    mInter[2] = 50;
+                    break;
+      case SINK   :
+      case SWIRL  : mInter[0] = 50;
+                    break;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// requires knowledge about effect nature
+
+  private void setText()
+    {
+    String text = mName.name();
+
+    if( mName==EffectNames.DISTORT || mName==EffectNames.DEFORM)
+      {
+      int f1 = (int)mSta3.getX();
+      int f2 = (int)mSta3.getY();
+      int f3 = (int)mSta3.getZ();
+      text += " ("+f1+","+f2+","+f3+")";
+      }
+    else
+      {
+      float f1 = ((int)(mSta1.getX()*100))/100.0f;
+      text += " ("+f1+")";
+      }
+
+    mText.setText(text);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private void fillCenterStatics()
@@ -137,66 +230,6 @@ public class Vertex3DEffect implements SeekBar.OnSeekBarChangeListener
     mTextRegion.setText("region ("+f0+","+f1+","+f2+","+f3+")");
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void fillStatics()
-    {
-    switch(mName)
-      {
-      case DISTORT:
-      case DEFORM : Vertex3DActivity act = mAct.get();
-                    float l = act.getWidth()/50.0f;
-                    float x = (mInter[0]-50)*l;
-                    float y = (mInter[1]-50)*l;
-                    float z = (mInter[2]-50)*l;
-                    mSta3.set(x,y,z);
-                    break;
-      case SINK   : mSta1.set(mInter[0] > 50 ? 50.0f/(100.01f-mInter[0]) : mInter[0] / 50.0f);
-                    break;
-      case SWIRL  : mSta1.set( 3.6f*(mInter[0]-50) );
-                    break;
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void setDefaultInter()
-    {
-    switch(mName)
-      {
-      case DISTORT:
-      case DEFORM : mInter[0] = 50;
-                    mInter[1] = 50;
-                    mInter[2] = 50;
-                    break;
-      case SINK   :
-      case SWIRL  : mInter[0] = 50;
-                    break;
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void setText()
-    {
-    String text = mName.name();
-
-    if( mName==EffectNames.DISTORT || mName==EffectNames.DEFORM)
-      {
-      int f1 = (int)mSta3.getX();
-      int f2 = (int)mSta3.getY();
-      int f3 = (int)mSta3.getZ();
-      text += " ("+f1+","+f2+","+f3+")";
-      }
-    else
-      {
-      float f1 = ((int)(mSta1.getX()*100))/100.0f;
-      text += " ("+f1+")";
-      }
-
-    mText.setText(text);
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public Vertex3DEffect(EffectNames name, Vertex3DActivity act)
@@ -204,22 +237,26 @@ public class Vertex3DEffect implements SeekBar.OnSeekBarChangeListener
     mAct = new WeakReference<>(act);
     mName = name;
 
-    if( mName==EffectNames.SINK || mName==EffectNames.SWIRL )
+    mDimension = getDimension();
+
+    if( mDimension==1 )
       {
-      mDimension = 1;
       mDyn1 = new Dynamic1D();
       mSta1 = new Static1D(0);
       mDyn1.add(mSta1);
       mDyn3 = null;
       }
-    else
+    else if( mDimension==3 )
       {
-      mDimension = 3;
       mDyn3 = new Dynamic3D();
       mSta3 = new Static3D(0,0,0);
       mDyn3.add(mSta3);
       mDyn1 = null;
       }
+    else
+      {
+      throw new RuntimeException("unsupported effect");
+      }
 
     mInter = new int[mDimension];
     mSeekID= new int[mDimension];
@@ -348,7 +385,7 @@ public class Vertex3DEffect implements SeekBar.OnSeekBarChangeListener
     mSeekCenterID[0] = seek[0].getId();
     mSeekCenterID[1] = seek[1].getId();
 
-    mTextCenter    = (TextView)center.findViewById(R.id.effectCenterText);
+    mTextCenter = (TextView)center.findViewById(R.id.effectCenterText);
 
     setDefaultCenterInter();
 
@@ -363,19 +400,6 @@ public class Vertex3DEffect implements SeekBar.OnSeekBarChangeListener
     return center;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void apply(DistortedObject object)
-    {
-    switch(mName)
-      {
-      case DISTORT: object.distort(mDyn3, mCenterDyn, mRegionDyn); break;
-      case DEFORM : object.deform (mDyn3, mCenterDyn            ); break;
-      case SINK   : object.sink   (mDyn1, mCenterDyn, mRegionDyn); break;
-      case SWIRL  : object.swirl  (mDyn1, mCenterDyn, mRegionDyn); break;
-      }
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
