commit 045d8cbdca17830a8b08ad5e76df3481039823fe
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Aug 20 23:24:35 2021 +0200

    Convert Pyraminx to the new scheme. Make Pyra4 and Pyra5 meshes much smaller.

diff --git a/src/main/java/org/distorted/objects/TwistyPyraminx.java b/src/main/java/org/distorted/objects/TwistyPyraminx.java
index e0a263bb..fa140edc 100644
--- a/src/main/java/org/distorted/objects/TwistyPyraminx.java
+++ b/src/main/java/org/distorted/objects/TwistyPyraminx.java
@@ -22,7 +22,9 @@ package org.distorted.objects;
 import android.content.res.Resources;
 
 import org.distorted.helpers.FactoryCubit;
+import org.distorted.helpers.ObjectShape;
 import org.distorted.helpers.ObjectSticker;
+import org.distorted.library.effect.MatrixEffectQuaternion;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshBase;
@@ -300,63 +302,84 @@ public class TwistyPyraminx extends TwistyObject
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  ObjectShape getObjectShape(int cubit, int numLayers)
+    {
+    int variant = getCubitVariant(cubit,numLayers);
+
+    if( variant==0 )
+      {
+      int N = numLayers==3? 6 : 5;
+      int E = numLayers==3? 2 : 1;
+      float[][] bands     = new float[][] { {0.05f,35,0.5f,0.8f,N,E,E} };
+      int[] bandIndices   = new int[] { 0,0,0,0,0,0,0,0 };
+      float[][] corners   = new float[][] { {0.04f,0.20f} };
+      int[] cornerIndices = new int[] { 0,0,0,0,0,0 };
+      float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
+      int[] centerIndices = new int[] { 0,0,0,0,0,0 };
+      return new ObjectShape(VERTICES_OCTA,VERT_INDEXES_OCTA,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
+      }
+    else
+      {
+      int N = numLayers==3? 6 : 5;
+      int E = numLayers==3? 2 : 1;
+      float[][] bands     = new float[][] { {0.05f,35,0.5f,0.8f,N,E,E} };
+      int[] bandIndices   = new int[] { 0,0,0,0 };
+      float[][] corners   = new float[][] { {0.06f,0.15f} };
+      int[] cornerIndices = new int[] { 0,0,0,0 };
+      float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
+      int[] centerIndices = new int[] { 0,0,0,0 };
+      return new ObjectShape(VERTICES_TETRA,VERT_INDEXES_TETRA,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private Static4D getQuat(int cubit, int numLayers)
+    {
+    return QUATS[0];
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int getNumCubitVariants(int numLayers)
+    {
+    return 2;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getCubitVariant(int cubit, int numLayers)
+    {
+    return cubit<getNumOctahedrons(numLayers) ? 0:1;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   MeshBase createCubitMesh(int cubit, int numLayers)
     {
+    int variant = getCubitVariant(cubit,numLayers);
+
     if( mMeshes==null )
       {
       FactoryCubit factory = FactoryCubit.getInstance();
       factory.clear();
-      mMeshes = new MeshBase[2];
+      mMeshes = new MeshBase[getNumCubitVariants(numLayers)];
       }
 
-    MeshBase mesh;
-    int numO = getNumOctahedrons(numLayers);
-
-    if( cubit<numO )
+    if( mMeshes[variant]==null )
       {
-      if( mMeshes[0]==null )
-        {
-        float[][] bands     = new float[][] { {0.05f,35,0.5f,0.8f,6,2,2} };
-        int[] bandIndexes   = new int[] { 0,0,0,0,0,0,0,0 };
-        float[][] corners   = new float[][] { {0.04f,0.20f} };
-        int[] cornerIndexes = new int[] { 0,0,0,0,0,0 };
-        float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
-        int[] centerIndexes = new int[] { 0,0,0,0,0,0 };
-
-        FactoryCubit factory = FactoryCubit.getInstance();
-        factory.createNewFaceTransform(VERTICES_OCTA,VERT_INDEXES_OCTA);
-        mMeshes[0] = factory.createRoundedSolid(VERTICES_OCTA, VERT_INDEXES_OCTA,
-                                                bands, bandIndexes,
-                                                corners, cornerIndexes,
-                                                centers, centerIndexes,
-                                                getNumCubitFaces(), null );
-        }
-      mesh = mMeshes[0].copy(true);
-      }
-    else
-      {
-      if( mMeshes[1]==null )
-        {
-        float[][] bands     = new float[][] { {0.05f,35,0.5f,0.8f,6,2,2} };
-        int[] bandIndexes   = new int[] { 0,0,0,0 };
-        float[][] corners   = new float[][] { {0.06f,0.15f} };
-        int[] cornerIndexes = new int[] { 0,0,0,0 };
-        float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
-        int[] centerIndexes = new int[] { 0,0,0,0 };
-
-        FactoryCubit factory = FactoryCubit.getInstance();
-        factory.createNewFaceTransform(VERTICES_TETRA,VERT_INDEXES_TETRA);
-        mMeshes[1] = factory.createRoundedSolid(VERTICES_TETRA, VERT_INDEXES_TETRA,
-                                                bands, bandIndexes,
-                                                corners, cornerIndexes,
-                                                centers, centerIndexes,
-                                                getNumCubitFaces(), null );
-        }
-      mesh = mMeshes[1].copy(true);
+      ObjectShape shape = getObjectShape(cubit,numLayers);
+      FactoryCubit factory = FactoryCubit.getInstance();
+      factory.createNewFaceTransform(shape);
+      mMeshes[variant] = factory.createRoundedSolid(shape);
       }
 
+    MeshBase mesh = mMeshes[variant].copy(true);
+    MatrixEffectQuaternion quat = new MatrixEffectQuaternion( getQuat(cubit,numLayers), new Static3D(0,0,0) );
+    mesh.apply(quat,0xffffffff,0);
+
     return mesh;
     }
 
diff --git a/src/main/res/raw/pyra4.dmesh b/src/main/res/raw/pyra4.dmesh
index 28066e15..d2179266 100644
Binary files a/src/main/res/raw/pyra4.dmesh and b/src/main/res/raw/pyra4.dmesh differ
diff --git a/src/main/res/raw/pyra5.dmesh b/src/main/res/raw/pyra5.dmesh
index 5ec717bb..b1b43016 100644
Binary files a/src/main/res/raw/pyra5.dmesh and b/src/main/res/raw/pyra5.dmesh differ
