commit aa8b36aaf42575102ff47c5188275a35a7872627
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu May 9 00:09:51 2019 +0100

    Progress.

diff --git a/src/main/java/org/distorted/effect/AppearEffect.java b/src/main/java/org/distorted/effect/AppearEffect.java
index 368142bd..7b09f81b 100644
--- a/src/main/java/org/distorted/effect/AppearEffect.java
+++ b/src/main/java/org/distorted/effect/AppearEffect.java
@@ -100,13 +100,13 @@ public abstract class AppearEffect implements EffectListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public long start(DistortedScreen screen, RubikCube cube, EffectListener listener)
+  public long start(int duration, DistortedScreen screen, RubikCube cube, EffectListener listener)
     {
     mScreen   = screen;
     mCube     = cube;
     mListener = listener;
 
-    mCubeEffectFinished = createEffects(2000);
+    mCubeEffectFinished = createEffects(duration);
 
     if( mCubeEffects!=null )
       {
diff --git a/src/main/java/org/distorted/effect/DisappearEffect.java b/src/main/java/org/distorted/effect/DisappearEffect.java
index 63ea9f63..a03e66a4 100644
--- a/src/main/java/org/distorted/effect/DisappearEffect.java
+++ b/src/main/java/org/distorted/effect/DisappearEffect.java
@@ -101,13 +101,13 @@ public abstract class DisappearEffect implements EffectListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public long start(DistortedScreen screen, RubikCube cube, EffectListener listener)
+  public long start(int duration, DistortedScreen screen, RubikCube cube, EffectListener listener)
     {
     mScreen   = screen;
     mCube     = cube;
     mListener = listener;
 
-    mCubeEffectFinished = createEffects(2000);
+    mCubeEffectFinished = createEffects(duration);
 
     if( mCubeEffects!=null )
       {
diff --git a/src/main/java/org/distorted/magic/RubikActivity.java b/src/main/java/org/distorted/magic/RubikActivity.java
index b70a5ae3..cd2a2ee5 100644
--- a/src/main/java/org/distorted/magic/RubikActivity.java
+++ b/src/main/java/org/distorted/magic/RubikActivity.java
@@ -115,7 +115,7 @@ public class RubikActivity extends Activity
     public void Scramble(View v)
       {
       RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
-      view.scrambleCube();
+      view.getRenderer().scrambleCube();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -139,7 +139,7 @@ public class RubikActivity extends Activity
           }
 
       RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
-      boolean success = view.setNewCubeSize(size);
+      boolean success = view.getRenderer().createCube(size);
 
       if( success )
         {
diff --git a/src/main/java/org/distorted/magic/RubikRenderer.java b/src/main/java/org/distorted/magic/RubikRenderer.java
index b2a88083..c3023423 100644
--- a/src/main/java/org/distorted/magic/RubikRenderer.java
+++ b/src/main/java/org/distorted/magic/RubikRenderer.java
@@ -54,10 +54,11 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
     private boolean mFinishRotation, mRemoveRotation, mFinishDragCurrent, mFinishDragAccumulated;
     private boolean mCanRotate, mCanDrag;
     private RubikCube mOldCube, mNewCube;
-
     private int mScreenWidth, mScreenHeight;
-
     private MeshQuad mMesh;
+    private AppearEffect.Type mAppearType;
+    private DisappearEffect.Type mDisappearType;
+    private int mAppearDuration, mDisappearDuration;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -85,6 +86,12 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
       mCanRotate = true;
       mCanDrag   = true;
 
+      mAppearType    = AppearEffect.Type.SCALE;
+      mDisappearType = DisappearEffect.Type.SCALE;
+
+      mAppearDuration    = 1000;
+      mDisappearDuration = 1000;
+
       mMesh= new MeshQuad();
       mNextCubeSize =RubikActivity.getSize();
       }
@@ -93,6 +100,7 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
 // various things are done here delayed, 'after the next render' as not to be done mid-render and
 // cause artifacts.
 
+    @Override
     public void onDrawFrame(GL10 glUnused) 
       {
       mScreen.render( System.currentTimeMillis() );
@@ -137,7 +145,46 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// EffectListener. The library sends a message to us when it's time to call 'removeRotation'
+
+   @Override
+   public void onSurfaceChanged(GL10 glUnused, int width, int height)
+      {
+      if( mNewCube!=null ) mNewCube.createTexture();
+
+      float cameraDistance = CAMERA_DISTANCE*(width>height ? width:height);
+      float fovInDegrees   = computeFOV(cameraDistance,height);
+
+      mScreen.setProjection( fovInDegrees, 0.1f);
+      mView.setScreenSize(width,height);
+      mView.setCameraDist(cameraDistance);
+      mScreen.resize(width, height);
+
+      recomputeScaleFactor(width,height);
+
+      mScreenHeight = height;
+      mScreenWidth  = width;
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   @Override
+   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
+      {
+      VertexEffectSink.enable();
+      AppearEffect.enableEffects();
+      DisappearEffect.enableEffects();
+
+      try
+        {
+        DistortedLibrary.onCreate(mView.getContext());
+        }
+      catch(Exception ex)
+        {
+        android.util.Log.e("Rubik", ex.getMessage() );
+        }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
 
    public void effectMessage(final EffectMessage em, final long effectID, final long objectID)
      {
@@ -162,8 +209,8 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
      {
      try
        {
-       DisappearEffect effect = DisappearEffect.create(DisappearEffect.Type.ROUND);
-       mDisappearEffectID = effect.start(mScreen,mOldCube,this);
+       DisappearEffect effect = DisappearEffect.create(mDisappearType);
+       mDisappearEffectID = effect.start(mDisappearDuration,mScreen,mOldCube,this);
        }
      catch(Exception ex)
        {
@@ -177,8 +224,8 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
      {
      try
        {
-       AppearEffect effect = AppearEffect.create(AppearEffect.Type.ROUND);
-       mAppearEffectID = effect.start(mScreen,mNewCube,this);
+       AppearEffect effect = AppearEffect.create(mAppearType);
+       mAppearEffectID = effect.start(mAppearDuration,mScreen,mNewCube,this);
        }
      catch(Exception ex)
        {
@@ -192,56 +239,46 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   public void onSurfaceChanged(GL10 glUnused, int width, int height)
-      {
-      if( mNewCube!=null ) mNewCube.createTexture();
+   private float computeFOV(float cameraDistance, int screenHeight)
+     {
+     double halfFOVInRadians = Math.atan( screenHeight/(2*cameraDistance) );
+     return (float)(2*halfFOVInRadians*(180/Math.PI));
+     }
 
-      float cameraDistance = CAMERA_DISTANCE*(width>height ? width:height);
-      float fovInDegrees   = computeFOV(cameraDistance,height);
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// no this will not race with onDrawFrame
 
-      mScreen.setProjection( fovInDegrees, 0.1f);
-      mView.setScreenSize(width,height);
-      mView.setCameraDist(cameraDistance);
-      mScreen.resize(width, height);
+   void finishRotation()
+     {
+     mFinishRotation = true;
+     }
 
-      recomputeScaleFactor(width,height);
+///////////////////////////////////////////////////////////////////////////////////////////////////
 
-      mScreenHeight = height;
-      mScreenWidth  = width;
-      }
+   void setAppearDuration(int duration)
+     {
+     mAppearDuration = duration;
+     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-    
-   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
-      {
-      VertexEffectSink.enable();
-      AppearEffect.enableEffects();
-      DisappearEffect.enableEffects();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Rubik", ex.getMessage() );
-        }
-      }
+   void setDisappearDuration(int duration)
+     {
+     mDisappearDuration = duration;
+     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   private float computeFOV(float cameraDistance, int screenHeight)
+   void setAppearType(AppearEffect.Type type)
      {
-     double halfFOVInRadians = Math.atan( screenHeight/(2*cameraDistance) );
-     return (float)(2*halfFOVInRadians*(180/Math.PI));
+     mAppearType = type;
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// no this will not race with onDrawFrame
 
-   void finishRotation()
+   void setDisappearType(DisappearEffect.Type type)
      {
-     mFinishRotation = true;
+     mDisappearType = type;
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/magic/RubikSurfaceView.java b/src/main/java/org/distorted/magic/RubikSurfaceView.java
index 68eaa84e..b96141fe 100644
--- a/src/main/java/org/distorted/magic/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/magic/RubikSurfaceView.java
@@ -164,16 +164,9 @@ class RubikSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    boolean setNewCubeSize(int newCubeSize)
+    RubikRenderer getRenderer()
       {
-      return mRenderer.createCube(newCubeSize);
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    void scrambleCube()
-      {
-      mRenderer.scrambleCube();
+      return mRenderer;
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
