commit e35247b8d4b008abaa68dc8d8cac9902f9bc6fda
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Sep 10 15:06:01 2020 +0100

    Improve Pyraminx Mesh

diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 3e3d4c7f..fe4949f0 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -284,6 +284,7 @@ public class RubikActivity extends AppCompatActivity
         RubikObjectList oldList = oldObject.getObjectList();
         int oldSize = oldObject.getSize();
         float fps = view.getRenderer().getFPS();
+        fps = (int)(fps+0.5f);
         StringBuilder name = new StringBuilder();
         name.append(oldList.name());
         name.append('_');
diff --git a/src/main/java/org/distorted/objects/RubikPyraminx.java b/src/main/java/org/distorted/objects/RubikPyraminx.java
index eb7c979d..0985ec22 100644
--- a/src/main/java/org/distorted/objects/RubikPyraminx.java
+++ b/src/main/java/org/distorted/objects/RubikPyraminx.java
@@ -26,7 +26,7 @@ import android.graphics.Paint;
 import org.distorted.library.effect.VertexEffectDeform;
 import org.distorted.library.effect.VertexEffectMove;
 import org.distorted.library.effect.VertexEffectRotate;
-import org.distorted.library.effect.VertexEffectScale;
+import org.distorted.library.effect.VertexEffectSink;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshBase;
@@ -253,49 +253,46 @@ public class RubikPyraminx extends RubikObject
     final int MESHES=4;
 
     int size = getSize();
-
     int association = 1;
-    MeshBase[] meshes;
 
-    float D = 0.005f;
-    float E = 0.5f - D*SQ2;
+    float D = 0.0003f;
+    float E = SQ3/2 - 3*D*SQ2;
     float F = 0.5f - D*SQ2*SQ3;
-    float G = 0.006f;
     float[] bands;
     int extraI, extraV;
 
-    float[] vertices = { -F,-E, +F,-E, 0.0f,E-D*SQ2};
+    float[] vertices = { -F,-E/3, +F,-E/3, 0.0f,2*E/3};
 
     switch(size)
       {
-      case 3 : bands = new float[] { 1.0f    ,-G,
-                                     1.0f-G/2,-G*0.55f,
-                                     1.0f-G  ,-G*0.25f,
-                                     1.0f-2*G,+G*0.25f,
-                                     0.50f, 0.050f,
-                                     0.0f, 0.055f };
+      case 3 : bands = new float[] { 1.0f    ,-D,
+                                     1.0f  -D,-D*0.80f,
+                                     1.0f-2*D,-D*0.65f,
+                                     1.0f-4*D,+D*0.10f,
+                                     0.50f, 0.035f,
+                                     0.0f, 0.040f };
                       extraI = 2;
                       extraV = 2;
                       break;
-      case 4 : bands = new float[] { 1.0f    ,-G,
-                                     1.0f-G*1.2f,-G*0.55f,
-                                     1.0f-2*G, +G*0.25f,
-                                     0.50f, 0.050f,
-                                     0.0f, 0.055f };
+      case 4 : bands = new float[] { 1.0f    ,-D,
+                                     1.0f-D*1.2f,-D*0.70f,
+                                     1.0f-3*D, -D*0.15f,
+                                     0.50f, 0.035f,
+                                     0.0f, 0.040f };
                       extraI = 2;
                       extraV = 2;
                       break;
-      default: bands = new float[] { 1.0f    ,-G,
-                                     1.0f-G*1.2f,-G*0.55f,
-                                     1.0f-2*G, +G*0.25f,
-                                     0.50f, 0.050f,
-                                     0.0f, 0.055f };
+      default: bands = new float[] { 1.0f    ,-D,
+                                     1.0f-D*1.2f,-D*0.70f,
+                                     1.0f-3*D, -D*0.15f,
+                                     0.50f, 0.035f,
+                                     0.0f, 0.040f };
                       extraI = 2;
                       extraV = 1;
                       break;
       }
 
-    meshes = new MeshPolygon[MESHES];
+    MeshBase[] meshes = new MeshPolygon[MESHES];
     meshes[0] = new MeshPolygon(vertices, bands, extraI,extraV);
     meshes[0].setEffectAssociation(0,association,0);
 
@@ -315,8 +312,10 @@ public class RubikPyraminx extends RubikObject
 
     float tetraHeight = SQ2*SQ3/3;
     float d1 = (0.75f-2*SQ2*D)*tetraHeight;
-    float d2 =-0.10f*tetraHeight;
-    float d3 = 0.20f*tetraHeight;
+    float d2 =-0.06f*tetraHeight;
+    float d3 = 0.05f*tetraHeight;
+    float d4 = 0.70f*tetraHeight;
+    float d5 = 1.2f;
 
     Static3D dCen0 = new Static3D( d1*a0.get0(), d1*a0.get1(), d1*a0.get2() );
     Static3D dCen1 = new Static3D( d1*a1.get0(), d1*a1.get1(), d1*a1.get2() );
@@ -330,6 +329,9 @@ public class RubikPyraminx extends RubikObject
 
     Static4D dReg  = new Static4D(0,0,0,d3);
     Static1D dRad  = new Static1D(1);
+    Static3D center= new Static3D(0,0,0);
+    Static4D sReg  = new Static4D(0,0,0,d4);
+    Static1D sink  = new Static1D(d5);
 
     Static1D angle  = new Static1D(angleFaces);
     Static3D axis1  = new Static3D(  -1, 0,      0);
@@ -338,23 +340,24 @@ public class RubikPyraminx extends RubikObject
     Static3D center1= new Static3D(0,-SQ3*SQ2/12,-SQ3/6);
     Static3D center2= new Static3D(0,-SQ3*SQ2/12,+SQ3/3);
 
-    VertexEffectScale   effect1 = new VertexEffectScale ( new Static3D(1,SQ3/2,1) );
-    VertexEffectRotate  effect2 = new VertexEffectRotate( new Static1D(90), new Static3D(1,0,0), new Static3D(0,0,0) );
-    VertexEffectMove    effect3 = new VertexEffectMove  ( new Static3D(0,-SQ3*SQ2/12,SQ3/12) );
-    VertexEffectRotate  effect4 = new VertexEffectRotate( new Static1D(180), new Static3D(0,0,1), center1 );
-    VertexEffectRotate  effect5 = new VertexEffectRotate( angle, axis1, center1 );
-    VertexEffectRotate  effect6 = new VertexEffectRotate( angle, axis2, center2 );
-    VertexEffectRotate  effect7 = new VertexEffectRotate( angle, axis3, center2 );
+    VertexEffectRotate  effect1 = new VertexEffectRotate( new Static1D(90), new Static3D(1,0,0), center );
+    VertexEffectMove    effect2 = new VertexEffectMove  ( new Static3D(0,-SQ3*SQ2/12,0) );
+    VertexEffectRotate  effect3 = new VertexEffectRotate( new Static1D(180), new Static3D(0,0,1), center1 );
+    VertexEffectRotate  effect4 = new VertexEffectRotate( angle, axis1, center1 );
+    VertexEffectRotate  effect5 = new VertexEffectRotate( angle, axis2, center2 );
+    VertexEffectRotate  effect6 = new VertexEffectRotate( angle, axis3, center2 );
+
+    VertexEffectDeform  effect7 = new VertexEffectDeform(dVec0, dRad, dCen0, dReg);
+    VertexEffectDeform  effect8 = new VertexEffectDeform(dVec1, dRad, dCen1, dReg);
+    VertexEffectDeform  effect9 = new VertexEffectDeform(dVec2, dRad, dCen2, dReg);
+    VertexEffectDeform  effect10= new VertexEffectDeform(dVec3, dRad, dCen3, dReg);
 
-    VertexEffectDeform  effect8 = new VertexEffectDeform(dVec0, dRad, dCen0, dReg);
-    VertexEffectDeform  effect9 = new VertexEffectDeform(dVec1, dRad, dCen1, dReg);
-    VertexEffectDeform  effect10= new VertexEffectDeform(dVec2, dRad, dCen2, dReg);
-    VertexEffectDeform  effect11= new VertexEffectDeform(dVec3, dRad, dCen3, dReg);
+    VertexEffectSink effect11= new VertexEffectSink(sink,center, sReg);
 
-    effect4.setMeshAssociation(14,-1);  // apply to mesh[1], [2] and [3]
-    effect5.setMeshAssociation( 2,-1);  // apply only to mesh[1]
-    effect6.setMeshAssociation( 4,-1);  // apply only to mesh[2]
-    effect7.setMeshAssociation( 8,-1);  // apply only to mesh[3]
+    effect3.setMeshAssociation(14,-1);  // apply to mesh[1], [2] and [3]
+    effect4.setMeshAssociation( 2,-1);  // apply only to mesh[1]
+    effect5.setMeshAssociation( 4,-1);  // apply only to mesh[2]
+    effect6.setMeshAssociation( 8,-1);  // apply only to mesh[3]
 
     result.apply(effect1);
     result.apply(effect2);
@@ -362,10 +365,12 @@ public class RubikPyraminx extends RubikObject
     result.apply(effect4);
     result.apply(effect5);
     result.apply(effect6);
+
     result.apply(effect7);
     result.apply(effect8);
     result.apply(effect9);
     result.apply(effect10);
+
     result.apply(effect11);
 
     if( mRotArray[cubit]>=0 )
@@ -411,6 +416,9 @@ public class RubikPyraminx extends RubikObject
     float ARC2_H = 0.905f*side;
     float ARC3_W = side-ARC2_W;
 
+    float M = SQ3/2;
+    float D = (M/2 - 0.51f)*side;
+
     paint.setAntiAlias(true);
     paint.setStrokeWidth(STROKE);
     paint.setColor(FACE_COLORS[face]);
@@ -421,13 +429,13 @@ public class RubikPyraminx extends RubikObject
     paint.setColor(INTERIOR_COLOR);
     paint.setStyle(Paint.Style.STROKE);
 
-    canvas.drawLine(           left, HEIGHT,  side       +left, HEIGHT, paint);
-    canvas.drawLine(      OFF +left, side  ,       OFF2  +left,      0, paint);
-    canvas.drawLine((side-OFF)+left, side  , (side-OFF2) +left,      0, paint);
+    canvas.drawLine(           left, M*HEIGHT+D,  side       +left, M*HEIGHT+D, paint);
+    canvas.drawLine(      OFF +left, M*side  +D,       OFF2  +left,          D, paint);
+    canvas.drawLine((side-OFF)+left, M*side  +D, (side-OFF2) +left,          D, paint);
 
-    canvas.drawArc( ARC1_W-RADIUS+left, ARC1_H-RADIUS, ARC1_W+RADIUS+left, ARC1_H+RADIUS, 225, 90, false, paint);
-    canvas.drawArc( ARC2_W-RADIUS+left, ARC2_H-RADIUS, ARC2_W+RADIUS+left, ARC2_H+RADIUS, 105, 90, false, paint);
-    canvas.drawArc( ARC3_W-RADIUS+left, ARC2_H-RADIUS, ARC3_W+RADIUS+left, ARC2_H+RADIUS, 345, 90, false, 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);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
