commit 13fde129bb8175f845a03f1a50698ef898044b14
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Dec 8 01:27:27 2022 +0100

    Change the Sink app. The point: test Sink effect at extreme strengths.

diff --git a/src/main/java/org/distorted/examples/sink/SinkActivity.java b/src/main/java/org/distorted/examples/sink/SinkActivity.java
index fb93eac..50fdf0b 100644
--- a/src/main/java/org/distorted/examples/sink/SinkActivity.java
+++ b/src/main/java/org/distorted/examples/sink/SinkActivity.java
@@ -19,53 +19,87 @@
 
 package org.distorted.examples.sink;
 
+import org.distorted.examples.R;
 import org.distorted.library.main.DistortedLibrary;
 
 import android.app.Activity;
 import android.os.Bundle;
+import android.widget.SeekBar;
+import android.widget.TextView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class SinkActivity extends Activity 
-  {
-  private SinkSurfaceView mView;
+public class SinkActivity extends Activity implements SeekBar.OnSeekBarChangeListener
+{
+    private TextView sinkText;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-    
-  @Override
-  protected void onCreate(Bundle icicle) 
-    {
-    super.onCreate(icicle);
-    DistortedLibrary.onCreate();
-    mView = new SinkSurfaceView(this);
-    setContentView(mView);
-    }
+
+    @Override
+    protected void onCreate(Bundle icicle)
+      {
+      super.onCreate(icicle);
+      DistortedLibrary.onCreate();
+      setContentView(R.layout.sinklayout);
+
+      SeekBar bar = findViewById(R.id.sinkSeek);
+      bar.setOnSeekBarChangeListener(this);
+
+      sinkText = findViewById(R.id.sinkText);
+
+      bar.setProgress(50);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    @Override
+    protected void onPause()
+      {
+      super.onPause();
+      SinkSurfaceView view = findViewById(R.id.sinkSurfaceView);
+      view.onPause();
+      DistortedLibrary.onPause();
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    @Override
+    protected void onResume()
+      {
+      super.onResume();
+      SinkSurfaceView view = findViewById(R.id.sinkSurfaceView);
+      view.onResume();
+      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-    
-  @Override
-  protected void onPause() 
-    {
-    super.onPause();
-    mView.onPause();
-    DistortedLibrary.onPause();
-    }
+
+    @Override
+    protected void onDestroy()
+      {
+      DistortedLibrary.onDestroy();
+      super.onDestroy();
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
+      {
+      if (bar.getId() == R.id.sinkSeek)
+        {
+        SinkSurfaceView view = findViewById(R.id.sinkSurfaceView);
+        float value = view.getRenderer().setSink(progress);
+        sinkText.setText(getString(R.string.sink_placeholder,value));
+        }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onStartTrackingTouch(SeekBar bar) { }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-    
-  @Override
-  protected void onResume() 
-    {
-    super.onResume();
-    mView.onResume();
-    }
- 
+
+    public void onStopTrackingTouch(SeekBar bar)  { }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-    
-  @Override
-  protected void onDestroy() 
-    {
-    DistortedLibrary.onDestroy();
-    super.onDestroy();
-    }    
-  }
+
+}
diff --git a/src/main/java/org/distorted/examples/sink/SinkRenderer.java b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
index 8a2bbbc..33ee1bb 100644
--- a/src/main/java/org/distorted/examples/sink/SinkRenderer.java
+++ b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
@@ -34,7 +34,6 @@ import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.mesh.MeshSquare;
 import org.distorted.library.main.DistortedTexture;
-import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
@@ -47,13 +46,15 @@ import android.opengl.GLSurfaceView;
 
 class SinkRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
   {
-  private GLSurfaceView mView;
-  private DistortedEffects mEffects;
-  private DistortedScreen mScreen;
-  private DistortedTexture mTexture;
-  private MeshSquare mMesh;
-  private Static3D mScale;
+  private final GLSurfaceView mView;
+  private final DistortedEffects mEffects;
+  private final DistortedScreen mScreen;
+  private final DistortedTexture mTexture;
+  private final Static3D mScale;
+  private final Static1D mSinkStrength;
+
   private float mBmpRatio;
+  private MeshSquare mMesh;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -63,15 +64,9 @@ class SinkRenderer implements GLSurfaceView.Renderer, DistortedLibrary.Exception
     mTexture = new DistortedTexture();
     mEffects = new DistortedEffects();
     mScreen  = new DistortedScreen();
+    mSinkStrength = new Static1D(1.0f);
 
-    Dynamic1D sinkStrength = new Dynamic1D(2000,0.0f);
-    sinkStrength.add(new Static1D(2.0f));
-    sinkStrength.add(new Static1D(0.2f));
-
-    // strength [changing in time from 1.0 to 0.2 and back],
-    // center   [(0,0,0), i.e. center of the bitmap],
-    // region   [ (0,0,0) with radius 0.5 - apply to the center circle of the bitmap ]
-    VertexEffectSink sinkEffect = new VertexEffectSink(sinkStrength, new Static3D(0,0,0), new Static4D(0,0,0,0.5f) );
+    VertexEffectSink sinkEffect = new VertexEffectSink(mSinkStrength, new Static3D(0,0,0), new Static4D(0,0,0,0.5f) );
     mEffects.apply(sinkEffect);
 
     mScale = new Static3D(1,1,1);
@@ -79,7 +74,22 @@ class SinkRenderer implements GLSurfaceView.Renderer, DistortedLibrary.Exception
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-   
+// logarithmic: 50 -> 1.0, 40-> A^(-1), 30->A^(-2), 70-> A^2
+// where A = 5 maybe?
+// f(x) = A^((level-50)/10) = e^(logA*((level-50)/10))
+
+  float setSink(int level)
+    {
+    final double logA = Math.log(5);
+    final float exponent = (level-50)/10.0f;
+    final float value = (float)Math.exp(logA*exponent);
+    mSinkStrength.set(value);
+
+    return value;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   public void onDrawFrame(GL10 glUnused) 
     {
     mScreen.render( System.currentTimeMillis() );
@@ -99,7 +109,7 @@ class SinkRenderer implements GLSurfaceView.Renderer, DistortedLibrary.Exception
     
   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
     {
-    InputStream is = mView.getContext().getResources().openRawResource(R.raw.cat);
+    InputStream is = mView.getContext().getResources().openRawResource(R.raw.gridlines);
     Bitmap bitmap;
         
     try 
@@ -112,7 +122,7 @@ class SinkRenderer implements GLSurfaceView.Renderer, DistortedLibrary.Exception
         {
         is.close();
         } 
-      catch(IOException e) { }
+      catch(IOException ignored) { }
       }  
       
     mBmpRatio = (float)bitmap.getHeight()/bitmap.getWidth();
diff --git a/src/main/java/org/distorted/examples/sink/SinkSurfaceView.java b/src/main/java/org/distorted/examples/sink/SinkSurfaceView.java
index a86fd98..4719fc4 100644
--- a/src/main/java/org/distorted/examples/sink/SinkSurfaceView.java
+++ b/src/main/java/org/distorted/examples/sink/SinkSurfaceView.java
@@ -23,18 +23,34 @@ import android.app.ActivityManager;
 import android.content.Context;
 import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
+import android.util.AttributeSet;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class SinkSurfaceView extends GLSurfaceView 
-  {
-  public SinkSurfaceView(Context context) 
-    {
-    super(context);
-    final ActivityManager activityManager     = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
-    final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
-    setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
-    setRenderer(new SinkRenderer(this));
-    }
-  }
+class SinkSurfaceView extends GLSurfaceView
+{
+    private SinkRenderer mRenderer;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public SinkSurfaceView(Context context, AttributeSet attrs)
+      {
+      super(context, attrs);
+
+      if(!isInEditMode())
+        {
+        mRenderer = new SinkRenderer(this);
+        final ActivityManager activityManager     = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
+        setRenderer(mRenderer);
+        }
+      }
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public SinkRenderer getRenderer()
+      {
+      return mRenderer;
+      }
+}
 
diff --git a/src/main/res/layout/sinklayout.xml b/src/main/res/layout/sinklayout.xml
new file mode 100644
index 0000000..d6da447
--- /dev/null
+++ b/src/main/res/layout/sinklayout.xml
@@ -0,0 +1,40 @@
+<?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.sink.SinkSurfaceView
+        android:id="@+id/sinkSurfaceView"
+        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:paddingTop="10dp"
+        android:paddingBottom="10dp">
+
+        <TextView
+            android:id="@+id/sinkText"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="0.5"
+            android:paddingLeft="10dp"
+            android:textAppearance="?android:attr/textAppearanceMedium" />
+
+        <SeekBar
+            android:id="@+id/sinkSeek"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:paddingLeft="10dp"
+            android:paddingRight="10dp" />
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/raw/gridlines.jpg b/src/main/res/raw/gridlines.jpg
new file mode 100644
index 0000000..d249d79
Binary files /dev/null and b/src/main/res/raw/gridlines.jpg differ
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index d3830c9..22fa91c 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -119,6 +119,7 @@
     <string name="fov_placeholder">FOV: %1$d</string>
     <string name="near_placeholder">Near: %1$.2f</string>
     <string name="wind_placeholder">Wind: %1$d</string>
+    <string name="sink_placeholder">%1$.4f</string>
     <string name="blur_placeholder">Blur: %1$d</string>
     <string name="halo_placeholder">Halo: %1$d</string>
     <string name="move_placeholder">Move: %1$d</string>
