commit eab9d8f8658eb372a0a5ff48c6a65fb2ef672c06
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Sep 14 21:46:31 2020 +0100

    Progress with the Skewb.

diff --git a/src/main/java/org/distorted/objects/RubikCube.java b/src/main/java/org/distorted/objects/RubikCube.java
index 9e56da28..4e665e39 100644
--- a/src/main/java/org/distorted/objects/RubikCube.java
+++ b/src/main/java/org/distorted/objects/RubikCube.java
@@ -167,6 +167,13 @@ class RubikCube extends RubikObject
     return FACE_COLORS.length;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getNumStickerTypes()
+    {
+    return 1;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumCubitFaces()
diff --git a/src/main/java/org/distorted/objects/RubikDino.java b/src/main/java/org/distorted/objects/RubikDino.java
index c67aeac7..1eed8c20 100644
--- a/src/main/java/org/distorted/objects/RubikDino.java
+++ b/src/main/java/org/distorted/objects/RubikDino.java
@@ -266,6 +266,13 @@ public class RubikDino extends RubikObject
     return FACE_COLORS.length;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getNumStickerTypes()
+    {
+    return 1;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumCubitFaces()
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index 05e520aa..9792ca09 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -70,6 +70,7 @@ public abstract class RubikObject extends DistortedNode
   final Static4D[] QUATS;
   final Cubit[] CUBITS;
   final int NUM_FACES;
+  final int NUM_TEXTURES;
   final int NUM_CUBIT_FACES;
   final int NUM_AXIS;
   final int NUM_CUBITS;
@@ -122,6 +123,7 @@ public abstract class RubikObject extends DistortedNode
     mInitScreenRatio = mObjectScreenRatio;
     NUM_FACES = getNumFaces();
     NUM_CUBIT_FACES = getNumCubitFaces();
+    NUM_TEXTURES = getNumStickerTypes()*NUM_FACES;
 
     mSize = size;
     computeStartAndStep(mOrigPos);
@@ -385,7 +387,7 @@ public abstract class RubikObject extends DistortedNode
     Bitmap bitmap;
 
     Paint paint = new Paint();
-    bitmap = Bitmap.createBitmap( (NUM_FACES+1)*TEXTURE_HEIGHT, TEXTURE_HEIGHT, Bitmap.Config.ARGB_8888);
+    bitmap = Bitmap.createBitmap( (NUM_TEXTURES+1)*TEXTURE_HEIGHT, TEXTURE_HEIGHT, Bitmap.Config.ARGB_8888);
     Canvas canvas = new Canvas(bitmap);
 
     paint.setAntiAlias(true);
@@ -393,9 +395,9 @@ public abstract class RubikObject extends DistortedNode
     paint.setStyle(Paint.Style.FILL);
 
     paint.setColor(INTERIOR_COLOR);
-    canvas.drawRect(0, 0, (NUM_FACES+1)*TEXTURE_HEIGHT, TEXTURE_HEIGHT, paint);
+    canvas.drawRect(0, 0, (NUM_TEXTURES+1)*TEXTURE_HEIGHT, TEXTURE_HEIGHT, paint);
 
-    for(int i=0; i<NUM_FACES; i++)
+    for(int i=0; i<NUM_TEXTURES; i++)
       {
       createFaceTexture(canvas, paint, i, i*TEXTURE_HEIGHT, 0, TEXTURE_HEIGHT);
       }
@@ -486,7 +488,7 @@ public abstract class RubikObject extends DistortedNode
 
   public void resetAllTextureMaps()
     {
-    final float ratio = 1.0f/(NUM_FACES+1);
+    final float ratio = 1.0f/(NUM_TEXTURES+1);
     int color;
 
     for(int cubit=0; cubit<NUM_CUBITS; cubit++)
@@ -507,7 +509,7 @@ public abstract class RubikObject extends DistortedNode
 
   public void setTextureMap(int cubit, int face, int newColor)
     {
-    final float ratio = 1.0f/(NUM_FACES+1);
+    final float ratio = 1.0f/(NUM_TEXTURES+1);
     final Static4D[] maps = new Static4D[NUM_CUBIT_FACES];
 
     maps[face] = new Static4D( newColor*ratio, 0.0f, ratio, 1.0f);
@@ -686,6 +688,7 @@ public abstract class RubikObject extends DistortedNode
   abstract Static3D[] getCubitPositions(int size);
   abstract Static4D[] getQuats();
   abstract int getNumFaces();
+  abstract int getNumStickerTypes();
   abstract int getNumCubitFaces();
   abstract MeshBase createCubitMesh(int cubit);
   abstract void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top, int side);
diff --git a/src/main/java/org/distorted/objects/RubikPyraminx.java b/src/main/java/org/distorted/objects/RubikPyraminx.java
index 22e045d0..6413cd23 100644
--- a/src/main/java/org/distorted/objects/RubikPyraminx.java
+++ b/src/main/java/org/distorted/objects/RubikPyraminx.java
@@ -221,6 +221,13 @@ public class RubikPyraminx extends RubikObject
     return FACE_COLORS.length;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getNumStickerTypes()
+    {
+    return 1;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumCubitFaces()
diff --git a/src/main/java/org/distorted/objects/RubikSkewb.java b/src/main/java/org/distorted/objects/RubikSkewb.java
index f75cc12b..4dbc79d3 100644
--- a/src/main/java/org/distorted/objects/RubikSkewb.java
+++ b/src/main/java/org/distorted/objects/RubikSkewb.java
@@ -107,33 +107,33 @@ public class RubikSkewb extends RubikObject
            new Static3D(-0.5f,-0.5f, 0.5f ),
            new Static3D(-0.5f,-0.5f,-0.5f ),
 
-           new Static3D( 0.5f, 0.0f, 0.0f ),
-           new Static3D(-0.5f, 0.0f, 0.0f ),
-           new Static3D( 0.0f, 0.5f, 0.0f ),
-           new Static3D( 0.0f,-0.5f, 0.0f ),
-           new Static3D( 0.0f, 0.0f, 0.5f ),
-           new Static3D( 0.0f, 0.0f,-0.5f ),
+           new Static3D( 0.49f, 0.0f, 0.0f ),
+           new Static3D(-0.49f, 0.0f, 0.0f ),
+           new Static3D( 0.0f, 0.49f, 0.0f ),
+           new Static3D( 0.0f,-0.49f, 0.0f ),
+           new Static3D( 0.0f, 0.0f, 0.49f ),
+           new Static3D( 0.0f, 0.0f,-0.49f ),
          };
 
   // Colors of the faces of cubits. Each cubit, even the face pyramid, has 6 faces
   // (the face has one extra 'fake' face so that everything would have the same number)
   private static final int[][] mFaceMap = new int[][]
          {
-           { 4,2,0, 6,6,6 },
-           { 2,5,0, 6,6,6 },
-           { 3,4,0, 6,6,6 },
-           { 5,3,0, 6,6,6 },
-           { 1,2,4, 6,6,6 },
-           { 5,2,1, 6,6,6 },
-           { 4,3,1, 6,6,6 },
-           { 1,3,5, 6,6,6 },
-
-           { 0, 6,6,6,6,6 },
-           { 1, 6,6,6,6,6 },
-           { 2, 6,6,6,6,6 },
-           { 3, 6,6,6,6,6 },
-           { 4, 6,6,6,6,6 },
-           { 5, 6,6,6,6,6 },
+           { 4,2,0, 12,12,12 },
+           { 2,5,0, 12,12,12 },
+           { 3,4,0, 12,12,12 },
+           { 5,3,0, 12,12,12 },
+           { 1,2,4, 12,12,12 },
+           { 5,2,1, 12,12,12 },
+           { 4,3,1, 12,12,12 },
+           { 1,3,5, 12,12,12 },
+
+           { 6 , 12,12,12,12,12 },
+           { 7 , 12,12,12,12,12 },
+           { 8 , 12,12,12,12,12 },
+           { 9 , 12,12,12,12,12 },
+           { 10, 12,12,12,12,12 },
+           { 11, 12,12,12,12,12 },
          };
 
   private static MeshBase mCornerMesh, mFaceMesh;
@@ -174,9 +174,9 @@ public class RubikSkewb extends RubikObject
     meshes[2].setEffectAssociation(0,4,0);
 
     float[] vertices1 = { 0,0, F,0, F/2,(SQ3/2)*F };
-    float[] bands1 = { 1.0f, 0.0f, 0.0f, 0.0f };
+    float[] bands1 = { 1.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f };
 
-    meshes[3] = new MeshPolygon(vertices1,bands1,0,0);
+    meshes[3] = new MeshPolygon(vertices1,bands1,1,5);
     meshes[3].setEffectAssociation(0,8,0);
     meshes[4] = meshes[3].copy(true);
     meshes[4].setEffectAssociation(0,16,0);
@@ -281,13 +281,13 @@ public class RubikSkewb extends RubikObject
     float E = SQ2/4;
     float[] vertices0 = { -E,-E, +E,-E, +E,+E, -E,+E };
 
-    float[] bands0 = { 1.0f    ,0,
-                       1.0f-D/2,D*0.45f,
-                       1.0f-D  ,D*0.75f,
-                       1.0f-2*D,D,
-                       0.60f, 0.052f,
-                       0.30f, 0.060f,
-                       0.0f, 0.065f };
+    float[] bands0 = { 1.0f    , 0,
+                       1.0f-D/2, D*0.30f,
+                       1.0f- D , D*0.50f,
+                       1.0f-2*D, D*0.80f,
+                       0.60f   , D*1.40f,
+                       0.30f   , D*1.60f,
+                       0.0f    , D*1.70f };
 
     MeshBase[] meshes = new MeshBase[FACES_PER_CUBIT];
     meshes[0] = new MeshPolygon(vertices0, bands0, 3, 3);
@@ -296,7 +296,7 @@ public class RubikSkewb extends RubikObject
     association <<= 1;
 
     float[] vertices1 = { -E,-SQ3*E, +E,-SQ3*E, 0,0 };
-    float[] bands1 = { 1.0f, 0.0f, 0.0f, 0.0f };
+    float[] bands1 = { 1.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f };
 
     meshes[1] = new MeshPolygon(vertices1,bands1,0,0);
     meshes[1].setEffectAssociation(0,association,0);
@@ -319,7 +319,7 @@ public class RubikSkewb extends RubikObject
     Static3D axis2   = new Static3D(0,0,1);
     float angle = -(float)((180.0f/Math.PI)*Math.acos(SQ3/3));
 
-    float f = 0.06f;
+    float f = 0.05f;
     float r = 0.10f;
     float d = 0.5f;
     float e = +D*0.6f;
@@ -394,6 +394,14 @@ public class RubikSkewb extends RubikObject
     return FACE_COLORS.length;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Each face has two types of a texture: the central square and the triangle in the corner.
+
+  int getNumStickerTypes()
+    {
+    return 2;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumCubitFaces()
@@ -464,13 +472,54 @@ public class RubikSkewb extends RubikObject
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
 
   void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top, int side)
     {
-    paint.setColor(FACE_COLORS[face]);
-    paint.setStyle(Paint.Style.FILL);
-    canvas.drawRect(left,top,left+side,top+side,paint);
+    int COLORS = FACE_COLORS.length;
+
+    if( face<COLORS )
+      {
+      float STROKE = 0.035f*side;
+      float L= left+0.125f*side;
+      float H= 0.375f*side;
+      float LEN = 0.5f*side;
+
+      paint.setAntiAlias(true);
+      paint.setStrokeWidth(STROKE);
+      paint.setColor(FACE_COLORS[face]);
+      paint.setStyle(Paint.Style.FILL);
+
+      canvas.drawRect(left,top,left+side,top+side,paint);
+
+      paint.setColor(INTERIOR_COLOR);
+      paint.setStyle(Paint.Style.STROKE);
+
+      canvas.drawLine( L    , H,  L+LEN, H    , paint);
+      canvas.drawLine( L    , H,  L+LEN, H+LEN, paint);
+      canvas.drawLine( L+LEN, H,  L+LEN, H+LEN, paint);
+
+      float S1 = 0.125f*side;
+      float S2 = 0.070f*side;
+      float X  = 0.7f*S2;
+
+      float LA = left+0.625f*side;
+      float RA = left+0.125f*side;
+      float TA = 0.375f*side;
+      float BA = 0.875f*side;
+
+      canvas.drawArc( LA-S1, TA     , LA     , TA+S1, 270, 90, false, paint);
+      canvas.drawArc( RA+X , TA     , RA+X+S2, TA+S2, 135,135, false, paint);
+      canvas.drawArc( LA-S2, BA-X-S2, LA     , BA-X ,   0,135, false, paint);
+      }
+    else
+      {
+      final float R = (SQ2/2)*side*0.10f;
+      final float M = side*(0.5f-SQ2/4+0.018f);
+
+      paint.setColor(FACE_COLORS[face-COLORS]);
+      paint.setStyle(Paint.Style.FILL);
+      canvas.drawRoundRect( left+M, top+M, left+side-M, top+side-M, R, R, paint);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
