commit 9cbe58b07ed1800e9591f984e87df92722d27f8b
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Jun 6 01:17:49 2020 +0100

    Library: make setEffectAssociation a deferred job (because we do copy the uniforms during join!)
    SingleMesh App: almost finished.

diff --git a/src/main/java/org/distorted/examples/deferredjob/DeferredJobRenderer.java b/src/main/java/org/distorted/examples/deferredjob/DeferredJobRenderer.java
index 87e2770..751e139 100644
--- a/src/main/java/org/distorted/examples/deferredjob/DeferredJobRenderer.java
+++ b/src/main/java/org/distorted/examples/deferredjob/DeferredJobRenderer.java
@@ -75,8 +75,8 @@ class DeferredJobRenderer implements GLSurfaceView.Renderer
       sink.add( new Static1D(0.5f) );
       sink.add( new Static1D(2.0f) );
 
-      mQuat1 = new Static4D(0,0,0,1);  // unity
-      mQuat2 = new Static4D(0,0,0,1);  // quaternions
+      mQuat1 = new Static4D(0,0,0,1);
+      mQuat2 = new Static4D(-0.25189602f,0.3546389f,0.009657208f,0.90038127f);
 
       DynamicQuat quatInt1 = new DynamicQuat(0,0.5f);
       DynamicQuat quatInt2 = new DynamicQuat(0,0.5f);
diff --git a/src/main/java/org/distorted/examples/singlemesh/SingleMeshActivity.java b/src/main/java/org/distorted/examples/singlemesh/SingleMeshActivity.java
index d2a4271..1c17055 100644
--- a/src/main/java/org/distorted/examples/singlemesh/SingleMeshActivity.java
+++ b/src/main/java/org/distorted/examples/singlemesh/SingleMeshActivity.java
@@ -79,8 +79,12 @@ public class SingleMeshActivity extends Activity
 
       switch(id)
         {
-        case R.id.singlemeshButton0 : sView.getRenderer().apply(0); break;
-        case R.id.singlemeshButton1 : sView.getRenderer().apply(1); break;
+        case R.id.singlemeshButtonLX : sView.getRenderer().apply( (1<<4) + (0<<2) + 0, 0 ); break;
+        case R.id.singlemeshButtonRX : sView.getRenderer().apply( (2<<4) + (0<<2) + 0, 0 ); break;
+        case R.id.singlemeshButtonLY : sView.getRenderer().apply( (0<<4) + (1<<2) + 0, 1 ); break;
+        case R.id.singlemeshButtonRY : sView.getRenderer().apply( (0<<4) + (2<<2) + 0, 1 ); break;
+        case R.id.singlemeshButtonLZ : sView.getRenderer().apply( (0<<4) + (0<<2) + 1, 2 ); break;
+        case R.id.singlemeshButtonRZ : sView.getRenderer().apply( (0<<4) + (0<<2) + 2, 2 ); break;
         }
       }
 }
diff --git a/src/main/java/org/distorted/examples/singlemesh/SingleMeshRenderer.java b/src/main/java/org/distorted/examples/singlemesh/SingleMeshRenderer.java
index 866d161..7ae307d 100644
--- a/src/main/java/org/distorted/examples/singlemesh/SingleMeshRenderer.java
+++ b/src/main/java/org/distorted/examples/singlemesh/SingleMeshRenderer.java
@@ -54,6 +54,13 @@ class SingleMeshRenderer implements GLSurfaceView.Renderer
 {
     private static final float DIST = 0.5f;
 
+    private static Static3D[] AXIS = new Static3D[]
+         {
+           new Static3D(1,0,0),
+           new Static3D(0,1,0),
+           new Static3D(0,0,1)
+         };
+
     private static final int[] FACE_COLORS = new int[]
          {
            0xffffff00, 0xffffffff,   // (right-YELLOW) (left  -WHITE)
@@ -104,6 +111,7 @@ class SingleMeshRenderer implements GLSurfaceView.Renderer
     private VertexEffectRotate mRotate;
     private Dynamic1D mAngleDyn;
     private Static1D mAngle;
+    private Static3D mAxis;
 
     Static4D mQuat1, mQuat2;
     int mScreenMin;
@@ -121,8 +129,8 @@ class SingleMeshRenderer implements GLSurfaceView.Renderer
       sink.add( new Static1D(0.5f) );
       sink.add( new Static1D(2.0f) );
 
-      mQuat1 = new Static4D(0,0,0,1);  // unity
-      mQuat2 = new Static4D(0,0,0,1);  // quaternions
+      mQuat1 = new Static4D(0,0,0,1);
+      mQuat2 = new Static4D(-0.25189602f,0.3546389f,0.009657208f,0.90038127f);
 
       DynamicQuat quatInt1 = new DynamicQuat(0,0.5f);
       DynamicQuat quatInt2 = new DynamicQuat(0,0.5f);
@@ -131,12 +139,13 @@ class SingleMeshRenderer implements GLSurfaceView.Renderer
       quatInt2.add(mQuat2);
 
       mAngle = new Static1D(0);
+      mAxis  = new Static3D(1,0,0);
 
       mAngleDyn = new Dynamic1D(2000,0.5f);
       mAngleDyn.add(new Static1D(0));
       mAngleDyn.add( mAngle );
 
-      mRotate = new VertexEffectRotate( mAngleDyn, new Static3D(1,0,0), new Static3D(0,0,0) );
+      mRotate = new VertexEffectRotate( mAngleDyn, mAxis, new Static3D(0,0,0) );
 
       mEffects = new DistortedEffects();
       mEffects.apply( mRotate );
@@ -192,10 +201,16 @@ class SingleMeshRenderer implements GLSurfaceView.Renderer
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    void apply(int number)
+    void apply(int andAssoc, int axisIndex)
       {
-      mRotate.setMeshAssociation(0,number);
+      mRotate.setMeshAssociation(andAssoc,-1);
+
       mAngle.set(360);
+
+      mAxis.set0(AXIS[axisIndex].get0());
+      mAxis.set1(AXIS[axisIndex].get1());
+      mAxis.set2(AXIS[axisIndex].get2());
+
       mAngleDyn.resetToBeginning();
       }
 
@@ -348,6 +363,15 @@ class SingleMeshRenderer implements GLSurfaceView.Renderer
 
       MeshBase result = new MeshJoined(cubits);
 
+      result.setEffectAssociation( 0, (1<<4) + (1<<2) + 1, 0);
+      result.setEffectAssociation( 1, (1<<4) + (1<<2) + 2, 0);
+      result.setEffectAssociation( 2, (1<<4) + (2<<2) + 1, 0);
+      result.setEffectAssociation( 3, (1<<4) + (2<<2) + 2, 0);
+      result.setEffectAssociation( 4, (2<<4) + (1<<2) + 1, 0);
+      result.setEffectAssociation( 5, (2<<4) + (1<<2) + 2, 0);
+      result.setEffectAssociation( 6, (2<<4) + (2<<2) + 1, 0);
+      result.setEffectAssociation( 7, (2<<4) + (2<<2) + 2, 0);
+
       return result;
       }
 }
diff --git a/src/main/res/layout/singlemeshlayout.xml b/src/main/res/layout/singlemeshlayout.xml
index 92770e8..32920cc 100644
--- a/src/main/res/layout/singlemeshlayout.xml
+++ b/src/main/res/layout/singlemeshlayout.xml
@@ -18,15 +18,43 @@
         <Button
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:id="@+id/singlemeshButton0"
-            android:text="@string/color_red"
+            android:id="@+id/singlemeshButtonLX"
+            android:text="LX"
             android:onClick="onClick"
             android:layout_weight="1"/>
         <Button
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:id="@+id/singlemeshButton1"
-            android:text="@string/color_green"
+            android:id="@+id/singlemeshButtonRX"
+            android:text="RX"
+            android:onClick="onClick"
+            android:layout_weight="1"/>
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:id="@+id/singlemeshButtonLY"
+            android:text="LY"
+            android:onClick="onClick"
+            android:layout_weight="1"/>
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:id="@+id/singlemeshButtonRY"
+            android:text="RY"
+            android:onClick="onClick"
+            android:layout_weight="1"/>
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:id="@+id/singlemeshButtonLZ"
+            android:text="LZ"
+            android:onClick="onClick"
+            android:layout_weight="1"/>
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:id="@+id/singlemeshButtonRZ"
+            android:text="RZ"
             android:onClick="onClick"
             android:layout_weight="1"/>
 
