commit 89a11f7b63fc7a14606fb18b2e127a65b08a8181
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Mar 9 11:44:28 2020 +0000

    Progress with Pyraminx.

diff --git a/src/main/java/org/distorted/object/RubikCube.java b/src/main/java/org/distorted/object/RubikCube.java
index 0b21bf4b..3f4bdf28 100644
--- a/src/main/java/org/distorted/object/RubikCube.java
+++ b/src/main/java/org/distorted/object/RubikCube.java
@@ -139,7 +139,7 @@ class RubikCube extends RubikObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  MeshBase createCubitMesh(int vertices)
+  MeshBase createCubitMesh(int cubit, int vertices)
     {
     final int MESHES=6;
 
diff --git a/src/main/java/org/distorted/object/RubikObject.java b/src/main/java/org/distorted/object/RubikObject.java
index 08e1c298..448acc98 100644
--- a/src/main/java/org/distorted/object/RubikObject.java
+++ b/src/main/java/org/distorted/object/RubikObject.java
@@ -114,7 +114,7 @@ public abstract class RubikObject extends DistortedNode
 
     for(int i=0; i<NUM_CUBITS; i++)
       {
-      MeshBase cubitMesh = createCubitMesh(vertices);
+      MeshBase cubitMesh = createCubitMesh(i,vertices);
       mCubits[i] = new Cubit(this,cubitMesh,mOrigPos[i]);
       textureCubitMesh(cubitMesh,i);
 
@@ -469,7 +469,7 @@ public abstract class RubikObject extends DistortedNode
   abstract float[] getLegalQuats();
   abstract int getNumFaces();
   abstract void createFaceTexture(Canvas canvas, Paint paint, int face);
-  abstract MeshBase createCubitMesh(int vertices);
+  abstract MeshBase createCubitMesh(int cubit, int vertices);
   abstract Static3D[] getRotationAxis();
   public abstract int getBasicAngle();
   }
diff --git a/src/main/java/org/distorted/object/RubikPyraminx.java b/src/main/java/org/distorted/object/RubikPyraminx.java
index da5fcc7e..f4a35462 100644
--- a/src/main/java/org/distorted/object/RubikPyraminx.java
+++ b/src/main/java/org/distorted/object/RubikPyraminx.java
@@ -64,7 +64,21 @@ public class RubikPyraminx extends RubikObject
            SQ3/3, -SQ3/3, SQ3/6, -SQ3/6, SQ2*SQ3/3, -SQ2*SQ3/3, SQ2*SQ3/6, -SQ2*SQ3/6
          };
 
-  private Static4D[] mRotArray;
+  private int[] mRotArray;
+  private static MatrixEffectRotate[][] ROTATION;
+
+  static
+    {
+    Static3D center = new Static3D(0,0,0);
+    Static1D angle  = new Static1D(180.0f);
+
+    ROTATION = new MatrixEffectRotate[AXIS.length][1];
+
+    for(int i=0; i<AXIS.length; i++)
+      {
+      ROTATION[i][0] = new MatrixEffectRotate( angle, AXIS[i], center);
+      }
+    }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -75,7 +89,7 @@ public class RubikPyraminx extends RubikObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void emitRow(float x, float y, float z, float dx, float dy, float dz, int n, Static4D rot, Static3D[] array, int index)
+  private void emitRow(float x, float y, float z, float dx, float dy, float dz, int n, int rot, Static3D[] array, int index)
     {
     for(int i=0; i<n; i++)
       {
@@ -95,7 +109,7 @@ public class RubikPyraminx extends RubikObject
 
     for(int i=n; i>=1; i--)
       {
-      emitRow(x,y,z, 1,0,0, i, null, array, added);
+      emitRow(x,y,z, 1,0,0, i, -1, array, added);
       added += i;
       x += 0.5f;
       y += 0.0f;
@@ -111,16 +125,16 @@ public class RubikPyraminx extends RubikObject
     {
     if( n>1 )
       {
-      emitRow(x,y,z, 1,0,0, n-1, null, array, index);
+      emitRow( x     , y, z      ,  1.0f, 0,     0, n-1, -1, array, index);
       index += (n-1);
-      emitRow(x+0.5f,y,z+SQ3/2, 0.5f,0,SQ3/2, n-1, null, array, index);
+      emitRow( x+0.5f, y, z+SQ3/2,  0.5f, 0, SQ3/2, n-1, -1, array, index);
       index += (n-1);
-      emitRow( x+n-1,y,z, -0.5f, 0, SQ3/2, n-1, null, array, index);
+      emitRow( x+n-1 , y, z      , -0.5f, 0, SQ3/2, n-1, -1, array, index);
       index += (n-1);
       }
     else
       {
-      mRotArray[index] = null;
+      mRotArray[index] = -1;
       array[index] = new Static3D(x+0.5f,y+SQ2*SQ3/12,z+SQ3/6);
       index++;
       }
@@ -136,7 +150,7 @@ public class RubikPyraminx extends RubikObject
     {
     int numCubits = size>1 ? 2*size*size-4*size+4:1;//4*size*size - 6*size +4 : 1;
     Static3D[] tmp = new Static3D[numCubits];
-    mRotArray = new Static4D[numCubits];
+    mRotArray = new int[numCubits];
 
     int currentIndex = emitLowermost( -0.5f*size, -(SQ2*SQ3/12)*size, -(SQ3/6)*size, size, tmp);
 
@@ -206,7 +220,7 @@ public class RubikPyraminx extends RubikObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  MeshBase createCubitMesh(int vertices)
+  MeshBase createCubitMesh(int cubit, int vertices)
     {
     final float angleFaces = (float)((180/Math.PI)*(2*Math.asin(SQ3/3))); // angle between two faces of a tetrahedron
     final int MESHES=4;
@@ -240,7 +254,14 @@ public class RubikPyraminx extends RubikObject
     axis.set2(SQ3/2);
     meshes[3].apply(effects1);
 
-    return new MeshJoined(meshes);
+    MeshJoined result = new MeshJoined(meshes);
+
+    if( mRotArray[cubit]>=0 )
+      {
+      result.apply( ROTATION[mRotArray[cubit]] );
+      }
+
+    return result;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
