commit 65270124b47c57152d372f2157ba64e2c4c9f1a1
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Wed Jul 6 23:36:06 2016 +0100

    Fragment3D should be pretty much finished.

diff --git a/src/main/java/org/distorted/examples/fragment3d/Fragment3DActivity.java b/src/main/java/org/distorted/examples/fragment3d/Fragment3DActivity.java
index 248bec5..4bd85df 100644
--- a/src/main/java/org/distorted/examples/fragment3d/Fragment3DActivity.java
+++ b/src/main/java/org/distorted/examples/fragment3d/Fragment3DActivity.java
@@ -29,11 +29,8 @@ import android.widget.ArrayAdapter;
 import android.widget.Button;
 import android.widget.LinearLayout;
 import android.widget.NumberPicker;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
 import android.widget.Spinner;
 import android.widget.TableRow;
-import android.widget.TextView;
 
 import org.distorted.examples.R;
 import org.distorted.library.Distorted;
@@ -64,13 +61,13 @@ public class Fragment3DActivity extends Activity
   private int mNumCols = 3;
   private int mNumRows = 3;
   private NumberPicker mColsPicker, mRowsPicker;
-  private LinearLayout mLay;
   private boolean[] mShape;
   private DistortedObject mObject;
   private int mObjectType;
   private int mBitmap;
 
   private ArrayList<Fragment3DEffect> mEffects;
+  private int mEffectAdd;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
@@ -136,16 +133,16 @@ public class Fragment3DActivity extends Activity
 
   private void setGrid()
     {
-    mLay = (LinearLayout)findViewById(R.id.objectpicker_buttongrid);
+    LinearLayout lay = (LinearLayout)findViewById(R.id.objectpicker_buttongrid);
 
-    int width = mLay.getWidth();
-    int height= mLay.getHeight();
+    int width = lay.getWidth();
+    int height= lay.getHeight();
     int w = mNumCols>0 ? (width / mNumCols) -10 : 0;
     int h = mNumRows>0 ? (height/ mNumRows) -10 : 0;
     int size= w<h ? w:h;
     int pad = size/20;
 
-    mLay.removeAllViews();
+    lay.removeAllViews();
 
     mShape = new boolean[mNumRows*mNumCols];
 
@@ -174,7 +171,7 @@ public class Fragment3DActivity extends Activity
         mShape[rows*mNumCols+cols] = true;
         }
 
-      mLay.addView(tr);
+      lay.addView(tr);
       }
     }
 
@@ -251,7 +248,8 @@ public class Fragment3DActivity extends Activity
     {
     switch(parent.getId())
       {
-      case R.id.objectpicker_spinnerType  : mObjectType = pos; break;
+      case R.id.objectpicker_spinnerType  : mObjectType = pos;
+                                            break;
       case R.id.objectpicker_spinnerBitmap: switch(pos)
                                               {
                                               case 0: mBitmap = R.raw.face; break;
@@ -260,6 +258,8 @@ public class Fragment3DActivity extends Activity
                                               case 3: mBitmap = R.raw.grid; break;
                                               }
                                             break;
+      case R.id.fragment3dspinner         : mEffectAdd = pos;
+                                            break;
       }
     }
 
@@ -270,90 +270,75 @@ public class Fragment3DActivity extends Activity
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// 'second screen' methods
 
-  private void setFragmentView()
+  public int getWidth()
     {
-    final View view = getLayoutInflater().inflate(R.layout.fragment3dlayout, null);
-
-    setContentView(view);
+    return mObject==null ? 0: mObject.getWidth();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void newChroma(View v)
+  public int getHeight()
     {
-    Fragment3DEffect chroma = new Fragment3DEffect(EffectNames.CHROMA);
-    mEffects.add(chroma);
-
-    LinearLayout layout = (LinearLayout)findViewById(R.id.fragment3dlayout);
-    View view = chroma.createView(this);
-    layout.addView(view);
-    View region = chroma.createRegion(this);
-    layout.addView(region);
-
-    Dynamic1D dyn1 = chroma.getDyn1();
-    Dynamic3D dyn3 = chroma.getDyn3();
-    Dynamic4D regi = chroma.getRegion();
-
-    mObject.chroma(dyn1, dyn3, regi, false);
+    return mObject==null ? 0: mObject.getHeight();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
+// 'second screen' methods
 
-  public void newAlpha(View v)
+  private void setFragmentView()
     {
-    Fragment3DEffect alpha = new Fragment3DEffect(EffectNames.ALPHA);
-    mEffects.add(alpha);
-
-    LinearLayout layout = (LinearLayout)findViewById(R.id.fragment3dlayout);
-    View view = alpha.createView(this);
-    layout.addView(view);
-    View region = alpha.createRegion(this);
-    layout.addView(region);
+    final View view = getLayoutInflater().inflate(R.layout.fragment3dlayout, null);
 
-    Dynamic1D dyn1 = alpha.getDyn1();
-    Dynamic4D regi = alpha.getRegion();
+    setContentView(view);
 
-    mObject.alpha(dyn1, regi, false);
-    }
+    String[] effects = new String[] {"CHROMA", "ALPHA", "BRIGHTNESS", "SATURATION"};
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
+    Spinner effectSpinner = (Spinner)findViewById(R.id.fragment3dspinner );
+    effectSpinner.setOnItemSelectedListener(this);
 
-  public void newBrightness(View v)
-    {
-    Fragment3DEffect brightness = new Fragment3DEffect(EffectNames.BRIGHTNESS);
-    mEffects.add(brightness);
+    ArrayAdapter<String> adapterEffect = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, effects);
+    adapterEffect.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+    effectSpinner.setAdapter(adapterEffect);
 
-    LinearLayout layout = (LinearLayout)findViewById(R.id.fragment3dlayout);
-    View view = brightness.createView(this);
-    layout.addView(view);
-    View region = brightness.createRegion(this);
-    layout.addView(region);
-
-    Dynamic1D dyn1 = brightness.getDyn1();
-    Dynamic4D regi = brightness.getRegion();
-
-    mObject.brightness(dyn1, regi, false);
+    mEffectAdd = 0;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void newSaturation(View v)
+  public void newEffect(View v)
     {
-    Fragment3DEffect saturation = new Fragment3DEffect(EffectNames.SATURATION);
-    mEffects.add(saturation);
+    EffectNames name;
+
+    switch(mEffectAdd)
+      {
+      case 0 : name = EffectNames.CHROMA    ; break;
+      case 1 : name = EffectNames.ALPHA     ; break;
+      case 2 : name = EffectNames.BRIGHTNESS; break;
+      case 3 : name = EffectNames.SATURATION; break;
+      default: return;
+      }
+
+    Fragment3DEffect eff = new Fragment3DEffect(name, this);
+    mEffects.add(eff);
 
     LinearLayout layout = (LinearLayout)findViewById(R.id.fragment3dlayout);
-    View view = saturation.createView(this);
+    View view = eff.createView();
     layout.addView(view);
-    View region = saturation.createRegion(this);
+    View region = eff.createRegion();
     layout.addView(region);
 
-    Dynamic1D dyn1 = saturation.getDyn1();
-    Dynamic4D regi = saturation.getRegion();
+    Dynamic1D dyn1 = eff.getDyn1();
+    Dynamic3D dyn3 = eff.getDyn3();
+    Dynamic4D regi = eff.getRegion();
 
-    mObject.saturation(dyn1, regi, false);
+    switch(mEffectAdd)
+      {
+      case 0: mObject.chroma    (dyn1, dyn3, regi, false); break;
+      case 1: mObject.alpha     (dyn1,       regi, false); break;
+      case 2: mObject.brightness(dyn1,       regi, false); break;
+      case 3: mObject.saturation(dyn1,       regi, false); break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/fragment3d/Fragment3DEffect.java b/src/main/java/org/distorted/examples/fragment3d/Fragment3DEffect.java
index daac631..4abb065 100644
--- a/src/main/java/org/distorted/examples/fragment3d/Fragment3DEffect.java
+++ b/src/main/java/org/distorted/examples/fragment3d/Fragment3DEffect.java
@@ -19,9 +19,7 @@
 
 package org.distorted.examples.fragment3d;
 
-import android.app.Activity;
 import android.view.View;
-import android.widget.LinearLayout;
 import android.widget.SeekBar;
 import android.widget.TextView;
 
@@ -34,10 +32,14 @@ import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 
+import java.lang.ref.WeakReference;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
   {
+  private WeakReference<Fragment3DActivity> mAct;
+
   private EffectNames mName;
   private int[] mInter;
   private int[] mInterRegion;
@@ -58,13 +60,15 @@ public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
 
   private void fillRegionStatics()
     {
-    float factorX = 2.0f;
-    float factorY = 2.0f;
+    Fragment3DActivity act = mAct.get();
+
+    float factorX = act.getWidth() / 100.0f;
+    float factorY = act.getHeight()/ 100.0f;
 
-    float  x = (mInterRegion[0]-50)*factorX;
-    float  y = (mInterRegion[1]-50)*factorY;
-    float rx = (mInterRegion[2]   )*factorX;
-    float ry = (mInterRegion[3]   )*factorY;
+    float  x = mInterRegion[0]*factorX;
+    float  y = mInterRegion[1]*factorY;
+    float rx = mInterRegion[2]*factorX;
+    float ry = mInterRegion[3]*factorY;
 
     mRegionSta.set(x,y,rx,ry);
     }
@@ -83,7 +87,12 @@ public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
 
   private void setRegionText()
     {
-    mTextRegion.setText("region ("+mRegionSta.getX()+","+mRegionSta.getY()+","+mRegionSta.getZ()+","+mRegionSta.getW()+")");
+    float f0 = ((int)(mRegionSta.getX()*100))/100.0f;
+    float f1 = ((int)(mRegionSta.getY()*100))/100.0f;
+    float f2 = ((int)(mRegionSta.getZ()*100))/100.0f;
+    float f3 = ((int)(mRegionSta.getW()*100))/100.0f;
+
+    mTextRegion.setText("region ("+f0+","+f1+","+f2+","+f3+")");
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -99,12 +108,10 @@ public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
                        break;
       case ALPHA     : mSta1.set(mInter[0]/100.0f);
                        break;
-      case SATURATION: mSta1.set(mInter[0]/100.0f);
-                       break;
-      case CONTRAST  : mSta1.set(mInter[0]/100.0f);
-                       break;
       case BRIGHTNESS: mSta1.set(mInter[0]/100.0f);
                        break;
+      case SATURATION: mSta1.set(mInter[0]/100.0f);
+                       break;
       }
     }
 
@@ -121,12 +128,10 @@ public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
                        break;
       case ALPHA     : mInter[0] = 100;
                        break;
-      case SATURATION: mInter[0] = 100;
-                       break;
-      case CONTRAST  : mInter[0] = 100;
-                       break;
       case BRIGHTNESS: mInter[0] = 100;
                        break;
+      case SATURATION: mInter[0] = 100;
+                       break;
       }
     }
 
@@ -134,25 +139,29 @@ public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
 
   private void setText()
     {
+    float f1 = ((int)mSta1.getX()*100)/100.0f;
+
     switch(mName)
       {
-      case CHROMA    : mText.setText("chroma "+mSta1.getX()+"("+mSta3.getX()+","+mSta3.getY()+","+mSta3.getZ()+")");
-                       break;
-      case ALPHA     : mText.setText("alpha ("+mSta1.getX()+")");
+      case CHROMA    : float f2 = ((int)mSta3.getX()*100)/100.0f;
+                       float f3 = ((int)mSta3.getY()*100)/100.0f;
+                       float f4 = ((int)mSta3.getZ()*100)/100.0f;
+                       mText.setText("chroma "+f1+"("+f2+","+f3+","+f4+")");
                        break;
-      case SATURATION: mText.setText("saturation ("+mSta1.getX()+")");
+      case ALPHA     : mText.setText("alpha ("+f1+")");
                        break;
-      case CONTRAST  : mText.setText("contrast ("+mSta1.getX()+")");
+      case BRIGHTNESS: mText.setText("brightness ("+f1+")");
                        break;
-      case BRIGHTNESS: mText.setText("brightness ("+mSta1.getX()+")");
+      case SATURATION: mText.setText("saturation ("+f1+")");
                        break;
       }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public Fragment3DEffect(EffectNames name)
+  public Fragment3DEffect(EffectNames name, Fragment3DActivity act)
     {
+    mAct = new WeakReference<>(act);
     mName = name;
 
     if( mName==EffectNames.CHROMA )
@@ -206,11 +215,13 @@ public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public View createView(Activity act)
+  public View createView()
     {
     View effect;
     SeekBar[] seek = new SeekBar[mDimension];
 
+    Fragment3DActivity act = mAct.get();
+
     switch(mDimension)
       {
       case 1 : effect     = act.getLayoutInflater().inflate(R.layout.effect1d, null);
@@ -264,8 +275,10 @@ public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public View createRegion(Activity act)
+  public View createRegion()
     {
+    Fragment3DActivity act = mAct.get();
+
     View region = act.getLayoutInflater().inflate(R.layout.effectregion, null);
 
     SeekBar[] seek = new SeekBar[4];
diff --git a/src/main/java/org/distorted/examples/fragment3d/Fragment3DRenderer.java b/src/main/java/org/distorted/examples/fragment3d/Fragment3DRenderer.java
index 7e18d8c..07cbfcb 100644
--- a/src/main/java/org/distorted/examples/fragment3d/Fragment3DRenderer.java
+++ b/src/main/java/org/distorted/examples/fragment3d/Fragment3DRenderer.java
@@ -27,16 +27,9 @@ import android.opengl.GLSurfaceView;
 import org.distorted.examples.R;
 import org.distorted.library.Distorted;
 import org.distorted.library.DistortedBitmap;
-import org.distorted.library.DistortedCubes;
 import org.distorted.library.DistortedObject;
-import org.distorted.library.EffectNames;
 import org.distorted.library.EffectTypes;
-import org.distorted.library.type.Dynamic1D;
-import org.distorted.library.type.Dynamic2D;
-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;
 
@@ -50,17 +43,11 @@ import javax.microedition.khronos.opengles.GL10;
 
 class Fragment3DRenderer implements GLSurfaceView.Renderer
 {
-    private static final int SIZE = 100;
-
     private GLSurfaceView mView;
     private DistortedObject mObject;
     private DistortedBitmap mBackground;
-    private float mFactorObj;
-
     private int mObjWidth, mObjHeight;
-
     private DynamicQuat mQuatInt1, mQuatInt2;
-
     Static4D mQuat1, mQuat2;
     int mScreenMin;
 
@@ -71,7 +58,7 @@ class Fragment3DRenderer implements GLSurfaceView.Renderer
       mView = v;
 
       mObject     = ((Fragment3DActivity)v.getContext()).getObject();
-      mBackground = new DistortedBitmap(SIZE, SIZE, 1);
+      mBackground = new DistortedBitmap(100, 100, 1);
 
       mObjWidth = mObject.getWidth();
       mObjHeight= mObject.getHeight();
@@ -107,20 +94,21 @@ class Fragment3DRenderer implements GLSurfaceView.Renderer
 
       mObject.abortEffects(EffectTypes.MATRIX);
       mBackground.abortEffects(EffectTypes.MATRIX);
+      float factorObj;
 
       if( width*mObjHeight > height*mObjWidth ) // screen is more 'horizontal' than the Object
         {
-        mFactorObj = (0.70f*height)/mObjHeight;
+        factorObj = (0.80f*height)/mObjHeight;
         }
       else
         {
-        mFactorObj = (0.70f*width)/mObjWidth;
+        factorObj = (0.80f*width)/mObjWidth;
         }
 
       Static3D rotateObj = new Static3D(mObjWidth/2,mObjHeight/2, 0);
 
-      mObject.move( new Static3D( (width-mFactorObj*mObjWidth)/2 , (height-mFactorObj*mObjHeight)/2 , 0) );
-      mObject.scale(mFactorObj);
+      mObject.move( new Static3D( (width-factorObj*mObjWidth)/2 , (height-factorObj*mObjHeight)/2 , 0) );
+      mObject.scale(factorObj);
       mObject.quaternion(mQuatInt1, rotateObj);
       mObject.quaternion(mQuatInt2, rotateObj);
 
@@ -128,7 +116,7 @@ class Fragment3DRenderer implements GLSurfaceView.Renderer
       float factorBackX = ((float)width)/backgroundSize;
       float factorBackY = ((float)height)/backgroundSize;
 
-      mBackground.move(new Static3D( -width/2, -height/2,-mFactorObj*(mObjWidth+mObjHeight)/2) );
+      mBackground.move(new Static3D( -width/2, -height/2,-factorObj*(mObjWidth+mObjHeight)/2) );
       mBackground.scale(new Static3D(2*factorBackX, 2*factorBackY, 1.0f) );
 
       Distorted.onSurfaceChanged(width, height); 
diff --git a/src/main/res/layout/effect1d.xml b/src/main/res/layout/effect1d.xml
index 11a49df..68bf791 100644
--- a/src/main/res/layout/effect1d.xml
+++ b/src/main/res/layout/effect1d.xml
@@ -22,11 +22,4 @@
             android:layout_marginLeft="5dp"
             android:layout_marginRight="5dp" />
 
-
-        <View
-            android:layout_height="1dip"
-            android:background="#777777"
-            android:layout_width="match_parent"
-            />
-
 </LinearLayout>
diff --git a/src/main/res/layout/effect2d.xml b/src/main/res/layout/effect2d.xml
index 2ac5f33..5d5730b 100644
--- a/src/main/res/layout/effect2d.xml
+++ b/src/main/res/layout/effect2d.xml
@@ -30,10 +30,4 @@
             android:layout_marginLeft="5dp"
             android:layout_marginRight="5dp" />
 
-        <View
-            android:layout_height="1dip"
-            android:background="#777777"
-            android:layout_width="match_parent"
-            />
-
 </LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/layout/effect3d.xml b/src/main/res/layout/effect3d.xml
index d5c17cc..eb67df5 100644
--- a/src/main/res/layout/effect3d.xml
+++ b/src/main/res/layout/effect3d.xml
@@ -37,10 +37,4 @@
             android:layout_marginLeft="5dp"
             android:layout_marginRight="5dp" />
 
-        <View
-            android:layout_height="1dip"
-            android:background="#777777"
-            android:layout_width="match_parent"
-            />
-
 </LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/layout/effect4d.xml b/src/main/res/layout/effect4d.xml
index 3e24333..38cdb2f 100644
--- a/src/main/res/layout/effect4d.xml
+++ b/src/main/res/layout/effect4d.xml
@@ -45,10 +45,4 @@
             android:layout_marginLeft="5dp"
             android:layout_marginRight="5dp" />
 
-        <View
-            android:layout_height="1dip"
-            android:background="#777777"
-            android:layout_width="match_parent"
-            />
-
 </LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/layout/fragment3dlayout.xml b/src/main/res/layout/fragment3dlayout.xml
index 5a36f36..f9787f6 100644
--- a/src/main/res/layout/fragment3dlayout.xml
+++ b/src/main/res/layout/fragment3dlayout.xml
@@ -19,38 +19,32 @@
         <Button
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="@string/reset"
-            android:id="@+id/buttonRemove"
-            android:onClick="removeAll"
+            android:text="@string/Add"
+            android:id="@+id/buttonAdd"
+            android:onClick="newEffect"
             />
 
-        <Button
+        <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="@string/chroma"
-            android:id="@+id/buttonChroma"
-            android:onClick="newChroma"/>
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:text="@string/New"
+            android:id="@+id/textView10"/>
 
-        <Button
+        <Spinner
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="@string/alpha"
-            android:id="@+id/buttonAlpha"
-            android:onClick="newAlpha"/>
+            android:id="@+id/fragment3dspinner"
+            android:layout_weight="0.5"/>
 
         <Button
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="@string/brightness"
-            android:id="@+id/buttonBrightness"
-            android:onClick="newBrightness"/>
+            android:text="@string/RemoveAll"
+            android:id="@+id/buttonRemove"
+            android:onClick="removeAll"
+            />
 
-        <Button
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="@string/saturation"
-            android:id="@+id/buttonSaturation"
-            android:onClick="newSaturation"/>
     </LinearLayout>
 
     <View
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 7ef67b1..ba7b4f9 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -13,6 +13,7 @@
     <string name="brightness">Brightness</string>
     <string name="saturation">Saturation</string>
     <string name="contrast">Contrast</string>
+    <string name="swirl">Swirl</string>
 
     <string name="continu">Continue</string>
     <string name="rows">Rows</string>
@@ -30,7 +31,6 @@
     <string name="type">effects by type</string>
     <string name="id">effects by ID</string>
     <string name="list">List of all existing effects</string>
-    <string name="swirl">Swirl</string>
     <string name="print">Print</string>
     <string name="abort">Abort</string>
     <string name="count">Count</string>
@@ -49,8 +49,11 @@
     <string name="Up">Up</string>
     <string name="Default">Default</string>
     <string name="save">Save</string>
+    <string name="New">new</string>
     <string name="Create">Create</string>
     <string name="Bitmap">Bitmap</string>
+    <string name="Add">Add</string>
+    <string name="RemoveAll">Remove All</string>
 
     <string name="example_monalisa">Mona Lisa</string>  
     <string name="example_monalisa_subtitle">The basics of Distortions.</string>
