commit 33bd5234cb129d07c93a863a66d1d556bd9d0d35
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Mar 6 16:50:30 2020 +0000

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

diff --git a/src/main/java/org/distorted/examples/meshjoin/MeshJoinRenderer.java b/src/main/java/org/distorted/examples/meshjoin/MeshJoinRenderer.java
index 60fc382..95c0b02 100644
--- a/src/main/java/org/distorted/examples/meshjoin/MeshJoinRenderer.java
+++ b/src/main/java/org/distorted/examples/meshjoin/MeshJoinRenderer.java
@@ -129,7 +129,7 @@ class MeshJoinRenderer implements GLSurfaceView.Renderer
       if( mTexture==null ) mTexture = new DistortedTexture();
       mTexture.setTexture(bitmap);
 
-      if( mMesh==null ) mMesh = createJoinedMesh();
+      if( mMesh==null ) mMesh = createJoinedTetrahedron();
 
      // mMesh.setShowNormals(true);
 
@@ -146,11 +146,11 @@ class MeshJoinRenderer implements GLSurfaceView.Renderer
         }
       }
 
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private MeshBase createJoinedMesh()
+    private MeshBase createJoinedDoubleQuad()
       {
-      /*
       MeshBase[] meshes = new MeshBase[2];
       meshes[0] = new MeshQuad();
       meshes[1] = new MeshQuad();
@@ -164,8 +164,14 @@ class MeshJoinRenderer implements GLSurfaceView.Renderer
       effects1[0] = new MatrixEffectMove( new Static3D(0,-0.6f,0));
 
       meshes[1].apply(effects1);
-      */
-      /*
+
+      return new MeshJoined(meshes);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private MeshBase createJoinedSphereAndTriangle()
+      {
       MeshBase[] meshes = new MeshBase[2];
       meshes[0] = new MeshSphere(5);
       meshes[1] = new MeshTriangles(5);
@@ -181,7 +187,14 @@ class MeshJoinRenderer implements GLSurfaceView.Renderer
       effects1[1] = new MatrixEffectMove( new Static3D(-0.25f,0,0));
 
       meshes[1].apply(effects1);
-      */
+
+      return new MeshJoined(meshes);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private MeshBase createJoinedCube()
+      {
       final int MESHES=6;
 
       Static3D axisY  = new Static3D(0,1,0);
@@ -217,14 +230,6 @@ class MeshJoinRenderer implements GLSurfaceView.Renderer
       MeshJoined result = new MeshJoined(meshes);
 
       Static4D[] maps = new Static4D[MESHES];
-      maps[0] = new Static4D(3.0f/8, 3.0f/8, 1.0f/8, 2.0f/8);
-      maps[1] = new Static4D(5.0f/8, 3.0f/8, 1.0f/8, 2.0f/8);
-      maps[2] = new Static4D(3.0f/8, 5.0f/8, 1.0f/8, 2.0f/8);
-      maps[3] = new Static4D(1.0f/8, 5.0f/8, 1.0f/8, 2.0f/8);
-      maps[4] = new Static4D(5.0f/8, 1.0f/8, 1.0f/8, 2.0f/8);
-      maps[5] = new Static4D(5.0f/8, 5.0f/8, 1.0f/8, 2.0f/8);
-
-      result.setTextureMap(maps);
 
       maps[0] = new Static4D(3.0f/8, 3.0f/8, 2.0f/8, 2.0f/8);
       maps[1] = new Static4D(5.0f/8, 1.0f/8, 2.0f/8, 2.0f/8);
@@ -236,4 +241,44 @@ class MeshJoinRenderer implements GLSurfaceView.Renderer
       result.setTextureMap(maps);
       return result;
       }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private MeshBase createJoinedTetrahedron()
+      {
+      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);
+      }
 }
