commit 97eb0852f487c2d74a3ae77cd49ed8333c8876c4
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Sep 6 22:29:00 2021 +0200

    Remove more statics from the Bandaged Cube classes.

diff --git a/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java b/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
index baae54d9..a410be79 100644
--- a/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
+++ b/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
@@ -44,8 +44,6 @@ abstract class TwistyBandagedAbstract extends TwistyObject
            new Static3D(0,0,1)
          };
 
-  private static final int[] BASIC_ANGLE = new int[] { 4,4,4 };
-
   private static final int[] FACE_COLORS = new int[]
          {
            COLOR_YELLOW, COLOR_WHITE,
@@ -53,46 +51,6 @@ abstract class TwistyBandagedAbstract extends TwistyObject
            COLOR_RED   , COLOR_ORANGE
          };
 
-  private static final Static4D[] QUATS = new Static4D[]
-         {
-         new Static4D(  0.0f,   0.0f,   0.0f,   1.0f),
-         new Static4D(  1.0f,   0.0f,   0.0f,   0.0f),
-         new Static4D(  0.0f,   1.0f,   0.0f,   0.0f),
-         new Static4D(  0.0f,   0.0f,   1.0f,   0.0f),
-
-         new Static4D( SQ2/2,  SQ2/2,  0.0f ,   0.0f),
-         new Static4D( SQ2/2, -SQ2/2,  0.0f ,   0.0f),
-         new Static4D( SQ2/2,   0.0f,  SQ2/2,   0.0f),
-         new Static4D(-SQ2/2,   0.0f,  SQ2/2,   0.0f),
-         new Static4D( SQ2/2,   0.0f,   0.0f,  SQ2/2),
-         new Static4D( SQ2/2,   0.0f,   0.0f, -SQ2/2),
-         new Static4D(  0.0f,  SQ2/2,  SQ2/2,   0.0f),
-         new Static4D(  0.0f,  SQ2/2, -SQ2/2,   0.0f),
-         new Static4D(  0.0f,  SQ2/2,   0.0f,  SQ2/2),
-         new Static4D(  0.0f,  SQ2/2,   0.0f, -SQ2/2),
-         new Static4D(  0.0f,   0.0f,  SQ2/2,  SQ2/2),
-         new Static4D(  0.0f,   0.0f,  SQ2/2, -SQ2/2),
-
-         new Static4D(  0.5f,   0.5f,   0.5f,   0.5f),
-         new Static4D(  0.5f,   0.5f,  -0.5f,   0.5f),
-         new Static4D(  0.5f,   0.5f,  -0.5f,  -0.5f),
-         new Static4D(  0.5f,  -0.5f,   0.5f,  -0.5f),
-         new Static4D( -0.5f,  -0.5f,  -0.5f,   0.5f),
-         new Static4D( -0.5f,   0.5f,  -0.5f,  -0.5f),
-         new Static4D( -0.5f,   0.5f,   0.5f,  -0.5f),
-         new Static4D( -0.5f,   0.5f,   0.5f,   0.5f)
-         };
-
-  private static final Static4D[] INIT_QUATS = new Static4D[]
-        {
-        new Static4D(  0.0f,   0.0f,   0.0f,   1.0f),  // NULL
-        new Static4D( SQ2/2,   0.0f,   0.0f, -SQ2/2),  // X
-        new Static4D(  0.0f,  SQ2/2,   0.0f, -SQ2/2),  // Y
-        new Static4D(  0.0f,   0.0f,  SQ2/2, -SQ2/2),  // Z
-        new Static4D( -0.5f,  +0.5f,  -0.5f,  +0.5f),  // ZX
-        new Static4D( +0.5f,  +0.5f,  +0.5f,  -0.5f),  // YX
-        };
-
   private static final int[][] mDimensions = new int[][]
         {
          {1,1,1},  // has to be X>=Z>=Y so that all
@@ -102,59 +60,18 @@ abstract class TwistyBandagedAbstract extends TwistyObject
          {2,2,2}
         };
 
-  private static final int[][] mStickerDimensions = new int[][]
-        {
-         {1,1},  // dimensions of the faces of
-         {2,1},  // the cuboids defined above
-         {3,1},
-         {2,2}
-        };
-
-  private static final int[][] mFaceMap = new int[][] // cubitface=2 when rotated by
-    {                                                 // quatIndex=1 gets moved to
-        {0,0,5,2,4,2},                                // position mFaceMap[2][1]
-        {1,1,4,3,5,3},
-        {2,4,2,1,1,4},
-        {3,5,3,0,0,5},
-        {4,3,0,4,3,0},
-        {5,2,1,5,2,1}
-    };
-
-  private static final int[][] mAxisMap = new int[][] // axis=1 when rotated by
-    {                                                 // quatIndex=2 gets moved to
-        {0,0,2,1,2,1},                                // axis mAxisMap[1][2]
-        {1,2,1,0,0,2},
-        {2,1,0,2,1,0}
-    };
-
-  private static final int NUM_STICKERS = mStickerDimensions.length;
-
-  private static final ObjectSticker[] mStickers;
-
-  static
-    {
-    mStickers = new ObjectSticker[NUM_STICKERS];
-
-    for(int s=0; s<NUM_STICKERS; s++)
-      {
-      float X = mStickerDimensions[s][0];
-      float Y = mStickerDimensions[s][1];
-      float MAX = Math.max(X,Y);
-      X /= (2*MAX);
-      Y /= (2*MAX);
-
-      float R = 0.10f / MAX;
-      float S = 0.08f / MAX;
-      float[] coords = { -X,-Y, +X,-Y, +X,+Y, -X,+Y};
-      float[] radii = new float[] {R,R,R,R};
-      mStickers[s] = new ObjectSticker(coords,null,radii,S);
-      }
-    }
+  private static final int NUM_STICKERS = 4;
 
+  private int[] mBasicAngle;
   private int mCurrState;
   private int mIndexExcluded;
   private int[][] mScrambleTable;
   private int[] mNumOccurences;
+  private Static4D[] mQuats;
+  private ObjectSticker[] mStickers;
+  private Static4D[] mInitQuats;
+  private int[][] mAxisMap;
+  private int[][] mFaceMap;
   ScrambleState[] mStates;
   float[][] POSITIONS;
   int[] QUAT_INDICES;
@@ -172,12 +89,48 @@ abstract class TwistyBandagedAbstract extends TwistyObject
   abstract float[][] getPositions();
   abstract int[] getQuatIndices();
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void initializeQuats()
+    {
+    mQuats = new Static4D[]
+         {
+         new Static4D(  0.0f,   0.0f,   0.0f,   1.0f),
+         new Static4D(  1.0f,   0.0f,   0.0f,   0.0f),
+         new Static4D(  0.0f,   1.0f,   0.0f,   0.0f),
+         new Static4D(  0.0f,   0.0f,   1.0f,   0.0f),
+
+         new Static4D( SQ2/2,  SQ2/2,  0.0f ,   0.0f),
+         new Static4D( SQ2/2, -SQ2/2,  0.0f ,   0.0f),
+         new Static4D( SQ2/2,   0.0f,  SQ2/2,   0.0f),
+         new Static4D(-SQ2/2,   0.0f,  SQ2/2,   0.0f),
+         new Static4D( SQ2/2,   0.0f,   0.0f,  SQ2/2),
+         new Static4D( SQ2/2,   0.0f,   0.0f, -SQ2/2),
+         new Static4D(  0.0f,  SQ2/2,  SQ2/2,   0.0f),
+         new Static4D(  0.0f,  SQ2/2, -SQ2/2,   0.0f),
+         new Static4D(  0.0f,  SQ2/2,   0.0f,  SQ2/2),
+         new Static4D(  0.0f,  SQ2/2,   0.0f, -SQ2/2),
+         new Static4D(  0.0f,   0.0f,  SQ2/2,  SQ2/2),
+         new Static4D(  0.0f,   0.0f,  SQ2/2, -SQ2/2),
+
+         new Static4D(  0.5f,   0.5f,   0.5f,   0.5f),
+         new Static4D(  0.5f,   0.5f,  -0.5f,   0.5f),
+         new Static4D(  0.5f,   0.5f,  -0.5f,  -0.5f),
+         new Static4D(  0.5f,  -0.5f,   0.5f,  -0.5f),
+         new Static4D( -0.5f,  -0.5f,  -0.5f,   0.5f),
+         new Static4D( -0.5f,   0.5f,  -0.5f,  -0.5f),
+         new Static4D( -0.5f,   0.5f,   0.5f,  -0.5f),
+         new Static4D( -0.5f,   0.5f,   0.5f,   0.5f)
+         };
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int[] getSolvedQuats(int cubit, int numLayers)
     {
+    if( mQuats==null ) initializeQuats();
     int status = retCubitSolvedStatus(cubit,numLayers);
-    return status<0 ? null : buildSolvedQuats(MovementCube.FACE_AXIS[status],QUATS);
+    return status<0 ? null : buildSolvedQuats(MovementCube.FACE_AXIS[status],mQuats);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -272,7 +225,20 @@ abstract class TwistyBandagedAbstract extends TwistyObject
 
   Static4D getQuat(int cubit, int numLayers)
     {
-    return INIT_QUATS[getQuatIndex(cubit)];
+    if( mInitQuats ==null )
+      {
+      mInitQuats = new Static4D[]
+        {
+        new Static4D(  0.0f,   0.0f,   0.0f,   1.0f),  // NULL
+        new Static4D( SQ2/2,   0.0f,   0.0f, -SQ2/2),  // X
+        new Static4D(  0.0f,  SQ2/2,   0.0f, -SQ2/2),  // Y
+        new Static4D(  0.0f,   0.0f,  SQ2/2, -SQ2/2),  // Z
+        new Static4D( -0.5f,  +0.5f,  -0.5f,  +0.5f),  // ZX
+        new Static4D( +0.5f,  +0.5f,  +0.5f,  -0.5f),  // YX
+        };
+      }
+
+    return mInitQuats[getQuatIndex(cubit)];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -308,6 +274,34 @@ abstract class TwistyBandagedAbstract extends TwistyObject
 
   ObjectSticker retSticker(int face)
     {
+    if( mStickers==null )
+      {
+      mStickers = new ObjectSticker[NUM_STICKERS];
+
+      int[][] stickerDimensions = new int[][]
+        {
+         {1,1},  // dimensions of the faces of
+         {2,1},  // the cuboids defined in mDimensions
+         {3,1},
+         {2,2}
+        };
+
+      for(int s=0; s<NUM_STICKERS; s++)
+        {
+        float X = stickerDimensions[s][0];
+        float Y = stickerDimensions[s][1];
+        float MAX = Math.max(X,Y);
+        X /= (2*MAX);
+        Y /= (2*MAX);
+
+        float R = 0.10f / MAX;
+        float S = 0.08f / MAX;
+        float[] coords = { -X,-Y, +X,-Y, +X,+Y, -X,+Y};
+        float[] radii = new float[] {R,R,R,R};
+        mStickers[s] = new ObjectSticker(coords,null,radii,S);
+        }
+      }
+
     return mStickers[face/NUM_FACES];
     }
 
@@ -330,7 +324,8 @@ abstract class TwistyBandagedAbstract extends TwistyObject
 
   Static4D[] getQuats()
     {
-    return QUATS;
+    if( mQuats==null ) initializeQuats();
+    return mQuats;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -424,6 +419,26 @@ abstract class TwistyBandagedAbstract extends TwistyObject
 
   int getFaceColor(int cubit, int cubitface, int numLayers)
     {
+    if( mFaceMap==null )
+      {
+      // cubitface=2 when rotated by quatIndex=1 gets moved to position mFaceMap[2][1]
+      mFaceMap = new int[][]
+          {
+              {0,0,5,2,4,2},
+              {1,1,4,3,5,3},
+              {2,4,2,1,1,4},
+              {3,5,3,0,0,5},
+              {4,3,0,4,3,0},
+              {5,2,1,5,2,1}
+          };
+      }
+
+    if( mAxisMap==null )
+      {
+      // axis=1 when rotated by quatIndex=2 gets moved to axis mAxisMap[1][2]
+      mAxisMap = new int[][] { {0,0,2,1,2,1}, {1,2,1,0,0,2}, {2,1,0,2,1,0} };
+      }
+
     int variant      = getCubitVariant(cubit,numLayers);
     int[] dim        = mDimensions[variant];
     float[] pos      = getCubitPosition(cubit);
@@ -441,7 +456,7 @@ abstract class TwistyBandagedAbstract extends TwistyObject
 
     boolean reaches  = multiplier*position + dim[dimIndex]*0.5f > (numLayers-1)*0.5f;
 
-    return reaches ? stickerIndex*NUM_FACES + face : NUM_STICKERS*NUM_FACES;
+    return reaches ? stickerIndex*NUM_FACES + face : NUM_TEXTURES;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -511,6 +526,7 @@ abstract class TwistyBandagedAbstract extends TwistyObject
 
   public int[] getBasicAngle()
     {
-    return BASIC_ANGLE;
+    if( mBasicAngle ==null ) mBasicAngle = new int[] { 4,4,4 };
+    return mBasicAngle;
     }
 }
