commit 988f434e5420476d8249fe118219508bc16cd54c
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Mar 6 16:50:31 2020 +0000

    Progress with of Pyraminx.
    Bugfix for joining a single Mesh!

diff --git a/src/main/java/org/distorted/object/RubikPyraminx.java b/src/main/java/org/distorted/object/RubikPyraminx.java
index df646597..094fa95c 100644
--- a/src/main/java/org/distorted/object/RubikPyraminx.java
+++ b/src/main/java/org/distorted/object/RubikPyraminx.java
@@ -22,10 +22,17 @@ package org.distorted.object;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 
+import org.distorted.library.effect.MatrixEffect;
+import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.effect.MatrixEffectRotate;
+import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshBase;
+import org.distorted.library.mesh.MeshJoined;
 import org.distorted.library.mesh.MeshRectangles;
+import org.distorted.library.mesh.MeshTriangles;
+import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 
@@ -35,10 +42,10 @@ public class RubikPyraminx extends RubikObject
 {
   private static final Static3D[] AXIS = new Static3D[]
          {
-           new Static3D(                     0,                       0,       1 ),
-           new Static3D( (float)Math.sqrt(6)/3,  -(float)Math.sqrt(3)/3, -1.0f/3 ),
-           new Static3D(-(float)Math.sqrt(6)/3,  -(float)Math.sqrt(3)/3, -1.0f/3 ),
-           new Static3D(                     0, 2*(float)Math.sqrt(2)/3, -1.0f/3 )
+           new Static3D(                     0,        1,                       0 ),
+           new Static3D( (float)Math.sqrt(6)/3,  -1.0f/3,  -(float)Math.sqrt(3)/3 ),
+           new Static3D(-(float)Math.sqrt(6)/3,  -1.0f/3,  -(float)Math.sqrt(3)/3 ),
+           new Static3D(                     0,  -1.0f/3, 2*(float)Math.sqrt(2)/3 )
          };
 
   private static final int[] FACE_COLORS = new int[]
@@ -96,11 +103,43 @@ public class RubikPyraminx extends RubikObject
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
 
   MeshBase createCubitMesh(int vertices)
     {
-    return null;
+    final float SQ3 = (float)Math.sqrt(3);
+    final float angleFaces = (float)((180/Math.PI)*(2*Math.asin(SQ3/3))); // angle between two faces of a tetrahedron
+    final int MESHES=4;
+
+    MeshBase[] meshes = new MeshTriangles[MESHES];
+    for(int i=0; i<MESHES; i++) meshes[i] = new MeshTriangles(5);
+
+    MatrixEffect[] effects0 = new MatrixEffect[3];
+    effects0[0] = new MatrixEffectScale( new Static3D(1,SQ3/2,1) );
+    effects0[1] = new MatrixEffectRotate( new Static1D(90), new Static3D(1,0,0), new Static3D(0,0,0) );
+    effects0[2] = new MatrixEffectMove( new Static3D(0,-SQ3/6,SQ3/12) );
+
+    meshes[0].apply(effects0);
+
+    Static1D angle = new Static1D(angleFaces);
+    Static3D axis  = new Static3D(-1,0,0);
+    Static3D center= new Static3D(0,-SQ3/6,-SQ3/6);
+
+    MatrixEffect[] effects1 = new MatrixEffect[5];
+    effects1[0] = effects0[0];
+    effects1[1] = effects0[1];
+    effects1[2] = effects0[2];
+    effects1[3] = new MatrixEffectRotate( new Static1D(180), new Static3D(0,0,1), center );
+    effects1[4] = new MatrixEffectRotate( angle, axis, center );
+    meshes[1].apply(effects1);
+
+    axis.set(0.5f,0,-SQ3/2);
+    center.set2(SQ3/3);
+    meshes[2].apply(effects1);
+
+    axis.set2(SQ3/2);
+    meshes[3].apply(effects1);
+
+    return new MeshJoined(meshes);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
