commit 76c2bd075380be7e9066a4d0f80144b49bd02a7d
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Sep 30 19:08:58 2020 +0100

    Simplify drawing textures.

diff --git a/src/main/java/org/distorted/objects/TwistyCube.java b/src/main/java/org/distorted/objects/TwistyCube.java
index 9ffeb221..6d49225a 100644
--- a/src/main/java/org/distorted/objects/TwistyCube.java
+++ b/src/main/java/org/distorted/objects/TwistyCube.java
@@ -129,11 +129,12 @@ class TwistyCube extends TwistyObject
 
   void createFaceTexture(Canvas canvas, Paint paint, int face, int left)
     {
-    final float R = TEXTURE_HEIGHT*0.10f;
-    final float M = TEXTURE_HEIGHT*0.05f;
+    float F =  0.5f;
+    float R = 0.10f;
+    float S = 0.10f;
+    float[] vertices = { -F,-F, +F,-F, +F,+F, -F,+F};
 
-    paint.setColor(FACE_COLORS[face]);
-    canvas.drawRoundRect( left+M, M, left+TEXTURE_HEIGHT-M, TEXTURE_HEIGHT-M, R, R, paint);
+    drawRoundedPolygon(canvas, paint, left, vertices, S, FACE_COLORS[face], R);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyDiamond.java b/src/main/java/org/distorted/objects/TwistyDiamond.java
index db472e93..1bc333c0 100644
--- a/src/main/java/org/distorted/objects/TwistyDiamond.java
+++ b/src/main/java/org/distorted/objects/TwistyDiamond.java
@@ -248,37 +248,13 @@ public class TwistyDiamond extends TwistyObject
 
   void createFaceTexture(Canvas canvas, Paint paint, int face, int left)
     {
-    float STROKE = 0.044f*TEXTURE_HEIGHT;
-    float OFF = STROKE/2 -1;
-    float OFF2 = 0.5f*TEXTURE_HEIGHT + OFF;
-    float HEIGHT = TEXTURE_HEIGHT - OFF;
-    float RADIUS = TEXTURE_HEIGHT/12.0f;
-    float ARC1_H = 0.2f*TEXTURE_HEIGHT;
-    float ARC1_W = TEXTURE_HEIGHT*0.5f;
-    float ARC2_W = 0.153f*TEXTURE_HEIGHT;
-    float ARC2_H = 0.905f*TEXTURE_HEIGHT;
-    float ARC3_W = TEXTURE_HEIGHT-ARC2_W;
-
-    float M = SQ3/2;
-    float D = (M/2 - 0.51f)*TEXTURE_HEIGHT;
-
-    paint.setAntiAlias(true);
-    paint.setStrokeWidth(STROKE);
-    paint.setColor(FACE_COLORS[face]);
-    paint.setStyle(Paint.Style.FILL);
-
-    canvas.drawRect(left,0,left+TEXTURE_HEIGHT,TEXTURE_HEIGHT,paint);
-
-    paint.setColor(INTERIOR_COLOR);
-    paint.setStyle(Paint.Style.STROKE);
-
-    canvas.drawLine(                     left,         M*HEIGHT+D,  TEXTURE_HEIGHT       +left, M*HEIGHT+D, paint);
-    canvas.drawLine(                OFF +left, M*TEXTURE_HEIGHT+D,                 OFF2  +left,          D, paint);
-    canvas.drawLine((TEXTURE_HEIGHT-OFF)+left, M*TEXTURE_HEIGHT+D, (TEXTURE_HEIGHT-OFF2) +left,          D, paint);
-
-    canvas.drawArc( ARC1_W-RADIUS+left, M*(ARC1_H-RADIUS)+D, ARC1_W+RADIUS+left, M*(ARC1_H+RADIUS)+D, 225, 90, false, paint);
-    canvas.drawArc( ARC2_W-RADIUS+left, M*(ARC2_H-RADIUS)+D, ARC2_W+RADIUS+left, M*(ARC2_H+RADIUS)+D, 105, 90, false, paint);
-    canvas.drawArc( ARC3_W-RADIUS+left, M*(ARC2_H-RADIUS)+D, ARC3_W+RADIUS+left, M*(ARC2_H+RADIUS)+D, 345, 90, false, paint);
+    float E = SQ3/2;
+    float F =  0.5f;
+    float R = 0.06f;
+    float S = 0.07f;
+    float[] vertices = { -F,-E/3, +F,-E/3, 0.0f,2*E/3};
+
+    drawRoundedPolygon(canvas, paint, left, vertices, S, FACE_COLORS[face], R);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyDino.java b/src/main/java/org/distorted/objects/TwistyDino.java
index 032acc6e..015c7563 100644
--- a/src/main/java/org/distorted/objects/TwistyDino.java
+++ b/src/main/java/org/distorted/objects/TwistyDino.java
@@ -208,38 +208,12 @@ public abstract class TwistyDino extends TwistyObject
 
   void createFaceTexture(Canvas canvas, Paint paint, int face, int left)
     {
-    float STROKE = 0.04f*TEXTURE_HEIGHT;
-    float L= left;
-    float H= 0.333f*TEXTURE_HEIGHT;
-    float LEN = 0.5f*TEXTURE_HEIGHT;
-
-    paint.setAntiAlias(true);
-    paint.setStrokeWidth(STROKE);
-    paint.setColor(FACE_COLORS[face]);
-    paint.setStyle(Paint.Style.FILL);
-
-    canvas.drawRect(left,0,left+TEXTURE_HEIGHT,TEXTURE_HEIGHT,paint);
-
-    paint.setColor(INTERIOR_COLOR);
-    paint.setStyle(Paint.Style.STROKE);
-
-    canvas.drawLine( L      , H,  L+2*LEN, H    , paint);
-    canvas.drawLine( L      , H,  L+  LEN, H+LEN, paint);
-    canvas.drawLine( L+2*LEN, H,  L+  LEN, H+LEN, paint);
-
-    float S1 = 0.150f*TEXTURE_HEIGHT;
-    float S2 = 0.090f*TEXTURE_HEIGHT;
-    float X  = 0.7f*S2;
-    float Y  = 0.2f*S1;
-
-    float LA = left+0.500f*TEXTURE_HEIGHT;
-    float RA = left;
-    float TA = 0.333f*TEXTURE_HEIGHT;
-    float BA = 0.833f*TEXTURE_HEIGHT;
-
-    canvas.drawArc( RA+X                  , TA     , RA+X+S2            , TA+S2, 135,135, false, paint);
-    canvas.drawArc( RA+TEXTURE_HEIGHT-S2-X, TA     , RA+TEXTURE_HEIGHT-X, TA+S2, 270,135, false, paint);
-    canvas.drawArc( LA-S1/2               , BA-S1-Y, LA+S1/2            , BA-Y ,  45, 90, false, paint);
+    float F = 0.5f;
+    float R = 0.035f;
+    float S = 0.05f;
+    float[] vertices = { -F,F/3, 0,-2*F/3, +F,F/3 };
+
+    drawRoundedPolygon(canvas, paint, left, vertices, S, FACE_COLORS[face], R);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyHelicopter.java b/src/main/java/org/distorted/objects/TwistyHelicopter.java
index bb31a605..12c475a5 100644
--- a/src/main/java/org/distorted/objects/TwistyHelicopter.java
+++ b/src/main/java/org/distorted/objects/TwistyHelicopter.java
@@ -287,37 +287,12 @@ public class TwistyHelicopter extends TwistyObject
 
   void createFaceTexture(Canvas canvas, Paint paint, int face, int left)
     {
-    float STROKE = 0.035f*TEXTURE_HEIGHT;
-    float L= left+0.125f*TEXTURE_HEIGHT;
-    float H= 0.375f*TEXTURE_HEIGHT;
-    float LEN = 0.5f*TEXTURE_HEIGHT;
+    float R = 0.025f;
+    float S = 0.035f;
+    float E = 0.5f;
+    float[] vertices = { -E+E/4,E/4, E/4,-E+E/4, E/4,E/4};
 
-    paint.setAntiAlias(true);
-    paint.setStrokeWidth(STROKE);
-    paint.setColor(FACE_COLORS[face]);
-    paint.setStyle(Paint.Style.FILL);
-
-    canvas.drawRect(left,0,left+TEXTURE_HEIGHT,TEXTURE_HEIGHT,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*TEXTURE_HEIGHT;
-    float S2 = 0.070f*TEXTURE_HEIGHT;
-    float X  = 0.7f*S2;
-
-    float LA = left+0.625f*TEXTURE_HEIGHT;
-    float RA = left+0.125f*TEXTURE_HEIGHT;
-    float TA = 0.375f*TEXTURE_HEIGHT;
-    float BA = 0.875f*TEXTURE_HEIGHT;
-
-    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);
+    drawRoundedPolygon(canvas, paint, left, vertices, S, FACE_COLORS[face], R);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyObject.java b/src/main/java/org/distorted/objects/TwistyObject.java
index bbda57ea..62cb6352 100644
--- a/src/main/java/org/distorted/objects/TwistyObject.java
+++ b/src/main/java/org/distorted/objects/TwistyObject.java
@@ -341,9 +341,113 @@ public abstract class TwistyObject extends DistortedNode
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void drawRoundedPolygon()
+  private float computeAngle(float dx, float dy)
     {
+    float PI = (float)Math.PI;
+    double angle = Math.atan2(dy,dx);
+    float ret = (float)(3*PI/2-angle);
 
+    if( ret>2*PI ) ret-= 2*PI;
+
+    return ret;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void drawCurrVertex(Canvas canvas, Paint paint, float left, float r, float stroke, float pX,float pY, float cX, float cY, float nX, float nY)
+    {
+    pX = (0.5f+pX)*TEXTURE_HEIGHT;
+    pY = (0.5f-pY)*TEXTURE_HEIGHT;
+    cX = (0.5f+cX)*TEXTURE_HEIGHT;
+    cY = (0.5f-cY)*TEXTURE_HEIGHT;
+    nX = (0.5f+nX)*TEXTURE_HEIGHT;
+    nY = (0.5f-nY)*TEXTURE_HEIGHT;
+
+    canvas.drawLine(left+pX,pY,left+cX,cY,paint);
+
+    float aX = pX-cX;
+    float aY = pY-cY;
+    float bX = cX-nX;
+    float bY = cY-nY;
+
+    float aLen = (float)Math.sqrt(aX*aX+aY*aY);
+    float bLen = (float)Math.sqrt(bX*bX+bY*bY);
+
+    aX /= aLen;
+    aY /= aLen;
+    bX /= bLen;
+    bY /= bLen;
+
+    float sX = (aX-bX)/2;
+    float sY = (aY-bY)/2;
+    float sLen = (float)Math.sqrt(sX*sX+sY*sY);
+    sX /= sLen;
+    sY /= sLen;
+
+    float startAngle = computeAngle(bX,-bY);
+    float endAngle   = computeAngle(aX,-aY);
+    float sweepAngle = endAngle-startAngle;
+    if( sweepAngle<0 ) sweepAngle += 2*Math.PI;
+
+    float R = r*TEXTURE_HEIGHT+stroke/2;
+
+    float A = (float)(R/(Math.cos(sweepAngle/2)));
+
+    float rX = cX + A*sX;
+    float rY = cY + A*sY;
+
+    startAngle *= 180/(Math.PI);
+    sweepAngle *= 180/(Math.PI);
+
+    canvas.drawArc( left+rX-R, rY-R, left+rX+R, rY+R, startAngle, sweepAngle, false, paint);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void drawRoundedPolygon(Canvas canvas, Paint paint, int left, float[] vertices, float stroke, int color, float r)
+    {
+    stroke *= TEXTURE_HEIGHT;
+
+    paint.setAntiAlias(true);
+    paint.setStrokeWidth(stroke);
+    paint.setColor(color);
+    paint.setStyle(Paint.Style.FILL);
+
+    canvas.drawRect(left,0,left+TEXTURE_HEIGHT,TEXTURE_HEIGHT,paint);
+
+    paint.setColor(INTERIOR_COLOR);
+    paint.setStyle(Paint.Style.STROKE);
+
+    int length = vertices.length;
+    int numVertices = length/2;
+
+    float prevX = vertices[length-2];
+    float prevY = vertices[length-1];
+    float currX = vertices[0];
+    float currY = vertices[1];
+    float nextX = vertices[2];
+    float nextY = vertices[3];
+
+    for(int vert=0; vert<numVertices; vert++)
+      {
+      drawCurrVertex(canvas, paint, left, r, stroke, prevX,prevY,currX,currY,nextX,nextY);
+
+      prevX = currX;
+      prevY = currY;
+      currX = nextX;
+      currY = nextY;
+
+      if( 2*(vert+2)+1 < length )
+        {
+        nextX = vertices[2*(vert+2)  ];
+        nextY = vertices[2*(vert+2)+1];
+        }
+      else
+        {
+        nextX = vertices[0];
+        nextY = vertices[1];
+        }
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyPyraminx.java b/src/main/java/org/distorted/objects/TwistyPyraminx.java
index ba3be6f4..f156c496 100644
--- a/src/main/java/org/distorted/objects/TwistyPyraminx.java
+++ b/src/main/java/org/distorted/objects/TwistyPyraminx.java
@@ -236,37 +236,13 @@ public class TwistyPyraminx extends TwistyObject
 
   void createFaceTexture(Canvas canvas, Paint paint, int face, int left)
     {
-    float STROKE = 0.044f*TEXTURE_HEIGHT;
-    float OFF = STROKE/2 -1;
-    float OFF2 = 0.5f*TEXTURE_HEIGHT + OFF;
-    float HEIGHT = TEXTURE_HEIGHT - OFF;
-    float RADIUS = TEXTURE_HEIGHT/12.0f;
-    float ARC1_H = 0.2f*TEXTURE_HEIGHT;
-    float ARC1_W = TEXTURE_HEIGHT*0.5f;
-    float ARC2_W = 0.153f*TEXTURE_HEIGHT;
-    float ARC2_H = 0.905f*TEXTURE_HEIGHT;
-    float ARC3_W = TEXTURE_HEIGHT-ARC2_W;
-
-    float M = SQ3/2;
-    float D = (M/2 - 0.51f)*TEXTURE_HEIGHT;
-
-    paint.setAntiAlias(true);
-    paint.setStrokeWidth(STROKE);
-    paint.setColor(FACE_COLORS[face]);
-    paint.setStyle(Paint.Style.FILL);
-
-    canvas.drawRect(left,0,left+TEXTURE_HEIGHT,TEXTURE_HEIGHT,paint);
-
-    paint.setColor(INTERIOR_COLOR);
-    paint.setStyle(Paint.Style.STROKE);
-
-    canvas.drawLine(                     left, M*HEIGHT        +D,  TEXTURE_HEIGHT       +left, M*HEIGHT+D, paint);
-    canvas.drawLine(                OFF +left, M*TEXTURE_HEIGHT+D,                 OFF2  +left,          D, paint);
-    canvas.drawLine((TEXTURE_HEIGHT-OFF)+left, M*TEXTURE_HEIGHT+D, (TEXTURE_HEIGHT-OFF2) +left,          D, paint);
-
-    canvas.drawArc( ARC1_W-RADIUS+left, M*(ARC1_H-RADIUS)+D, ARC1_W+RADIUS+left, M*(ARC1_H+RADIUS)+D, 225, 90, false, paint);
-    canvas.drawArc( ARC2_W-RADIUS+left, M*(ARC2_H-RADIUS)+D, ARC2_W+RADIUS+left, M*(ARC2_H+RADIUS)+D, 105, 90, false, paint);
-    canvas.drawArc( ARC3_W-RADIUS+left, M*(ARC2_H-RADIUS)+D, ARC3_W+RADIUS+left, M*(ARC2_H+RADIUS)+D, 345, 90, false, paint);
+    float E = SQ3/2;
+    float F =  0.5f;
+    float R = 0.06f;
+    float S = 0.08f;
+    float[] vertices = { -F,-E/3, +F,-E/3, 0.0f,2*E/3};
+
+    drawRoundedPolygon(canvas, paint, left, vertices, S, FACE_COLORS[face], R);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistySkewb.java b/src/main/java/org/distorted/objects/TwistySkewb.java
index 8334b709..a091e341 100644
--- a/src/main/java/org/distorted/objects/TwistySkewb.java
+++ b/src/main/java/org/distorted/objects/TwistySkewb.java
@@ -253,46 +253,19 @@ public class TwistySkewb extends TwistyObject
 
     if( face<COLORS )
       {
-      float STROKE = 0.035f*TEXTURE_HEIGHT;
-      float L= left+0.125f*TEXTURE_HEIGHT;
-      float H= 0.375f*TEXTURE_HEIGHT;
-      float LEN = 0.5f*TEXTURE_HEIGHT;
-
-      paint.setAntiAlias(true);
-      paint.setStrokeWidth(STROKE);
-      paint.setColor(FACE_COLORS[face]);
-      paint.setStyle(Paint.Style.FILL);
-
-      canvas.drawRect(left,0,left+TEXTURE_HEIGHT,TEXTURE_HEIGHT,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*TEXTURE_HEIGHT;
-      float S2 = 0.070f*TEXTURE_HEIGHT;
-      float X  = 0.7f*S2;
-
-      float LA = left+0.625f*TEXTURE_HEIGHT;
-      float RA = left+0.125f*TEXTURE_HEIGHT;
-      float TA = 0.375f*TEXTURE_HEIGHT;
-      float BA = 0.875f*TEXTURE_HEIGHT;
-
-      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);
+      float R = 0.025f;
+      float S = 0.035f;
+      float E = 0.5f;
+      float[] vertices = { -E+E/4,E/4, E/4,-E+E/4, E/4,E/4};
+      drawRoundedPolygon(canvas, paint, left, vertices, S, FACE_COLORS[face], R);
       }
     else
       {
-      final float R = (SQ2/2)*TEXTURE_HEIGHT*0.10f;
-      final float M = TEXTURE_HEIGHT*(0.5f-SQ2/4+0.018f);
-
-      paint.setColor(FACE_COLORS[face-COLORS]);
-      paint.setStyle(Paint.Style.FILL);
-      canvas.drawRoundRect( left+M, M, left+TEXTURE_HEIGHT-M, TEXTURE_HEIGHT-M, R, R, paint);
+      float R = 0.055f;
+      float S = 0.035f;
+      float E = SQ2/4;
+      float[] vertices = { -E,-E, +E,-E, +E,+E, -E,+E };
+      drawRoundedPolygon(canvas, paint, left, vertices, S, FACE_COLORS[face-COLORS], R);
       }
     }
 
