commit f1b8b4128394aaff850df4fc31844b30c2a26478
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Apr 4 15:55:18 2018 +0100

    Improve the Triblur app.

diff --git a/src/main/java/org/distorted/examples/triblur/TriblurActivity.java b/src/main/java/org/distorted/examples/triblur/TriblurActivity.java
index a7b5fdf..018ffa9 100644
--- a/src/main/java/org/distorted/examples/triblur/TriblurActivity.java
+++ b/src/main/java/org/distorted/examples/triblur/TriblurActivity.java
@@ -35,6 +35,7 @@ import org.distorted.library.main.Distorted;
 public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChangeListener
 {
     private int mQuality;
+    private int mBackground;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -58,7 +59,8 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
         radiusBar1.setProgress(50);
         radiusBar2.setProgress(70);
 
-        mQuality = EffectQuality.HIGH.ordinal();
+        privateQuality(1);
+        privateBackgroundColor(1);
         }
       }
 
@@ -104,6 +106,7 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
 
       savedInstanceState.putBooleanArray("checkboxes", renderer.getChecked() );
       savedInstanceState.putInt("quality", mQuality);
+      savedInstanceState.putInt("background", mBackground);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -126,16 +129,11 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
           }
         }
 
-      mQuality = savedInstanceState.getInt("quality");
+      mQuality    = savedInstanceState.getInt("quality");
+      mBackground = savedInstanceState.getInt("background");
 
-      switch(mQuality)
-        {
-        case 0 : quality0(null); break;
-        case 1 : quality1(null); break;
-        case 2 : quality2(null); break;
-        case 3 : quality3(null); break;
-        default: android.util.Log.e("TriBlur", "error - unknown quality!");
-        }
+      privateQuality(mQuality);
+      privateBackgroundColor(mBackground);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -169,11 +167,10 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
   public void onClick(View view)
     {
     CheckBox box = (CheckBox)view;
-    int id = box.getId();
     boolean checked = box.isChecked();
     TriblurSurfaceView sView = (TriblurSurfaceView) this.findViewById(R.id.triblurSurfaceView);
 
-    switch(id)
+    switch(box.getId())
       {
       case R.id.triblurCheckBox0  : sView.getRenderer().setChecked(0,checked); break;
       case R.id.triblurCheckBox1  : sView.getRenderer().setChecked(1,checked); break;
@@ -183,41 +180,65 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void quality0(View v)
+  public void backgroundColor(View v)
     {
-    TriblurSurfaceView view = (TriblurSurfaceView) this.findViewById(R.id.triblurSurfaceView);
-    TriblurRenderer renderer = view.getRenderer();
-    renderer.setQuality(EffectQuality.HIGHEST);
-    mQuality = EffectQuality.HIGHEST.ordinal();
+    switch(v.getId())
+      {
+      case R.id.triblurRadioBackground0: privateBackgroundColor(0); break;
+      case R.id.triblurRadioBackground1: privateBackgroundColor(1); break;
+      case R.id.triblurRadioBackground2: privateBackgroundColor(2); break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void quality1(View v)
+  public void quality(View v)
     {
-    TriblurSurfaceView view = (TriblurSurfaceView) this.findViewById(R.id.triblurSurfaceView);
-    TriblurRenderer renderer = view.getRenderer();
-    renderer.setQuality(EffectQuality.HIGH);
-    mQuality = EffectQuality.HIGH.ordinal();
+    switch(v.getId())
+      {
+      case R.id.triblurRadioQuality0: privateQuality(0); break;
+      case R.id.triblurRadioQuality1: privateQuality(1); break;
+      case R.id.triblurRadioQuality2: privateQuality(2); break;
+      case R.id.triblurRadioQuality3: privateQuality(3); break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void quality2(View v)
+  private void privateBackgroundColor(int index)
     {
     TriblurSurfaceView view = (TriblurSurfaceView) this.findViewById(R.id.triblurSurfaceView);
     TriblurRenderer renderer = view.getRenderer();
-    renderer.setQuality(EffectQuality.MEDIUM);
-    mQuality = EffectQuality.MEDIUM.ordinal();
+
+    switch(index)
+      {
+      case 0: renderer.setBackground(0.0f,0.0f,0.0f,1.0f); mBackground=0; break;
+      case 1: renderer.setBackground(1.0f,1.0f,1.0f,1.0f); mBackground=1; break;
+      case 2: renderer.setBackground(0.0f,0.0f,1.0f,1.0f); mBackground=2; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void quality3(View v)
+  private void privateQuality(int index)
     {
     TriblurSurfaceView view = (TriblurSurfaceView) this.findViewById(R.id.triblurSurfaceView);
     TriblurRenderer renderer = view.getRenderer();
-    renderer.setQuality(EffectQuality.LOW);
-    mQuality = EffectQuality.LOW.ordinal();
+
+    switch(index)
+      {
+      case 0: renderer.setQuality(EffectQuality.HIGHEST);
+              mQuality = EffectQuality.HIGHEST.ordinal();
+              break;
+      case 1: renderer.setQuality(EffectQuality.HIGH);
+              mQuality = EffectQuality.HIGH.ordinal();
+              break;
+      case 2: renderer.setQuality(EffectQuality.MEDIUM);
+              mQuality = EffectQuality.MEDIUM.ordinal();
+              break;
+      case 3: renderer.setQuality(EffectQuality.LOW);
+              mQuality = EffectQuality.LOW.ordinal();
+              break;
     }
+  }
 }
diff --git a/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java b/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
index 0bc1b0f..bdc2687 100644
--- a/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
+++ b/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
@@ -50,6 +50,8 @@ import javax.microedition.khronos.opengles.GL10;
 
 class TriblurRenderer implements GLSurfaceView.Renderer
 {
+    private static final int NUM = 6; // 6 ints (x,y,z,R,G,B) each describe 1 object below
+
     private static final int[] OBJECTS =
         {
         -1, 0, 0, 255,   0,  0,  // x,y,z, R,G,B
@@ -57,7 +59,7 @@ class TriblurRenderer implements GLSurfaceView.Renderer
         +1, 0, 0,   0, 255,  0,  //
         };
 
-    private static final int NUM_OBJECTS = OBJECTS.length/6;
+    private static final int NUM_OBJECTS = OBJECTS.length/NUM;
     private static final int OBJ_SIZE    = 100;
 
     private GLSurfaceView mView;
@@ -115,7 +117,7 @@ class TriblurRenderer implements GLSurfaceView.Renderer
       for(int i=0; i<NUM_OBJECTS; i++)
         {
         mMoveVector[i]   = new Static3D(0,0,0);
-        mChromaVector[i] = new Static3D(OBJECTS[6*i+3],OBJECTS[6*i+4],OBJECTS[6*i+5]);
+        mChromaVector[i] = new Static3D(OBJECTS[NUM*i+3],OBJECTS[NUM*i+4],OBJECTS[NUM*i+5]);
         mBlurVector[i]   = new Static1D(10);
         mBlur[i]         = new PostprocessEffectBlur(mBlurVector[i]);
         mChroma[i]       = new FragmentEffectChroma( new Static1D(0.3f), mChromaVector[i]);
@@ -147,6 +149,13 @@ class TriblurRenderer implements GLSurfaceView.Renderer
         }
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    void setBackground(float r, float g, float b, float a)
+      {
+      mScreen.glClearColor(r,g,b,a);
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void onDrawFrame(GL10 glUnused) 
@@ -211,7 +220,7 @@ class TriblurRenderer implements GLSurfaceView.Renderer
 
       for(int i=0; i<NUM_OBJECTS; i++)
         {
-        mMoveVector[i].set(size*OBJECTS[6*i], size*OBJECTS[6*i+1], size*OBJECTS[6*i+2]);
+        mMoveVector[i].set(size*OBJECTS[NUM*i], size*OBJECTS[NUM*i+1], size*OBJECTS[NUM*i+2]);
         }
       }
 
diff --git a/src/main/res/layout/triblurlayout.xml b/src/main/res/layout/triblurlayout.xml
index 4640970..07c6059 100644
--- a/src/main/res/layout/triblurlayout.xml
+++ b/src/main/res/layout/triblurlayout.xml
@@ -82,6 +82,54 @@
             android:paddingRight="10dp" />
     </LinearLayout>
 
+    <LinearLayout
+        android:id="@+id/linearLayout2"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center|fill_horizontal"
+        android:orientation="horizontal"
+        android:background="@color/cyan"
+        android:paddingBottom="10dp"
+        android:paddingTop="10dp" >
+
+        <RadioGroup
+            android:id="@+id/triblurRadioBackground"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <RadioButton
+                android:id="@+id/triblurRadioBackground0"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:onClick="backgroundColor"
+                android:text="@string/color_black"
+                android:textSize="16sp"/>
+
+            <RadioButton
+                android:id="@+id/triblurRadioBackground1"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:checked="true"
+                android:onClick="backgroundColor"
+                android:text="@string/color_white"
+                android:textSize="16sp"/>
+
+            <RadioButton
+                android:id="@+id/triblurRadioBackground2"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:onClick="backgroundColor"
+                android:text="@string/color_blue"
+                android:textSize="16sp"/>
+
+        </RadioGroup>
+
+    </LinearLayout>
+
     <LinearLayout
         android:id="@+id/linearLayout3"
         android:layout_width="fill_parent"
@@ -103,7 +151,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
-                android:onClick="quality0"
+                android:onClick="quality"
                 android:text="@string/quality0"
                 android:textSize="14sp"/>
 
@@ -113,7 +161,7 @@
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
                 android:checked="true"
-                android:onClick="quality1"
+                android:onClick="quality"
                 android:text="@string/quality1"
                 android:textSize="14sp"/>
 
@@ -122,7 +170,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
-                android:onClick="quality2"
+                android:onClick="quality"
                 android:text="@string/quality2"
                 android:textSize="14sp"/>
 
@@ -131,7 +179,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
-                android:onClick="quality3"
+                android:onClick="quality"
                 android:text="@string/quality3"
                 android:textSize="14sp"/>
 
diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml
index b9fb7aa..a0c6348 100644
--- a/src/main/res/values/colors.xml
+++ b/src/main/res/values/colors.xml
@@ -1,8 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-<color name="blue">#ff0000ff</color>
-<color name="black">#ff000000</color>
-<color name="red">#ffff0000</color>
-<color name="yellow">#ffffff00</color>
-<color name="green">#ff00ff00</color>
+    <color name="blue">#ff0000ff</color>
+    <color name="black">#ff000000</color>
+    <color name="red">#ffff0000</color>
+    <color name="yellow">#ffffff00</color>
+    <color name="green">#ff00ff00</color>
+    <color name="cyan">#ff00ffff</color>
+    <color name="white">#ffffffff</color>
 </resources>
\ No newline at end of file
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 1e4ce29..b503ba8 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -73,6 +73,14 @@
     <string name="screen">Screen</string>
     <string name="framebuffer">Framebuffer</string>
 
+    <string name="color_blue">Blue</string>
+    <string name="color_black">Black</string>
+    <string name="color_red">Red</string>
+    <string name="color_yellow">Yellow</string>
+    <string name="color_green">Green</string>
+    <string name="color_cyan">Cyan</string>
+    <string name="color_white">White</string>
+
     <string name="radius_placeholder">Radius: %1$s</string>
     <string name="noise_placeholder">Noise %1$s</string>
     <string name="length_placeholder">Length %1$d</string>
