commit 75c7def33785e7f94722cf6e8aa05e1597ff01f5
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Wed Jul 6 17:39:42 2016 +0100

    Fragment3D close to done now!

diff --git a/src/main/java/org/distorted/examples/fragment3d/Fragment3DActivity.java b/src/main/java/org/distorted/examples/fragment3d/Fragment3DActivity.java
index f3bbbfe..248bec5 100644
--- a/src/main/java/org/distorted/examples/fragment3d/Fragment3DActivity.java
+++ b/src/main/java/org/distorted/examples/fragment3d/Fragment3DActivity.java
@@ -44,14 +44,14 @@ import org.distorted.library.EffectNames;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Dynamic4D;
 
 import java.util.ArrayList;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public class Fragment3DActivity extends Activity
-                                implements OnSeekBarChangeListener,
-                                           View.OnClickListener,
+                                implements View.OnClickListener,
                                            AdapterView.OnItemSelectedListener
   {
   private static final int COLOR_OFF = 0xffffe81f;
@@ -70,11 +70,6 @@ public class Fragment3DActivity extends Activity
   private int mObjectType;
   private int mBitmap;
 
-  // fields needed for the second 'apply fragment effects' screen
-  //
-  private TextView textCenter;
-  private int centerX, centerY;
-  private float fcenterX, fcenterY;
   private ArrayList<Fragment3DEffect> mEffects;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -282,23 +277,6 @@ public class Fragment3DActivity extends Activity
     final View view = getLayoutInflater().inflate(R.layout.fragment3dlayout, null);
 
     setContentView(view);
-
-    centerX = 50;
-    centerY = 50;
-
-    textCenter = (TextView)view.findViewById(R.id.fragment3dcenterText);
-    computeCenter();
-    setCenterText();
-
-    SeekBar bar;
-
-    bar = (SeekBar)view.findViewById(R.id.fragment3dcenterX);
-    bar.setOnSeekBarChangeListener(this);
-    bar.setProgress(centerX);
-
-    bar = (SeekBar)view.findViewById(R.id.fragment3dcenterY);
-    bar.setOnSeekBarChangeListener(this);
-    bar.setProgress(centerY);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -308,14 +286,17 @@ public class Fragment3DActivity extends Activity
     Fragment3DEffect chroma = new Fragment3DEffect(EffectNames.CHROMA);
     mEffects.add(chroma);
 
-    View view = chroma.createView(this);
     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);
+    mObject.chroma(dyn1, dyn3, regi, false);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -325,13 +306,16 @@ public class Fragment3DActivity extends Activity
     Fragment3DEffect alpha = new Fragment3DEffect(EffectNames.ALPHA);
     mEffects.add(alpha);
 
-    View view = alpha.createView(this);
     LinearLayout layout = (LinearLayout)findViewById(R.id.fragment3dlayout);
+    View view = alpha.createView(this);
     layout.addView(view);
+    View region = alpha.createRegion(this);
+    layout.addView(region);
 
     Dynamic1D dyn1 = alpha.getDyn1();
+    Dynamic4D regi = alpha.getRegion();
 
-    mObject.alpha(dyn1);
+    mObject.alpha(dyn1, regi, false);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -341,13 +325,16 @@ public class Fragment3DActivity extends Activity
     Fragment3DEffect brightness = new Fragment3DEffect(EffectNames.BRIGHTNESS);
     mEffects.add(brightness);
 
-    View view = brightness.createView(this);
     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);
+    mObject.brightness(dyn1, regi, false);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -357,13 +344,16 @@ public class Fragment3DActivity extends Activity
     Fragment3DEffect saturation = new Fragment3DEffect(EffectNames.SATURATION);
     mEffects.add(saturation);
 
-    View view = saturation.createView(this);
     LinearLayout layout = (LinearLayout)findViewById(R.id.fragment3dlayout);
+    View view = saturation.createView(this);
     layout.addView(view);
+    View region = saturation.createRegion(this);
+    layout.addView(region);
 
     Dynamic1D dyn1 = saturation.getDyn1();
+    Dynamic4D regi = saturation.getRegion();
 
-    mObject.saturation(dyn1);
+    mObject.saturation(dyn1, regi, false);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -376,42 +366,6 @@ public class Fragment3DActivity extends Activity
     mObject.abortEffects(EffectTypes.FRAGMENT);
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void computeCenter()
-    {
-    Fragment3DSurfaceView view = (Fragment3DSurfaceView)findViewById(R.id.fragment3dSurfaceView);
-
-    fcenterX = centerX;
-    fcenterY = centerY;
-
-    view.getRenderer().setCenter( fcenterX, fcenterY );
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void setCenterText()
-    {
-    fcenterX = ((int)(100*fcenterX))/100.0f;
-    fcenterY = ((int)(100*fcenterY))/100.0f;
-
-    textCenter.setText("center("+fcenterX+","+fcenterY+")");
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public float getCenterX()
-    {
-    return fcenterX;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public float getCenterY()
-    {
-    return fcenterY;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // Overrides
 
@@ -455,23 +409,5 @@ public class Fragment3DActivity extends Activity
     Distorted.onDestroy();
     super.onDestroy();
     }
-    
-///////////////////////////////////////////////////////////////////////////////////////////////////
-    
-  public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
-    {
-    switch (bar.getId())
-      {
-      case R.id.fragment3dcenterX: centerX    = progress; computeCenter()    ; setCenterText()    ; break;
-      case R.id.fragment3dcenterY: centerY    = progress; computeCenter()    ; setCenterText()    ; break;
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void onStartTrackingTouch(SeekBar bar) { }
-    
-///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void onStopTrackingTouch(SeekBar bar)  { }
   }
diff --git a/src/main/java/org/distorted/examples/fragment3d/Fragment3DEffect.java b/src/main/java/org/distorted/examples/fragment3d/Fragment3DEffect.java
index da8021d..daac631 100644
--- a/src/main/java/org/distorted/examples/fragment3d/Fragment3DEffect.java
+++ b/src/main/java/org/distorted/examples/fragment3d/Fragment3DEffect.java
@@ -29,8 +29,10 @@ import org.distorted.examples.R;
 import org.distorted.library.EffectNames;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Dynamic4D;
 import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
+import org.distorted.library.type.Static4D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -38,14 +40,51 @@ public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
   {
   private EffectNames mName;
   private int[] mInter;
-  private SeekBar[] mSeek;
+  private int[] mInterRegion;
+  private int[] mSeekID;
+  private int[] mSeekRegionID;
   private int mDimension;
   private TextView mText;
+  private TextView mTextRegion;
 
   private Dynamic1D mDyn1;
   private Dynamic3D mDyn3;
   private Static1D  mSta1;
   private Static3D  mSta3;
+  private Dynamic4D mRegionDyn;
+  private Static4D  mRegionSta;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void fillRegionStatics()
+    {
+    float factorX = 2.0f;
+    float factorY = 2.0f;
+
+    float  x = (mInterRegion[0]-50)*factorX;
+    float  y = (mInterRegion[1]-50)*factorY;
+    float rx = (mInterRegion[2]   )*factorX;
+    float ry = (mInterRegion[3]   )*factorY;
+
+    mRegionSta.set(x,y,rx,ry);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setDefaultRegionInter()
+    {
+    mInterRegion[0] = 50;
+    mInterRegion[1] = 50;
+    mInterRegion[2] = 50;
+    mInterRegion[3] = 50;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setRegionText()
+    {
+    mTextRegion.setText("region ("+mRegionSta.getX()+","+mRegionSta.getY()+","+mRegionSta.getZ()+","+mRegionSta.getW()+")");
+    }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -131,11 +170,17 @@ public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
       }
 
     mInter = new int[mDimension];
-    mSeek  = new SeekBar[mDimension];
+    mSeekID= new int[mDimension];
 
     mDyn1 = new Dynamic1D();
     mSta1 = new Static1D(0);
     mDyn1.add(mSta1);
+
+    mInterRegion = new int[4];
+    mSeekRegionID= new int[4];
+    mRegionDyn   = new Dynamic4D();
+    mRegionSta   = new Static4D(0,0,0,0);
+    mRegionDyn.add(mRegionSta);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -152,35 +197,53 @@ public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
     return mDyn3;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public Dynamic4D getRegion()
+    {
+    return mRegionDyn;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public View createView(Activity act)
     {
     View effect;
+    SeekBar[] seek = new SeekBar[mDimension];
 
     switch(mDimension)
       {
-      case 1 : effect   = act.getLayoutInflater().inflate(R.layout.effect1d, null);
-               mText    = (TextView)effect.findViewById(R.id.effect1dText);
-               mSeek[0] = (SeekBar)effect.findViewById(R.id.effect1dbar1);
+      case 1 : effect     = act.getLayoutInflater().inflate(R.layout.effect1d, null);
+               mText      = (TextView)effect.findViewById(R.id.effect1dText);
+               seek[0]    = (SeekBar)effect.findViewById(R.id.effect1dbar1);
+               mSeekID[0] = seek[0].getId();
                break;
-      case 2 : effect   = act.getLayoutInflater().inflate(R.layout.effect2d, null);
-               mText    = (TextView)effect.findViewById(R.id.effect2dText);
-               mSeek[0] = (SeekBar)effect.findViewById(R.id.effect2dbar1);
-               mSeek[1] = (SeekBar)effect.findViewById(R.id.effect2dbar2);
+      case 2 : effect     = act.getLayoutInflater().inflate(R.layout.effect2d, null);
+               mText      = (TextView)effect.findViewById(R.id.effect2dText);
+               seek[0]    = (SeekBar)effect.findViewById(R.id.effect2dbar1);
+               seek[1]    = (SeekBar)effect.findViewById(R.id.effect2dbar2);
+               mSeekID[0] = seek[0].getId();
+               mSeekID[1] = seek[1].getId();
                break;
-      case 3 : effect   = act.getLayoutInflater().inflate(R.layout.effect3d, null);
-               mText    = (TextView)effect.findViewById(R.id.effect3dText);
-               mSeek[0] = (SeekBar)effect.findViewById(R.id.effect3dbar1);
-               mSeek[1] = (SeekBar)effect.findViewById(R.id.effect3dbar2);
-               mSeek[2] = (SeekBar)effect.findViewById(R.id.effect3dbar3);
+      case 3 : effect     = act.getLayoutInflater().inflate(R.layout.effect3d, null);
+               mText      = (TextView)effect.findViewById(R.id.effect3dText);
+               seek[0]    = (SeekBar)effect.findViewById(R.id.effect3dbar1);
+               seek[1]    = (SeekBar)effect.findViewById(R.id.effect3dbar2);
+               seek[2]    = (SeekBar)effect.findViewById(R.id.effect3dbar3);
+               mSeekID[0] = seek[0].getId();
+               mSeekID[1] = seek[1].getId();
+               mSeekID[2] = seek[2].getId();
                break;
-      case 4 : effect   = act.getLayoutInflater().inflate(R.layout.effect4d, null);
-               mText    = (TextView)effect.findViewById(R.id.effect4dText);
-               mSeek[0] = (SeekBar)effect.findViewById(R.id.effect4dbar1);
-               mSeek[1] = (SeekBar)effect.findViewById(R.id.effect4dbar2);
-               mSeek[2] = (SeekBar)effect.findViewById(R.id.effect4dbar3);
-               mSeek[3] = (SeekBar)effect.findViewById(R.id.effect4dbar3);
+      case 4 : effect     = act.getLayoutInflater().inflate(R.layout.effect4d, null);
+               mText      = (TextView)effect.findViewById(R.id.effect4dText);
+               seek[0]    = (SeekBar)effect.findViewById(R.id.effect4dbar1);
+               seek[1]    = (SeekBar)effect.findViewById(R.id.effect4dbar2);
+               seek[2]    = (SeekBar)effect.findViewById(R.id.effect4dbar3);
+               seek[3]    = (SeekBar)effect.findViewById(R.id.effect4dbar4);
+               mSeekID[0] = seek[0].getId();
+               mSeekID[1] = seek[1].getId();
+               mSeekID[2] = seek[2].getId();
+               mSeekID[3] = seek[3].getId();
                break;
       default: android.util.Log.e("Fragment3DEffect", "dimension "+mDimension+" not supported!");
                return null;
@@ -192,24 +255,100 @@ public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
 
     for(int i=0; i<mDimension; i++)
       {
-      mSeek[i].setOnSeekBarChangeListener(this);
-      mSeek[i].setProgress( mInter[i] );
+      seek[i].setOnSeekBarChangeListener(this);
+      seek[i].setProgress( mInter[i] );
       }
 
     return effect;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public View createRegion(Activity act)
+    {
+    View region = act.getLayoutInflater().inflate(R.layout.effectregion, null);
+
+    SeekBar[] seek = new SeekBar[4];
+
+    seek[0] = (SeekBar)region.findViewById(R.id.effectRegionBarX );
+    seek[1] = (SeekBar)region.findViewById(R.id.effectRegionBarY );
+    seek[2] = (SeekBar)region.findViewById(R.id.effectRegionBarRX);
+    seek[3] = (SeekBar)region.findViewById(R.id.effectRegionBarRY);
+
+    mSeekRegionID[0] = seek[0].getId();
+    mSeekRegionID[1] = seek[1].getId();
+    mSeekRegionID[2] = seek[2].getId();
+    mSeekRegionID[3] = seek[3].getId();
+
+    mTextRegion    = (TextView)region.findViewById(R.id.effectRegionText);
+
+    setDefaultRegionInter();
+    fillRegionStatics();
+    setRegionText();
+
+    for(int i=0; i<4; i++)
+      {
+      seek[i].setOnSeekBarChangeListener(this);
+      seek[i].setProgress( mInterRegion[i] );
+      }
+
+    return region;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
     {
-    if ( mDimension>=1 && bar.getId()==mSeek[0].getId() ) mInter[0] = progress;
-    if ( mDimension>=2 && bar.getId()==mSeek[1].getId() ) mInter[1] = progress;
-    if ( mDimension>=3 && bar.getId()==mSeek[2].getId() ) mInter[2] = progress;
-    if ( mDimension>=4 && bar.getId()==mSeek[3].getId() ) mInter[3] = progress;
+    if ( mDimension>=1 && bar.getId()==mSeekID[0] )
+      {
+      mInter[0] = progress;
+      fillStatics();
+      setText();
+      }
+    if ( mDimension>=2 && bar.getId()==mSeekID[1] )
+      {
+      mInter[1] = progress;
+      fillStatics();
+      setText();
+      }
+    if ( mDimension>=3 && bar.getId()==mSeekID[2] )
+      {
+      mInter[2] = progress;
+      fillStatics();
+      setText();
+      }
+    if ( mDimension>=4 && bar.getId()==mSeekID[3] )
+      {
+      mInter[3] = progress;
+      fillStatics();
+      setText();
+      }
+
+    if( bar.getId() == mSeekRegionID[0] )
+      {
+      mInterRegion[0] = progress;
+      fillRegionStatics();
+      setRegionText();
+      }
+    if( bar.getId() == mSeekRegionID[1] )
+      {
+      mInterRegion[1] = progress;
+      fillRegionStatics();
+      setRegionText();
+      }
+    if( bar.getId() == mSeekRegionID[2] )
+      {
+      mInterRegion[2] = progress;
+      fillRegionStatics();
+      setRegionText();
+      }
+    if( bar.getId() == mSeekRegionID[3] )
+      {
+      mInterRegion[3] = progress;
+      fillRegionStatics();
+      setRegionText();
+      }
 
-    fillStatics();
-    setText();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/fragment3d/Fragment3DRenderer.java b/src/main/java/org/distorted/examples/fragment3d/Fragment3DRenderer.java
index 82db5f0..7e18d8c 100644
--- a/src/main/java/org/distorted/examples/fragment3d/Fragment3DRenderer.java
+++ b/src/main/java/org/distorted/examples/fragment3d/Fragment3DRenderer.java
@@ -54,30 +54,16 @@ class Fragment3DRenderer implements GLSurfaceView.Renderer
 
     private GLSurfaceView mView;
     private DistortedObject mObject;
-    private DistortedBitmap mCenter;
     private DistortedBitmap mBackground;
-    private float mFactorCen, mFactorObj;
+    private float mFactorObj;
 
     private int mObjWidth, mObjHeight;
 
     private DynamicQuat mQuatInt1, mQuatInt2;
 
-    private Dynamic3D mMoveInter;
-    private Static3D mMovePoint;
-
     Static4D mQuat1, mQuat2;
     int mScreenMin;
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    public void setCenter(float x, float y)
-      {
-      x = (0.012f*x-0.1f)*mObjWidth;
-      y = (0.012f*y-0.1f)*mObjHeight;
-
-      mMovePoint.set(mFactorObj*x,mFactorObj*y,0);
-      }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public Fragment3DRenderer(GLSurfaceView v)
@@ -85,16 +71,11 @@ class Fragment3DRenderer implements GLSurfaceView.Renderer
       mView = v;
 
       mObject     = ((Fragment3DActivity)v.getContext()).getObject();
-      mCenter     = new DistortedBitmap(SIZE, SIZE, 1);
       mBackground = new DistortedBitmap(SIZE, SIZE, 1);
 
       mObjWidth = mObject.getWidth();
       mObjHeight= mObject.getHeight();
 
-      mMovePoint= new Static3D(0,0,0);
-      mMoveInter= new Dynamic3D();
-      mMoveInter.add(mMovePoint);
-
       mQuat1 = new Static4D(0,0,0,1);  // unity
       mQuat2 = new Static4D(0,0,0,1);  // quaternions
 
@@ -116,7 +97,6 @@ class Fragment3DRenderer implements GLSurfaceView.Renderer
 
       mBackground.draw(time);
       mObject.draw(time);
-      mCenter.draw(time);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -126,31 +106,17 @@ class Fragment3DRenderer implements GLSurfaceView.Renderer
       mScreenMin = width<height ? width:height;
 
       mObject.abortEffects(EffectTypes.MATRIX);
-      mCenter.abortEffects(EffectTypes.MATRIX);
       mBackground.abortEffects(EffectTypes.MATRIX);
 
-      int centerSize = mCenter.getWidth();
-
       if( width*mObjHeight > height*mObjWidth ) // screen is more 'horizontal' than the Object
         {
         mFactorObj = (0.70f*height)/mObjHeight;
-        mFactorCen = (0.15f*height)/centerSize;
         }
       else
         {
         mFactorObj = (0.70f*width)/mObjWidth;
-        mFactorCen = (0.15f*width)/centerSize;
         }
 
-      Fragment3DActivity act = (Fragment3DActivity)mView.getContext();
-      float cX = act.getCenterX();
-      float cY = act.getCenterY();
-
-      cX = (0.012f*cX-0.1f)*mObjWidth;
-      cY = (0.012f*cY-0.1f)*mObjHeight;
-
-      mMovePoint.set(cX*mFactorObj,cY*mFactorObj,0);
-
       Static3D rotateObj = new Static3D(mObjWidth/2,mObjHeight/2, 0);
 
       mObject.move( new Static3D( (width-mFactorObj*mObjWidth)/2 , (height-mFactorObj*mObjHeight)/2 , 0) );
@@ -158,15 +124,6 @@ class Fragment3DRenderer implements GLSurfaceView.Renderer
       mObject.quaternion(mQuatInt1, rotateObj);
       mObject.quaternion(mQuatInt2, rotateObj);
 
-      Static3D rotateCen = new Static3D(width/2,height/2, 0);
-
-      mCenter.quaternion(mQuatInt1, rotateCen);
-      mCenter.quaternion(mQuatInt2, rotateCen);
-      mCenter.move( new Static3D( (width -mFactorCen*centerSize-mFactorObj*mObjWidth )/2 ,
-                                  (height-mFactorCen*centerSize-mFactorObj*mObjHeight)/2 , 10) );
-      mCenter.move(mMoveInter);
-      mCenter.scale(mFactorCen);
-
       int backgroundSize = mBackground.getWidth();
       float factorBackX = ((float)width)/backgroundSize;
       float factorBackY = ((float)height)/backgroundSize;
@@ -184,16 +141,14 @@ class Fragment3DRenderer implements GLSurfaceView.Renderer
       Fragment3DActivity act = (Fragment3DActivity)mView.getContext();
 
       InputStream is1 = act.getResources().openRawResource(act.getBitmap());
-      InputStream is2 = act.getResources().openRawResource(R.raw.center);
-      InputStream is3 = act.getResources().openRawResource(R.raw.water);
+      InputStream is2 = act.getResources().openRawResource(R.raw.water);
 
-      Bitmap bitmap1,bitmap2,bitmap3;
+      Bitmap bitmap1,bitmap2;
         
       try 
         {
         bitmap1 = BitmapFactory.decodeStream(is1);
         bitmap2 = BitmapFactory.decodeStream(is2);
-        bitmap3 = BitmapFactory.decodeStream(is3);
         }
       finally 
         {
@@ -201,14 +156,12 @@ class Fragment3DRenderer implements GLSurfaceView.Renderer
           {
           is1.close();
           is2.close();
-          is3.close();
           } 
         catch(IOException e) { }
         }  
       
       mObject.setBitmap(bitmap1);
-      mCenter.setBitmap(bitmap2);
-      mBackground.setBitmap(bitmap3)
+      mBackground.setBitmap(bitmap2)
       ;
       try
         {
diff --git a/src/main/res/layout/effect1d.xml b/src/main/res/layout/effect1d.xml
index 2914fac..11a49df 100644
--- a/src/main/res/layout/effect1d.xml
+++ b/src/main/res/layout/effect1d.xml
@@ -24,7 +24,7 @@
 
 
         <View
-            android:layout_height="3dip"
+            android:layout_height="1dip"
             android:background="#777777"
             android:layout_width="match_parent"
             />
diff --git a/src/main/res/layout/effect2d.xml b/src/main/res/layout/effect2d.xml
index 864dd38..2ac5f33 100644
--- a/src/main/res/layout/effect2d.xml
+++ b/src/main/res/layout/effect2d.xml
@@ -31,7 +31,7 @@
             android:layout_marginRight="5dp" />
 
         <View
-            android:layout_height="3dip"
+            android:layout_height="1dip"
             android:background="#777777"
             android:layout_width="match_parent"
             />
diff --git a/src/main/res/layout/effect3d.xml b/src/main/res/layout/effect3d.xml
index c736600..d5c17cc 100644
--- a/src/main/res/layout/effect3d.xml
+++ b/src/main/res/layout/effect3d.xml
@@ -38,7 +38,7 @@
             android:layout_marginRight="5dp" />
 
         <View
-            android:layout_height="3dip"
+            android:layout_height="1dip"
             android:background="#777777"
             android:layout_width="match_parent"
             />
diff --git a/src/main/res/layout/effect4d.xml b/src/main/res/layout/effect4d.xml
index 13fd98b..3e24333 100644
--- a/src/main/res/layout/effect4d.xml
+++ b/src/main/res/layout/effect4d.xml
@@ -46,7 +46,7 @@
             android:layout_marginRight="5dp" />
 
         <View
-            android:layout_height="3dip"
+            android:layout_height="1dip"
             android:background="#777777"
             android:layout_width="match_parent"
             />
diff --git a/src/main/res/layout/effectregion.xml b/src/main/res/layout/effectregion.xml
new file mode 100644
index 0000000..5bf9d71
--- /dev/null
+++ b/src/main/res/layout/effectregion.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:id="@+id/effectRegionLayout"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/effectRegionText"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="5dp"
+        android:layout_marginStart="5dp"
+        android:layout_marginTop="3dp"
+        />
+
+    <LinearLayout
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <SeekBar
+            android:id="@+id/effectRegionBarX"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="5dp"
+            android:layout_marginLeft="5dp"
+            android:layout_marginRight="5dp"
+            android:layout_weight="0.5"/>
+
+        <SeekBar
+            android:id="@+id/effectRegionBarY"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="5dp"
+            android:layout_marginLeft="5dp"
+            android:layout_marginRight="5dp"
+            android:layout_weight="0.5"/>
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <SeekBar
+            android:id="@+id/effectRegionBarRX"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="5dp"
+            android:layout_marginLeft="5dp"
+            android:layout_marginRight="5dp"
+            android:layout_weight="0.5"/>
+
+        <SeekBar
+            android:id="@+id/effectRegionBarRY"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="5dp"
+            android:layout_marginLeft="5dp"
+            android:layout_marginRight="5dp"
+            android:layout_weight="0.5"/>
+
+    </LinearLayout>
+
+
+    <View
+        android:layout_height="3dip"
+        android:background="#777777"
+        android:layout_width="match_parent"
+        />
+
+</LinearLayout>
diff --git a/src/main/res/layout/fragment3dlayout.xml b/src/main/res/layout/fragment3dlayout.xml
index d73e6b0..5a36f36 100644
--- a/src/main/res/layout/fragment3dlayout.xml
+++ b/src/main/res/layout/fragment3dlayout.xml
@@ -53,46 +53,6 @@
             android:onClick="newSaturation"/>
     </LinearLayout>
 
-    <LinearLayout
-        android:orientation="vertical"
-        android:layout_width="fill_parent"
-        android:layout_height="50dp"
-        >
-
-        <TextView
-            android:id="@+id/fragment3dcenterText"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="5dp"
-            android:layout_marginStart="5dp"
-            android:layout_marginTop="3dp"
-            />
-
-        <LinearLayout
-            android:orientation="horizontal"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            >
-
-            <SeekBar
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:id="@+id/fragment3dcenterX"
-                android:layout_weight="0.5"
-                android:paddingLeft="5dp"
-                android:paddingRight="3dp"/>
-
-            <SeekBar
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:id="@+id/fragment3dcenterY"
-                android:layout_weight="0.5"
-                android:paddingLeft="3dp"
-                android:paddingRight="5dp"/>
-        </LinearLayout>
-
-    </LinearLayout>
-
     <View
         android:layout_height="4dip"
         android:background="#777777"
