commit 44771819f15f2fc9c908e342d309ab1cab28a3cb
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Wed Feb 15 16:23:13 2017 +0000

    Further improve Olimpic. This seems to expose some Node bugs.

diff --git a/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java b/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java
index 77e4aa8..db737f2 100644
--- a/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java
+++ b/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java
@@ -27,6 +27,7 @@ import android.opengl.GLSurfaceView;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
+import android.widget.CheckBox;
 import android.widget.TextView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -46,61 +47,62 @@ public class OlimpicActivity extends Activity
 
   public void onClick(View view)
     {
-    Button tmp = (Button)view;
-    int id = tmp.getId();
+    CheckBox box = (CheckBox)view;
+    int id = box.getId();
+    boolean checked = box.isChecked();
     OlimpicSurfaceView sView = (OlimpicSurfaceView) this.findViewById(R.id.olimpicSurfaceView);
 
     switch(id)
       {
-      case R.id.olimpicCheckBoxBlue0  : sView.getRenderer().pressed(0,0); break;
-      case R.id.olimpicCheckBoxBlue1  : sView.getRenderer().pressed(0,1); break;
-      case R.id.olimpicCheckBoxBlue2  : sView.getRenderer().pressed(0,2); break;
-      case R.id.olimpicCheckBoxBlue3  : sView.getRenderer().pressed(0,3); break;
-      case R.id.olimpicCheckBoxBlue4  : sView.getRenderer().pressed(0,4); break;
-      case R.id.olimpicCheckBoxBlue5  : sView.getRenderer().pressed(0,5); break;
-      case R.id.olimpicCheckBoxBlue6  : sView.getRenderer().pressed(0,6); break;
-      case R.id.olimpicCheckBoxBlue7  : sView.getRenderer().pressed(0,7); break;
-      case R.id.olimpicCheckBoxBlue8  : sView.getRenderer().pressed(0,8); break;
-
-      case R.id.olimpicCheckBoxBlack0 : sView.getRenderer().pressed(1,0); break;
-      case R.id.olimpicCheckBoxBlack1 : sView.getRenderer().pressed(1,1); break;
-      case R.id.olimpicCheckBoxBlack2 : sView.getRenderer().pressed(1,2); break;
-      case R.id.olimpicCheckBoxBlack3 : sView.getRenderer().pressed(1,3); break;
-      case R.id.olimpicCheckBoxBlack4 : sView.getRenderer().pressed(1,4); break;
-      case R.id.olimpicCheckBoxBlack5 : sView.getRenderer().pressed(1,5); break;
-      case R.id.olimpicCheckBoxBlack6 : sView.getRenderer().pressed(1,6); break;
-      case R.id.olimpicCheckBoxBlack7 : sView.getRenderer().pressed(1,7); break;
-      case R.id.olimpicCheckBoxBlack8 : sView.getRenderer().pressed(1,8); break;
-
-      case R.id.olimpicCheckBoxRed0   : sView.getRenderer().pressed(2,0); break;
-      case R.id.olimpicCheckBoxRed1   : sView.getRenderer().pressed(2,1); break;
-      case R.id.olimpicCheckBoxRed2   : sView.getRenderer().pressed(2,2); break;
-      case R.id.olimpicCheckBoxRed3   : sView.getRenderer().pressed(2,3); break;
-      case R.id.olimpicCheckBoxRed4   : sView.getRenderer().pressed(2,4); break;
-      case R.id.olimpicCheckBoxRed5   : sView.getRenderer().pressed(2,5); break;
-      case R.id.olimpicCheckBoxRed6   : sView.getRenderer().pressed(2,6); break;
-      case R.id.olimpicCheckBoxRed7   : sView.getRenderer().pressed(2,7); break;
-      case R.id.olimpicCheckBoxRed8   : sView.getRenderer().pressed(2,8); break;
-
-      case R.id.olimpicCheckBoxYellow0: sView.getRenderer().pressed(3,0); break;
-      case R.id.olimpicCheckBoxYellow1: sView.getRenderer().pressed(3,1); break;
-      case R.id.olimpicCheckBoxYellow2: sView.getRenderer().pressed(3,2); break;
-      case R.id.olimpicCheckBoxYellow3: sView.getRenderer().pressed(3,3); break;
-      case R.id.olimpicCheckBoxYellow4: sView.getRenderer().pressed(3,4); break;
-      case R.id.olimpicCheckBoxYellow5: sView.getRenderer().pressed(3,5); break;
-      case R.id.olimpicCheckBoxYellow6: sView.getRenderer().pressed(3,6); break;
-      case R.id.olimpicCheckBoxYellow7: sView.getRenderer().pressed(3,7); break;
-      case R.id.olimpicCheckBoxYellow8: sView.getRenderer().pressed(3,8); break;
-
-      case R.id.olimpicCheckBoxGreen0 : sView.getRenderer().pressed(4,0); break;
-      case R.id.olimpicCheckBoxGreen1 : sView.getRenderer().pressed(4,1); break;
-      case R.id.olimpicCheckBoxGreen2 : sView.getRenderer().pressed(4,2); break;
-      case R.id.olimpicCheckBoxGreen3 : sView.getRenderer().pressed(4,3); break;
-      case R.id.olimpicCheckBoxGreen4 : sView.getRenderer().pressed(4,4); break;
-      case R.id.olimpicCheckBoxGreen5 : sView.getRenderer().pressed(4,5); break;
-      case R.id.olimpicCheckBoxGreen6 : sView.getRenderer().pressed(4,6); break;
-      case R.id.olimpicCheckBoxGreen7 : sView.getRenderer().pressed(4,7); break;
-      case R.id.olimpicCheckBoxGreen8 : sView.getRenderer().pressed(4,8); break;
+      case R.id.olimpicCheckBoxBlue0  : sView.getRenderer().pressed(0,0,checked); break;
+      case R.id.olimpicCheckBoxBlue1  : sView.getRenderer().pressed(0,1,checked); break;
+      case R.id.olimpicCheckBoxBlue2  : sView.getRenderer().pressed(0,2,checked); break;
+      case R.id.olimpicCheckBoxBlue3  : sView.getRenderer().pressed(0,3,checked); break;
+      case R.id.olimpicCheckBoxBlue4  : sView.getRenderer().pressed(0,4,checked); break;
+      case R.id.olimpicCheckBoxBlue5  : sView.getRenderer().pressed(0,5,checked); break;
+      case R.id.olimpicCheckBoxBlue6  : sView.getRenderer().pressed(0,6,checked); break;
+      case R.id.olimpicCheckBoxBlue7  : sView.getRenderer().pressed(0,7,checked); break;
+      case R.id.olimpicCheckBoxBlue8  : sView.getRenderer().pressed(0,8,checked); break;
+
+      case R.id.olimpicCheckBoxBlack0 : sView.getRenderer().pressed(1,0,checked); break;
+      case R.id.olimpicCheckBoxBlack1 : sView.getRenderer().pressed(1,1,checked); break;
+      case R.id.olimpicCheckBoxBlack2 : sView.getRenderer().pressed(1,2,checked); break;
+      case R.id.olimpicCheckBoxBlack3 : sView.getRenderer().pressed(1,3,checked); break;
+      case R.id.olimpicCheckBoxBlack4 : sView.getRenderer().pressed(1,4,checked); break;
+      case R.id.olimpicCheckBoxBlack5 : sView.getRenderer().pressed(1,5,checked); break;
+      case R.id.olimpicCheckBoxBlack6 : sView.getRenderer().pressed(1,6,checked); break;
+      case R.id.olimpicCheckBoxBlack7 : sView.getRenderer().pressed(1,7,checked); break;
+      case R.id.olimpicCheckBoxBlack8 : sView.getRenderer().pressed(1,8,checked); break;
+
+      case R.id.olimpicCheckBoxRed0   : sView.getRenderer().pressed(2,0,checked); break;
+      case R.id.olimpicCheckBoxRed1   : sView.getRenderer().pressed(2,1,checked); break;
+      case R.id.olimpicCheckBoxRed2   : sView.getRenderer().pressed(2,2,checked); break;
+      case R.id.olimpicCheckBoxRed3   : sView.getRenderer().pressed(2,3,checked); break;
+      case R.id.olimpicCheckBoxRed4   : sView.getRenderer().pressed(2,4,checked); break;
+      case R.id.olimpicCheckBoxRed5   : sView.getRenderer().pressed(2,5,checked); break;
+      case R.id.olimpicCheckBoxRed6   : sView.getRenderer().pressed(2,6,checked); break;
+      case R.id.olimpicCheckBoxRed7   : sView.getRenderer().pressed(2,7,checked); break;
+      case R.id.olimpicCheckBoxRed8   : sView.getRenderer().pressed(2,8,checked); break;
+
+      case R.id.olimpicCheckBoxYellow0: sView.getRenderer().pressed(3,0,checked); break;
+      case R.id.olimpicCheckBoxYellow1: sView.getRenderer().pressed(3,1,checked); break;
+      case R.id.olimpicCheckBoxYellow2: sView.getRenderer().pressed(3,2,checked); break;
+      case R.id.olimpicCheckBoxYellow3: sView.getRenderer().pressed(3,3,checked); break;
+      case R.id.olimpicCheckBoxYellow4: sView.getRenderer().pressed(3,4,checked); break;
+      case R.id.olimpicCheckBoxYellow5: sView.getRenderer().pressed(3,5,checked); break;
+      case R.id.olimpicCheckBoxYellow6: sView.getRenderer().pressed(3,6,checked); break;
+      case R.id.olimpicCheckBoxYellow7: sView.getRenderer().pressed(3,7,checked); break;
+      case R.id.olimpicCheckBoxYellow8: sView.getRenderer().pressed(3,8,checked); break;
+
+      case R.id.olimpicCheckBoxGreen0 : sView.getRenderer().pressed(4,0,checked); break;
+      case R.id.olimpicCheckBoxGreen1 : sView.getRenderer().pressed(4,1,checked); break;
+      case R.id.olimpicCheckBoxGreen2 : sView.getRenderer().pressed(4,2,checked); break;
+      case R.id.olimpicCheckBoxGreen3 : sView.getRenderer().pressed(4,3,checked); break;
+      case R.id.olimpicCheckBoxGreen4 : sView.getRenderer().pressed(4,4,checked); break;
+      case R.id.olimpicCheckBoxGreen5 : sView.getRenderer().pressed(4,5,checked); break;
+      case R.id.olimpicCheckBoxGreen6 : sView.getRenderer().pressed(4,6,checked); break;
+      case R.id.olimpicCheckBoxGreen7 : sView.getRenderer().pressed(4,7,checked); break;
+      case R.id.olimpicCheckBoxGreen8 : sView.getRenderer().pressed(4,8,checked); break;
       }
     }
 
diff --git a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
index 4b9effd..037c4e8 100644
--- a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
+++ b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
@@ -38,7 +38,6 @@ import org.distorted.library.type.Static1D;
 import org.distorted.library.Distorted;
 import org.distorted.library.DistortedTexture;
 
-import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.opengl.GLES30;
@@ -56,14 +55,32 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
    private DistortedNode mRoot;
    private DistortedTexture mLeaf;
    private DistortedScreen mScreen;
+   private MeshFlat mMesh;
    private int mScreenW, mScreenH;
    private int mPrevRendered, mCurrRendered;
 
+   private DistortedNode[] mCircleNode = new DistortedNode[NUM_CIRCLES];
+   private DistortedEffects[] mEffects = new DistortedEffects[NUM_LEAVES];
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   void pressed(int color, int number)
+   void pressed(int color, int number, boolean checked)
      {
-     android.util.Log.d("Olimpic","Color: "+color+" number:"+number+" pressed!");
+     android.util.Log.d("Olimpic","Color: "+color+" number:"+number+" checked: "+checked);
+
+     if( color>=0 && color<NUM_CIRCLES )
+       {
+       if( number==0 )
+         {
+         if( checked ) mRoot.attach(mCircleNode[color]);
+         else          mRoot.detach(mCircleNode[color]);
+         }
+       else if( number>0 && number<=NUM_LEAVES )
+         {
+         if( checked ) mCircleNode[color].attach( mLeaf, mEffects[number-1], mMesh);
+         else          mCircleNode[color].detach(mEffects[number-1]);
+         }
+       }
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -76,20 +93,19 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
       mCurrRendered = 0;
 
       mLeaf = new DistortedTexture(LEAF_SIZE,LEAF_SIZE);
-      MeshFlat mesh = new MeshFlat(1,1);
+      DistortedTexture surface = new DistortedTexture(3*LEAF_SIZE,3*LEAF_SIZE);
+      mMesh = new MeshFlat(1,1);
       DistortedEffects effects = new DistortedEffects();
 
       mScreenW = 9*LEAF_SIZE;
       mScreenH = 9*LEAF_SIZE;
-      mRoot = new DistortedNode(new DistortedTexture(mScreenW,mScreenH), effects, mesh);
+      mRoot = new DistortedNode(new DistortedTexture(mScreenW,mScreenH), effects, mMesh);
      
       Dynamic1D rot = new Dynamic1D(5000,0.0f);
       rot.setMode(Dynamic1D.MODE_JUMP);
       rot.add(new Static1D(  0));
       rot.add(new Static1D(360));
-      
-      DistortedNode[] mCircleNode = new DistortedNode[NUM_CIRCLES];
-    
+
       int[] colors    = new int[] {0,0,1,  0,0,0,  1,0,0,  1,1,0,  0,1,0}; // blue, black, red, yellow, green  
       int[] positions = new int[] {0,2*LEAF_SIZE,  3*LEAF_SIZE,2*LEAF_SIZE,  6*LEAF_SIZE,2*LEAF_SIZE,  3*LEAF_SIZE/2,9*LEAF_SIZE/2,  9*LEAF_SIZE/2,9*LEAF_SIZE/2};
       
@@ -97,31 +113,24 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
       Static3D axis   = new Static3D(0,0,1);
       Static3D moveVector = new Static3D(0,LEAF_SIZE,0);
 
-      for(int i=0; i<NUM_CIRCLES; i++)
+      for(int j=0; j<NUM_LEAVES; j++)
         {
-        if( i<=1 )
-          {
-          effects = new DistortedEffects();
-          mCircleNode[i] = new DistortedNode(new DistortedTexture(3*LEAF_SIZE,3*LEAF_SIZE), effects, mesh);
-        
-          for(int j=0; j<NUM_LEAVES-i; j++)
-            {
-            effects = new DistortedEffects();
-            mCircleNode[i].attach(mLeaf, effects, mesh);
-            effects.rotate( new Static1D(j*(360/NUM_LEAVES)), axis, center );
-            effects.move(moveVector);
-            }
-          }
-        else
-          {
-          mCircleNode[i] = new DistortedNode(mCircleNode[0], Distorted.CLONE_SURFACE |Distorted.CLONE_CHILDREN);
-          }
+        mEffects[j] = new DistortedEffects();
+        mEffects[j].rotate( new Static1D(j*(360/NUM_LEAVES)), axis, center );
+        mEffects[j].move(moveVector);
+        }
 
-        mRoot.attach(mCircleNode[i]);
-        effects = mCircleNode[i].getEffects();
+      for(int i=0; i<NUM_CIRCLES; i++)
+        {
+        effects = new DistortedEffects();
         effects.move( new Static3D(positions[2*i], positions[2*i+1], 0) );
         effects.rotate( rot, axis, center );
         effects.chroma( new Static1D(0.5f), new Static3D(colors[3*i],colors[3*i+1], colors[3*i+2]) );
+
+        mCircleNode[i] = new DistortedNode( surface, effects, mMesh);
+        mRoot.attach(mCircleNode[i]);
+
+        for(int j=0; j<NUM_LEAVES; j++) mCircleNode[i].attach(mLeaf, mEffects[j], mMesh);
         }
 
       mScreen = new DistortedScreen();
