commit 213c15de1d3f799d6f9c20fc3af491c245736f13
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Apr 29 13:57:50 2022 +0200

    Bandaged: progress with touch control.

diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorActivity.java b/src/main/java/org/distorted/bandaged/BandagedCreatorActivity.java
index 1df31866..e51ec32f 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorActivity.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorActivity.java
@@ -284,16 +284,18 @@ public class BandagedCreatorActivity extends AppCompatActivity
     public void deleteObject(String name)
       {
       RubikFiles files = RubikFiles.getInstance();
-      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
-      SharedPreferences.Editor editor = preferences.edit();
-
-      int meshState          = TwistyObject.MESH_NICE;
-      int iconMode           = TwistyObject.MODE_NORM;
       InputStream jsonStream = files.openFile(this,name+"_object.json");
-      TwistyObject object = new TwistyJson( jsonStream, meshState, iconMode, null, null, 1.0f, null);
-      object.removePreferences(editor);
 
-      editor.apply();
+      if( jsonStream!=null )
+        {
+        int meshState= TwistyObject.MESH_NICE;
+        int iconMode = TwistyObject.MODE_NORM;
+        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
+        SharedPreferences.Editor editor = preferences.edit();
+        TwistyObject object = new TwistyJson( jsonStream, meshState, iconMode, null, null, 1.0f, null);
+        object.removePreferences(editor);
+        editor.apply();
+        }
 
       mScreen.deleteObject(this,name);
       files.deleteIcon(this,name);
diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java b/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
index 480b5bf3..e8555f71 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
@@ -60,7 +60,7 @@ import java.nio.ByteOrder;
 public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    public static final float BRIGHTNESS = 0.333f;
-   private static final int DURATION = 1000;
+   private static final int RESET_DURATION = 1000;
    static final float SCREEN_RATIO = 0.5f;
 
    private final BandagedCreatorView mView;
@@ -153,7 +153,7 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
               c++;
               }
 
-     mView.setCubits(mCubits);
+     mView.setCubits(mCubits,mX,mY,mZ);
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -292,7 +292,7 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
       {
       DistortedLibrary.setMax(EffectType.VERTEX,25);
-      MeshBase.setMaxEffComponents(50);
+      MeshBase.setMaxEffComponents(120);
 
       VertexEffectDeform.enable();
       FragmentEffectBrightness.enable();
@@ -587,7 +587,7 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
    public boolean continueResetting(long time)
      {
      long diff = time-mStartTime;
-     float quotient = ((float)diff)/DURATION;
+     float quotient = ((float)diff)/RESET_DURATION;
 
      if( mInitialPhase && quotient>0.5f )
        {
diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorTouchControl.java b/src/main/java/org/distorted/bandaged/BandagedCreatorTouchControl.java
index cefbbc48..616160b7 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorTouchControl.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorTouchControl.java
@@ -28,7 +28,6 @@ import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
 
 public class BandagedCreatorTouchControl
 {
-  private static final float DIST3D = 0.5f;
   private static final float DIST2D = 0.5f;
 
   private final Static4D CAMERA_POINT;
@@ -36,14 +35,16 @@ public class BandagedCreatorTouchControl
   private final float[] mPoint2D;
   private float mObjectRatio;
   private final Static3D[] mFaceAxis;
+  private final float[] mDist3D;
 
   private BandagedCubit[] mCubits;
   private int mNumCubits;
   private int mLastTouchedFace;
+  private float mX, mY, mZ, mMax;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private boolean isInsideFace(float[] p)
+  private boolean isInsideFace(int face, float[] p)
     {
     return ( p[0]<=DIST2D && p[0]>=-DIST2D && p[1]<=DIST2D && p[1]>=-DIST2D );
     }
@@ -103,9 +104,9 @@ public class BandagedCreatorTouchControl
 //
 // output = camera + alpha*(point-camera), where alpha = [dist-axis*camera] / [axis*(point-camera)]
 
-  private void castTouchPointOntoFace(int index, float[] output)
+  private void castTouchPointOntoFace(int face, float[] output)
     {
-    Static3D faceAxis = mFaceAxis[index];
+    Static3D faceAxis = mFaceAxis[face];
 
     float d0 = mPoint[0]-mCamera[0];
     float d1 = mPoint[1]-mCamera[1];
@@ -119,7 +120,7 @@ public class BandagedCreatorTouchControl
     if( denom != 0.0f )
       {
       float axisCam = a0*mCamera[0] + a1*mCamera[1] + a2*mCamera[2];
-      float alpha = (DIST3D-axisCam)/denom;
+      float alpha = (mDist3D[face]-axisCam)/denom;
 
       output[0] = mCamera[0] + d0*alpha;
       output[1] = mCamera[1] + d1*alpha;
@@ -129,11 +130,23 @@ public class BandagedCreatorTouchControl
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private boolean faceIsVisible(int index)
+  private void stretchPoint(int face, float[] output)
     {
-    Static3D faceAxis = mFaceAxis[index];
+    switch(face/2)
+      {
+      case 0: output[0] *= (mMax/mZ); output[1] *= (mMax/mY); break;
+      case 1: output[0] *= (mMax/mX); output[1] *= (mMax/mZ); break;
+      case 2: output[0] *= (mMax/mX); output[1] *= (mMax/mY); break;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private boolean faceIsVisible(int face)
+    {
+    Static3D faceAxis = mFaceAxis[face];
     float castCameraOnAxis = mCamera[0]*faceAxis.get0() + mCamera[1]*faceAxis.get1() + mCamera[2]*faceAxis.get2();
-    return castCameraOnAxis > DIST3D;
+    return castCameraOnAxis > mDist3D[face];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -159,7 +172,8 @@ public class BandagedCreatorTouchControl
         float az = mFaceAxis[mLastTouchedFace].get2();
 
         convertTo2Dcoords(mTouch, ax,ay,az, mPoint2D);
-        if( isInsideFace(mPoint2D) ) return true;
+        stretchPoint(mLastTouchedFace,mPoint2D);
+        if( isInsideFace(mLastTouchedFace,mPoint2D) ) return true;
         }
       }
 
@@ -170,17 +184,32 @@ public class BandagedCreatorTouchControl
 
   private void computePosition(int face, float pointX, float pointY)
     {
-    int x = (int)(3*pointX+1.5f) -1;
-    int y = (int)(3*pointY+1.5f) -1;
-
     switch(face)
       {
-      case 0: mPos[0] = 1.0f; mPos[1] =    y; mPos[2] =   -x; break;
-      case 1: mPos[0] =-1.0f; mPos[1] =    y; mPos[2] =    x; break;
-      case 2: mPos[0] =    x; mPos[1] = 1.0f; mPos[2] =   -y; break;
-      case 3: mPos[0] =    x; mPos[1] =-1.0f; mPos[2] =    y; break;
-      case 4: mPos[0] =    x; mPos[1] =    y; mPos[2] = 1.0f; break;
-      case 5: mPos[0] =   -x; mPos[1] =    y; mPos[2] =-1.0f; break;
+      case 0: mPos[0] = (mX-1)/2;
+              mPos[1] = (int)(+mY*pointY+mY/2)-(mY-1)/2;
+              mPos[2] = (int)(-mZ*pointX-mZ/2)+(mZ-1)/2;
+              break;
+      case 1: mPos[0] =-(mX-1)/2;
+              mPos[1] = (int)(+mY*pointY+mY/2)-(mY-1)/2;
+              mPos[2] = (int)(+mZ*pointX+mZ/2)-(mZ-1)/2;
+              break;
+      case 2: mPos[0] = (int)(+mX*pointX+mX/2)-(mX-1)/2;
+              mPos[1] = (mY-1)/2;
+              mPos[2] = (int)(-mZ*pointY-mZ/2)+(mZ-1)/2;
+              break;
+      case 3: mPos[0] = (int)(+mX*pointX+mX/2)-(mX-1)/2;
+              mPos[1] =-(mY-1)/2;
+              mPos[2] = (int)(+mZ*pointY+mZ/2)-(mZ-1)/2;
+              break;
+      case 4: mPos[0] = (int)(+mX*pointX+mX/2)-(mX-1)/2;
+              mPos[1] = (int)(+mY*pointY+mY/2)-(mY-1)/2;
+              mPos[2] = (mZ-1)/2;
+              break;
+      case 5: mPos[0] = (int)(-mX*pointX-mX/2)+(mX-1)/2;
+              mPos[1] = (int)(+mY*pointY+mY/2)-(mY-1)/2;
+              mPos[2] =-(mZ-1)/2;
+              break;
       }
     }
 
@@ -215,6 +244,7 @@ public class BandagedCreatorTouchControl
     mTouch = new float[3];
     mPos   = new float[3];
     mPoint2D = new float[2];
+    mDist3D  = new float[6];
     mFaceAxis = TouchControlHexahedron.FACE_AXIS;
     mObjectRatio = ratio;
 
@@ -227,10 +257,19 @@ public class BandagedCreatorTouchControl
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void setCubits(BandagedCubit[] cubits)
+  public void setCubits(BandagedCubit[] cubits, int x, int y, int z)
     {
     mCubits = cubits;
     mNumCubits = cubits.length;
+
+    mX = x;
+    mY = y;
+    mZ = z;
+    mMax = mX>mY ? Math.max(mX,mZ) : Math.max(mY,mZ);
+
+    mDist3D[0] = mDist3D[1] = 0.5f*(mX/mMax);
+    mDist3D[2] = mDist3D[3] = 0.5f*(mY/mMax);
+    mDist3D[4] = mDist3D[5] = 0.5f*(mZ/mMax);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorView.java b/src/main/java/org/distorted/bandaged/BandagedCreatorView.java
index c8ad909e..9af5fd46 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorView.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorView.java
@@ -108,9 +108,9 @@ public class BandagedCreatorView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public void setCubits(BandagedCubit[] cubits)
+    public void setCubits(BandagedCubit[] cubits, int x, int y, int z)
       {
-      mTouchControl.setCubits(cubits);
+      mTouchControl.setCubits(cubits,x,y,z);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -146,8 +146,8 @@ public class BandagedCreatorView extends GLSurfaceView
 
       switch(action)
          {
-         case MotionEvent.ACTION_DOWN: float x1 = (x -  mScreenWidth*0.5f)/mScreenMin;
-                                       float y1 = (mScreenHeight*0.5f - y)/mScreenMin;
+         case MotionEvent.ACTION_DOWN: float x1 = (x -mScreenWidth*0.5f)/mScreenMin;
+                                       float y1 = (mScreenHeight*0.5f-y)/mScreenMin;
 
                                        int index = mTouchControl.cubitTouched(x1,y1,mRenderer.getQuatAccu() );
 
