commit 3e673c74ddce74d6dfa110b09f1fd34ff75449b8
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Thu Mar 30 14:49:41 2017 +0100

    Enrich the Multiblur app.

diff --git a/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java b/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java
index a745926..b6f8534 100644
--- a/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java
+++ b/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java
@@ -20,23 +20,28 @@
 package org.distorted.examples.multiblur;
 
 import android.app.Activity;
+import android.opengl.GLSurfaceView;
 import android.os.Bundle;
+import android.widget.SeekBar;
+
+import org.distorted.examples.R;
 import org.distorted.library.Distorted;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class MultiblurActivity extends Activity
+public class MultiblurActivity extends Activity implements SeekBar.OnSeekBarChangeListener
 {
-    private MultiblurSurfaceView mView;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     @Override
     protected void onCreate(Bundle savedState) 
       {
       super.onCreate(savedState);
-      mView = new MultiblurSurfaceView(this);
-      setContentView(mView);
+      setContentView(R.layout.multiblurlayout);
+
+      SeekBar bar = (SeekBar)findViewById(R.id.multiblurSeek);
+      bar.setOnSeekBarChangeListener(this);
+      bar.setProgress(50);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -44,7 +49,8 @@ public class MultiblurActivity extends Activity
     @Override
     protected void onPause() 
       {
-      mView.onPause();
+      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.multiblurSurfaceView);
+      view.onPause();
       super.onPause();
       }
 
@@ -54,7 +60,8 @@ public class MultiblurActivity extends Activity
     protected void onResume() 
       {
       super.onResume();
-      mView.onResume();
+      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.multiblurSurfaceView);
+      view.onResume();
       }
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -65,4 +72,26 @@ public class MultiblurActivity extends Activity
       Distorted.onDestroy();  
       super.onDestroy();
       }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
+      {
+      switch (bar.getId())
+        {
+        case R.id.multiblurSeek: MultiblurSurfaceView view = (MultiblurSurfaceView) this.findViewById(R.id.multiblurSurfaceView);
+                                 view.getRenderer().setDistance(progress);
+                                 break;
+        }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onStartTrackingTouch(SeekBar bar) { }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onStopTrackingTouch(SeekBar bar)  { }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
 }
diff --git a/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java b/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
index 9ef1482..12648ca 100644
--- a/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
+++ b/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
@@ -32,6 +32,7 @@ import org.distorted.library.DistortedTexture;
 import org.distorted.library.EffectNames;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.MeshCubes;
+import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.DynamicQuat;
 import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
@@ -65,9 +66,11 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
     private GLSurfaceView mView;
     private DistortedTexture mTex1, mTex2;
     private DistortedEffects[] mEffects;
-    private Static3D[] mMoveVector;
+    private Static3D[]  mMoveVector;
+    private Dynamic3D[] mMoveDynamic;
     private DistortedScreen mScreen;
     private DynamicQuat mQuatInt1, mQuatInt2;
+    private int mDistance;
 
     Static4D mQuat1, mQuat2;
     int mScreenMin;
@@ -77,12 +80,20 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
     MultiblurRenderer(GLSurfaceView v)
       {
       mView = v;
+      mDistance = -1;
 
+      mMoveDynamic= new Dynamic3D[NUM_OBJECTS];
       mMoveVector = new Static3D[NUM_OBJECTS];
-      for(int i=0; i<NUM_OBJECTS; i++) mMoveVector[i] = new Static3D(0,0,0);
+      mEffects    = new DistortedEffects[NUM_OBJECTS];
 
-      mEffects = new DistortedEffects[NUM_OBJECTS];
-      for(int i=0; i<NUM_OBJECTS; i++) mEffects[i] = new DistortedEffects();
+      for(int i=0; i<NUM_OBJECTS; i++)
+        {
+        mMoveVector[i]  = new Static3D(0,0,0);
+        mEffects[i]     = new DistortedEffects();
+        mMoveDynamic[i] = new Dynamic3D();
+
+        mMoveDynamic[i].add(mMoveVector[i]);
+        }
 
       mEffects[0].blur(new Static1D(10));
 
@@ -118,26 +129,24 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       {
       mScreenMin = width<height ? width:height;
-    	
+
+    	float factor    = 0.15f*mScreenMin/OBJ_SIZE;
       Static3D center = new Static3D( (float)OBJ_SIZE/2, (float)OBJ_SIZE/2, 0.0f );
-      float factor = 0.15f*mScreenMin/OBJ_SIZE;
-      float xMove  =(width -factor*OBJ_SIZE)/2;
-      float yMove  =(height-factor*OBJ_SIZE)/2;
-      float size   = 1.3f*OBJ_SIZE;
+      Static3D moveVec= new Static3D( (width -factor*OBJ_SIZE)/2 ,(height-factor*OBJ_SIZE)/2 ,0);
 
       for(int i=0; i<NUM_OBJECTS; i++)
         {
         mEffects[i].abortEffects(EffectTypes.MATRIX);
 
-        mMoveVector[i].set(xMove,yMove,0);
-        mEffects[i].move(mMoveVector[i]);
+        mEffects[i].move(moveVec);
         mEffects[i].scale(factor);
         mEffects[i].quaternion(mQuatInt1, center);
         mEffects[i].quaternion(mQuatInt2, center);
-        mMoveVector[i].set(size*MOVE_VEC[3*i], size*MOVE_VEC[3*i+1], size*MOVE_VEC[3*i+2]);
-        mEffects[i].move(mMoveVector[i]);
+        mEffects[i].move(mMoveDynamic[i]);
         }
 
+      computeMoveVectors();
+
       mScreen.resize(width, height);
       }
 
@@ -178,4 +187,25 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
         android.util.Log.e("Multiblur", ex.getMessage() );
         }
       }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private void computeMoveVectors()
+      {
+      float size= 1.3f*OBJ_SIZE*(mDistance/50.0f);
+
+      for(int i=0; i<NUM_OBJECTS; i++)
+        {
+        mMoveVector[i].set(size*MOVE_VEC[3*i], size*MOVE_VEC[3*i+1], size*MOVE_VEC[3*i+2]);
+        }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    void setDistance(int distance)
+      {
+      mDistance = distance;
+      computeMoveVectors();
+      android.util.Log.e("renderer", "distance: "+distance);
+      }
 }
diff --git a/src/main/java/org/distorted/examples/multiblur/MultiblurSurfaceView.java b/src/main/java/org/distorted/examples/multiblur/MultiblurSurfaceView.java
index 174881f..f8d50a4 100644
--- a/src/main/java/org/distorted/examples/multiblur/MultiblurSurfaceView.java
+++ b/src/main/java/org/distorted/examples/multiblur/MultiblurSurfaceView.java
@@ -38,9 +38,9 @@ class MultiblurSurfaceView extends GLSurfaceView
 	
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-    public MultiblurSurfaceView(Context context)
+    public MultiblurSurfaceView(Context context, AttributeSet attrs)
       {
-      super(context);
+      super(context, attrs);
     
       mX = -1;
       mY = -1;
@@ -55,7 +55,14 @@ class MultiblurSurfaceView extends GLSurfaceView
         Toast.makeText(context, R.string.example_rotate_toast , Toast.LENGTH_SHORT).show();
         }
       }
-    
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public MultiblurRenderer getRenderer()
+      {
+      return mRenderer;
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     @Override public boolean onTouchEvent(MotionEvent event) 
diff --git a/src/main/res/layout/multiblurlayout.xml b/src/main/res/layout/multiblurlayout.xml
new file mode 100644
index 0000000..77f247b
--- /dev/null
+++ b/src/main/res/layout/multiblurlayout.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical" >
+
+    <org.distorted.examples.multiblur.MultiblurSurfaceView
+        android:id="@+id/multiblurSurfaceView"
+        android:layout_width="fill_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1" />
+
+    <LinearLayout
+        android:id="@+id/linearLayout1"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center|fill_horizontal"
+        android:orientation="horizontal"
+        android:paddingBottom="10dp"
+        android:paddingTop="10dp" >
+
+        <SeekBar
+            android:id="@+id/multiblurSeek"
+            android:layout_weight="1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingLeft="15dp"
+            android:paddingRight="10dp" />
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
