commit 3c4a326ca2c471419b00e17b97ed4c0bc3898941
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Feb 21 18:58:52 2020 +0000

    More work on making new types of RubikObjects easily creatable.

diff --git a/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java b/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
index 610738b7..550821de 100644
--- a/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
+++ b/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
@@ -23,16 +23,13 @@ import org.distorted.effect.BaseEffect;
 import org.distorted.library.effect.Effect;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.message.EffectListener;
+import org.distorted.library.type.Static3D;
 import org.distorted.magic.RubikRenderer;
 import org.distorted.object.RubikObject;
 
 import java.lang.reflect.Method;
 import java.util.Random;
 
-import static org.distorted.object.RubikObjectList.VECTX;
-import static org.distorted.object.RubikObjectList.VECTY;
-import static org.distorted.object.RubikObjectList.VECTZ;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public abstract class ScrambleEffect extends BaseEffect implements EffectListener
@@ -55,6 +52,13 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
   private static final int FAKE_EFFECT_ID  = -3;
   private static final Type[] types;
 
+  private static final Static3D VECTX = new Static3D(1,0,0);
+  private static final Static3D VECTY = new Static3D(0,1,0);
+  private static final Static3D VECTZ = new Static3D(0,0,1);
+  private static final Static3D VECTU = new Static3D(0,0,0);
+
+  private static final Static3D[] VECTORS = { VECTX, VECTY, VECTZ, VECTZ };
+
   static
     {
     int i=0;
@@ -86,7 +90,7 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
   ScrambleEffect()
     {
     mRnd = new Random( System.currentTimeMillis() );
-    mLastVector = -1;
+    mLastVector = 3;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -123,14 +127,9 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
     {
     if( mNumScramblesLeft>0 )
       {
-      if( mLastVector == -1 )
+      if( mLastVector == 3 )
         {
-        switch(mRnd.nextInt(3))
-          {
-          case 0: mLastVector = VECTX; break;
-          case 1: mLastVector = VECTY; break;
-          case 2: mLastVector = VECTZ; break;
-          }
+        mLastVector = mRnd.nextInt(3);
         }
       else
         {
@@ -138,9 +137,9 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
 
         switch(mLastVector)
           {
-          case VECTX: mLastVector = (newVector==0 ? VECTY: VECTZ); break;
-          case VECTY: mLastVector = (newVector==0 ? VECTX: VECTZ); break;
-          case VECTZ: mLastVector = (newVector==0 ? VECTX: VECTY); break;
+          case 0: mLastVector = (newVector==0 ? 1:2); break;
+          case 1: mLastVector = (newVector==0 ? 0:2); break;
+          case 2: mLastVector = (newVector==0 ? 0:1); break;
           }
         }
 
@@ -157,7 +156,7 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
         android.util.Log.e("effect", "ERROR: "+mNumDoubleScramblesLeft);
         }
 
-      mCurrentBaseEffectID = mObject.addNewRotation(mLastVector, row, angle*90, durationMillis, this );
+      mCurrentBaseEffectID = mObject.addNewRotation(VECTORS[mLastVector], row, angle*90, durationMillis, this );
       }
     else
       {
diff --git a/src/main/java/org/distorted/magic/RubikRenderer.java b/src/main/java/org/distorted/magic/RubikRenderer.java
index 68f2ec5a..619cae13 100644
--- a/src/main/java/org/distorted/magic/RubikRenderer.java
+++ b/src/main/java/org/distorted/magic/RubikRenderer.java
@@ -132,7 +132,10 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
 
    void savePreferences(SharedPreferences.Editor editor)
      {
-     mNewObject.savePreferences(editor);
+     if( mNewObject!=null )
+       {
+       mNewObject.savePreferences(editor);
+       }
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/magic/RubikSurfaceView.java b/src/main/java/org/distorted/magic/RubikSurfaceView.java
index c417ef8e..ab6404de 100644
--- a/src/main/java/org/distorted/magic/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/magic/RubikSurfaceView.java
@@ -27,6 +27,7 @@ import android.util.AttributeSet;
 import android.view.MotionEvent;
 
 import org.distorted.library.type.Static2D;
+import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 import org.distorted.object.RubikObject;
 import org.distorted.object.RubikObjectMovement;
@@ -264,10 +265,10 @@ public class RubikSurfaceView extends GLSurfaceView
                                            Static4D touchPoint2 = new Static4D(x, y, 0, 0);
                                            Static4D rotatedTouchPoint2= rotateVectorByInvertedQuat(touchPoint2, mQuatAccumulated);
 
-                                           Static2D rot = mMovement.newRotation(rotatedTouchPoint2);
+                                           Static4D rot = mMovement.newRotation(rotatedTouchPoint2);
                                            RubikObject object = mRenderer.getObject();
 
-                                           object.beginNewRotation( (int)rot.get0(), (int)(object.getSize()*rot.get1()) );
+                                           object.beginNewRotation( new Static3D(rot.get0(),rot.get1(),rot.get2()), (int)(object.getSize()*rot.get3()) );
 
                                            if( RubikState.getCurrentState()==RubikState.SOLV )
                                              {
diff --git a/src/main/java/org/distorted/object/Cubit.java b/src/main/java/org/distorted/object/Cubit.java
index d1b83547..e0871669 100644
--- a/src/main/java/org/distorted/object/Cubit.java
+++ b/src/main/java/org/distorted/object/Cubit.java
@@ -233,7 +233,7 @@ class Cubit
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  Static4D returnRotationQuat(float qx,float qy,float qz)
+  Static4D returnRotationQuat( Static3D axis)
     {
     int pointNum = mRotationAngle.getNumPoints();
 
@@ -244,7 +244,7 @@ class Cubit
       double nearestAngleInRadians = nearestAngleInDegrees*Math.PI/180;
       float sinA =-(float)Math.sin(nearestAngleInRadians*0.5);
       float cosA = (float)Math.cos(nearestAngleInRadians*0.5);
-      return new Static4D(qx*sinA, qy*sinA, qz*sinA, cosA);
+      return new Static4D( axis.get0()*sinA, axis.get1()*sinA, axis.get2()*sinA, cosA);
       }
 
     return null;
diff --git a/src/main/java/org/distorted/object/RubikCube.java b/src/main/java/org/distorted/object/RubikCube.java
index cf61d3d0..015e7451 100644
--- a/src/main/java/org/distorted/object/RubikCube.java
+++ b/src/main/java/org/distorted/object/RubikCube.java
@@ -30,10 +30,6 @@ import org.distorted.library.mesh.MeshRectangles;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 
-import static org.distorted.object.RubikObjectList.VECTX;
-import static org.distorted.object.RubikObjectList.VECTY;
-import static org.distorted.object.RubikObjectList.VECTZ;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class RubikCube extends RubikObject
@@ -64,12 +60,12 @@ class RubikCube extends RubikObject
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// i.e. size^3 - (size-2)^3 - number of cubits in the outside wall of the Cube (we dont create or
-// render the inside0
+// i.e. size^3 - (size-2)^3 - number of cubits in the outside wall of the Cube (we don't create or
+// render the inside)
 
   int getNumCubits(int size)
     {
-    return 6*size*size - 12*size + 8;
+    return size>1 ? 6*size*size - 12*size + 8 : 1;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -109,14 +105,11 @@ class RubikCube extends RubikObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  boolean belongsToRotation( Static3D currentPosition, int vector, int row)
+  boolean belongsToRotation( Static3D currentPosition, Static3D axis, int row)
     {
-    switch(vector)
-      {
-      case VECTX: return currentPosition.get0()==row;
-      case VECTY: return currentPosition.get1()==row;
-      case VECTZ: return currentPosition.get2()==row;
-      }
+    if( axis.get0()!=0 ) return currentPosition.get0()==row;
+    if( axis.get1()!=0 ) return currentPosition.get1()==row;
+    if( axis.get2()!=0 ) return currentPosition.get2()==row;
 
     return false;
     }
diff --git a/src/main/java/org/distorted/object/RubikCubeMovement.java b/src/main/java/org/distorted/object/RubikCubeMovement.java
index 926205d2..8b71d044 100644
--- a/src/main/java/org/distorted/object/RubikCubeMovement.java
+++ b/src/main/java/org/distorted/object/RubikCubeMovement.java
@@ -19,25 +19,24 @@
 
 package org.distorted.object;
 
-import org.distorted.library.type.Static2D;
 import org.distorted.library.type.Static4D;
 
-import static org.distorted.object.RubikObjectList.VECTX;
-import static org.distorted.object.RubikObjectList.VECTY;
-import static org.distorted.object.RubikObjectList.VECTZ;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class RubikCubeMovement extends RubikObjectMovement
 {
     private final static int NONE   =-1;
-    private final static int FRONT  = 0;  // has to be 6 consecutive ints
-    private final static int BACK   = 1;  // FRONT ... BOTTOM
-    private final static int LEFT   = 2;  //
-    private final static int RIGHT  = 3;  //
+    private final static int FRONT  = 0;  //
+    private final static int BACK   = 1;  //
+    private final static int LEFT   = 2;  // has to be 6 consecutive ints
+    private final static int RIGHT  = 3;  // FRONT ... BOTTOM
     private final static int TOP    = 4;  //
     private final static int BOTTOM = 5;  //
 
+    private static final int VECTX  = 0;  //
+    private static final int VECTY  = 1;  // don't change this
+    private static final int VECTZ  = 2;  //
+
     private static final int[] VECT = {VECTX,VECTY,VECTZ};
 
     private float[] mPoint, mCamera, mDiff, mTouch;
@@ -192,7 +191,7 @@ class RubikCubeMovement extends RubikObjectMovement
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public Static2D newRotation(Static4D rotatedTouchPoint)
+    public Static4D newRotation(Static4D rotatedTouchPoint)
       {
       float cubeHalfSize= RubikObject.OBJECT_SCREEN_RATIO*0.5f;
 
@@ -215,7 +214,16 @@ class RubikCubeMovement extends RubikObjectMovement
       mTouch[1] = mPoint[1];
       mTouch[2] = mPoint[2];
 
-      return new Static2D(mRotationVect,offset);
+      Static4D result=null;
+
+      switch(mRotationVect)
+        {
+        case VECTX: result = new Static4D(1,0,0,offset); break;
+        case VECTY: result = new Static4D(0,1,0,offset); break;
+        case VECTZ: result = new Static4D(0,0,1,offset); break;
+        }
+
+      return result;
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/object/RubikObject.java b/src/main/java/org/distorted/object/RubikObject.java
index 5a7a31c0..029a0d78 100644
--- a/src/main/java/org/distorted/object/RubikObject.java
+++ b/src/main/java/org/distorted/object/RubikObject.java
@@ -37,8 +37,6 @@ import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 
-import static org.distorted.object.RubikObjectList.*;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public abstract class RubikObject extends DistortedNode
@@ -50,8 +48,8 @@ public abstract class RubikObject extends DistortedNode
   private static final int POST_ROTATION_MILLISEC = 500;
   private final int NUM_CUBITS;
   private final int[][] CUBIT_POSITIONS;
-  private int mRotAxis, mRotRow;
-
+  private int mRotRow;
+  private Static3D mRotAxis;
   private Static3D mMove, mScale, mNodeMove, mNodeScale;
   private Static4D mQuatAccumulated;
   private DistortedTexture mNodeTexture;
@@ -292,24 +290,15 @@ public abstract class RubikObject extends DistortedNode
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void beginNewRotation(int vector, int row )
+  public void beginNewRotation(Static3D axis, int row )
     {
-    Static3D axis = VectX;
-
-    switch(vector)
-      {
-      case VECTX: axis = VectX; break;
-      case VECTY: axis = VectY; break;
-      case VECTZ: axis = VectZ; break;
-      }
-
-    mRotAxis = vector;
+    mRotAxis = axis;
     mRotRow  = row;
 
     mRotationAngleStatic.set0(0.0f);
 
     for(int i=0; i<NUM_CUBITS; i++)
-      if( belongsToRotation( mCubits[i].mCurrentPosition,vector,mRotRow) )
+      if( belongsToRotation( mCubits[i].mCurrentPosition,axis,mRotRow) )
         {
         mCubits[i].beginNewRotation(axis);
         }
@@ -317,26 +306,18 @@ public abstract class RubikObject extends DistortedNode
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public long addNewRotation(int vector, int row, int angle, long durationMillis, EffectListener listener )
+  public long addNewRotation( Static3D axis, int row, int angle, long durationMillis, EffectListener listener )
      {
-     Static3D axis = VectX;
      long effectID=0;
      boolean first = true;
 
-     switch(vector)
-       {
-       case VECTX: axis = VectX; break;
-       case VECTY: axis = VectY; break;
-       case VECTZ: axis = VectZ; break;
-       }
-
-     mRotAxis = vector;
+     mRotAxis = axis;
      mRotRow  = row;
 
      mRotationAngleStatic.set0(0.0f);
 
      for(int i=0; i<NUM_CUBITS; i++)
-       if( belongsToRotation(mCubits[i].mCurrentPosition,vector,mRotRow) )
+       if( belongsToRotation(mCubits[i].mCurrentPosition,axis,mRotRow) )
          {
          mCubits[i].addNewRotation(axis,durationMillis,angle);
 
@@ -354,24 +335,16 @@ public abstract class RubikObject extends DistortedNode
 
   public void removeRotationNow()
      {
-     float qx=0,qy=0,qz=0;
      boolean first = true;
      Static4D quat = null;
 
-     switch(mRotAxis)
-       {
-       case VECTX: qx=1; break;
-       case VECTY: qy=1; break;
-       case VECTZ: qz=1; break;
-       }
-
      for(int i=0; i<NUM_CUBITS; i++)
        if( belongsToRotation(mCubits[i].mCurrentPosition,mRotAxis,mRotRow) )
          {
          if( first )
            {
            first = false;
-           quat = mCubits[i].returnRotationQuat(qx,qy,qz);
+           quat = mCubits[i].returnRotationQuat(mRotAxis);
            }
 
          mCubits[i].removeRotationNow(quat);
@@ -385,7 +358,7 @@ public abstract class RubikObject extends DistortedNode
   abstract int getNumCubits(int size);
   abstract int[][] getCubitPositions(int size);
   abstract float[] getLegalQuats();
-  abstract boolean belongsToRotation(Static3D position, int axis, int row);
+  abstract boolean belongsToRotation(Static3D position, Static3D axis, int row);
   abstract MeshCubes createMesh(int vertices,int x, int y, int z);
 
   public abstract void createTexture();
diff --git a/src/main/java/org/distorted/object/RubikObjectList.java b/src/main/java/org/distorted/object/RubikObjectList.java
index d37d860e..d03d1d10 100644
--- a/src/main/java/org/distorted/object/RubikObjectList.java
+++ b/src/main/java/org/distorted/object/RubikObjectList.java
@@ -22,7 +22,6 @@ package org.distorted.object;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshRectangles;
-import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 import org.distorted.magic.R;
 
@@ -38,13 +37,6 @@ public enum RubikObjectList
   CUBE5 ( 5, R.drawable.button5 , RubikCube.class, RubikCubeMovement.class),
   ;
 
-  public static final int VECTX = 0;  //
-  public static final int VECTY = 1;  // don't change this
-  public static final int VECTZ = 2;  //
-  static final Static3D VectX = new Static3D(1,0,0);
-  static final Static3D VectY = new Static3D(0,1,0);
-  static final Static3D VectZ = new Static3D(0,0,1);
-
   public static final int LENGTH = values().length;
   private final int mObjectSize, mIconID;
   final Class<? extends RubikObject> mObjectClass;
diff --git a/src/main/java/org/distorted/object/RubikObjectMovement.java b/src/main/java/org/distorted/object/RubikObjectMovement.java
index 487f2658..5801823b 100644
--- a/src/main/java/org/distorted/object/RubikObjectMovement.java
+++ b/src/main/java/org/distorted/object/RubikObjectMovement.java
@@ -19,7 +19,6 @@
 
 package org.distorted.object;
 
-import org.distorted.library.type.Static2D;
 import org.distorted.library.type.Static4D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -27,6 +26,6 @@ import org.distorted.library.type.Static4D;
 public abstract class RubikObjectMovement
   {
   public abstract boolean faceTouched(Static4D rotatedTouchPoint, Static4D rotatedCamera);
-  public abstract Static2D newRotation(Static4D rotatedTouchPoint);
+  public abstract Static4D newRotation(Static4D rotatedTouchPoint);
   public abstract float continueRotation(Static4D rotatedTouchPoint);
   }
