commit 0ab55f0c86722953e6babbba52157e9e51cffacc
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Thu May 11 16:47:21 2017 +0100

    Use Transform Feedback to (optionally) display the Normal vectors.

diff --git a/src/main/java/org/distorted/examples/TableOfContents.java b/src/main/java/org/distorted/examples/TableOfContents.java
index a41d17e..8058db4 100644
--- a/src/main/java/org/distorted/examples/TableOfContents.java
+++ b/src/main/java/org/distorted/examples/TableOfContents.java
@@ -86,15 +86,6 @@ public class TableOfContents extends ListActivity
       
    int i = 0;
 
-   {
-      final Map<String, Object> item = new HashMap<>();
-      item.put(ITEM_IMAGE, R.drawable.icon_example_feedback);
-      item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_feedback));
-      item.put(ITEM_SUBTITLE, getText(R.string.example_feedback_subtitle));
-      data.add(item);
-      activityMapping.put(i++, FeedbackActivity.class);
-   }
-
    {
       final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_monalisa);
@@ -356,6 +347,15 @@ public class TableOfContents extends ListActivity
       activityMapping.put(i++, MultiblurActivity.class);
    }
 
+   {
+      final Map<String, Object> item = new HashMap<>();
+      item.put(ITEM_IMAGE, R.drawable.icon_example_feedback);
+      item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_feedback));
+      item.put(ITEM_SUBTITLE, getText(R.string.example_feedback_subtitle));
+      data.add(item);
+      activityMapping.put(i++, FeedbackActivity.class);
+   }
+
    final SimpleAdapter dataAdapter = new SimpleAdapter(this, data, R.layout.toc_item, new String[] {ITEM_IMAGE, ITEM_TITLE, ITEM_SUBTITLE}, new int[] {R.id.Image, R.id.Title, R.id.SubTitle});
    setListAdapter(dataAdapter);  
       
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java b/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
index aa0602c..8c26946 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
@@ -31,6 +31,7 @@ import android.view.View;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.Button;
+import android.widget.CheckBox;
 import android.widget.LinearLayout;
 import android.widget.NumberPicker;
 import android.widget.Spinner;
@@ -83,6 +84,10 @@ public class Effects3DActivity extends Activity
   private static boolean mSupportsRegion;
   private static boolean mSupportsCenter;
 
+  private static boolean mShowCenter = true;
+  private static boolean mShowRegion = true;
+  private static boolean mShowNormal = true;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   @Override
@@ -281,8 +286,8 @@ public class Effects3DActivity extends Activity
         }
       else
         {
-        final int W = 640;
-        final int H = 640;
+        final int W = 64*mNumCols;
+        final int H = 64*mNumRows;
 
         Paint paint = new Paint();
         mBitmap = Bitmap.createBitmap(W,H, Bitmap.Config.ARGB_8888);
@@ -295,11 +300,8 @@ public class Effects3DActivity extends Activity
         canvas.drawRect(0, 0, W, H, paint);
         paint.setColor(0xffffffff);
 
-        for(int i=0; i<=mNumCols ; i++ )
-          {
-          canvas.drawRect(W*i/mNumCols - 1,                0,  W*i/mNumCols + 1,  H               , paint);
-          canvas.drawRect(               0, H *i/mNumCols -1,  W               ,  H*i/mNumCols + 1, paint);
-          }
+        for(int i=0; i<=mNumCols ; i++ ) canvas.drawRect(W*i/mNumCols-1, 0, W*i/mNumCols + 1, H, paint);
+        for(int i=0; i<=mNumRows ; i++ ) canvas.drawRect( 0, H*i/mNumRows-1, W,  H*i/mNumRows+1, paint);
         }
       }
 
@@ -426,6 +428,8 @@ public class Effects3DActivity extends Activity
       mMesh = new MeshCubes(mNumCols, str, false);
       }
 
+    mMesh.setShowNormals(mShowNormal);
+
     mEffects= new DistortedEffects();
     mTexture= new DistortedTexture(mNumCols,mNumRows);
 
@@ -525,7 +529,7 @@ public class Effects3DActivity extends Activity
     mSupportsCenter =false;
 
     Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
-    view.getRenderer().showRegionAndCenter(false);
+    view.getRenderer().showRegionAndCenter(false,false);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -554,8 +558,9 @@ public class Effects3DActivity extends Activity
 
     eff.apply(mEffects);
 
+    boolean show = (mEffectNames[mEffectAdd].getType()==EffectTypes.VERTEX);
     Effects3DSurfaceView sv = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
-    sv.getRenderer().showRegionAndCenter(mEffectNames[mEffectAdd].getType()==EffectTypes.VERTEX);
+    sv.getRenderer().showRegionAndCenter( (show && mShowRegion) , (show && mShowCenter) );
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -607,6 +612,55 @@ public class Effects3DActivity extends Activity
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    boolean getShowCenter()
+      {
+      return mShowCenter;
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    boolean getShowRegion()
+      {
+      return mShowRegion;
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void showCenter(View view)
+      {
+      CheckBox box = (CheckBox)view;
+      mShowCenter = box.isChecked();
+
+      Effects3DSurfaceView sv = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
+      sv.getRenderer().showRegionAndCenter(mShowRegion,mShowCenter);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void showRegion(View view)
+      {
+      CheckBox box = (CheckBox)view;
+      mShowRegion = box.isChecked();
+
+      Effects3DSurfaceView sv = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
+      sv.getRenderer().showRegionAndCenter(mShowRegion,mShowCenter);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void showNormal(View view)
+      {
+      CheckBox box = (CheckBox)view;
+      mShowNormal = box.isChecked();
+
+      if ( mMesh!=null )
+        {
+        mMesh.setShowNormals(mShowNormal);
+        }
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // Overrides
 
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java b/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java
index e25a7d0..4680eee 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DEffect.java
@@ -637,8 +637,13 @@ class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
     if( fromUser )
       {
       Effects3DActivity act = mAct.get();
+
+      boolean show = (mName.getType()==EffectTypes.VERTEX);
+      boolean showR= (show && act.getShowRegion());
+      boolean showC= (show && act.getShowCenter());
+
       Effects3DSurfaceView view = (Effects3DSurfaceView)act.findViewById(R.id.effects3dSurfaceView);
-      view.getRenderer().showRegionAndCenter(mName.getType()==EffectTypes.VERTEX);
+      view.getRenderer().showRegionAndCenter( showR,showC );
 
       act.setSupportsCenter(mName.supportsCenter());
       act.setSupportsRegion(mName.supportsRegion());
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java b/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
index 6c9c32b..1854896 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
@@ -68,7 +68,8 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
 
     Static4D mQuat1, mQuat2;
     int mScreenMin;
-    private boolean mShowing=false;
+    private boolean mShowingCenter=false;
+    private boolean mShowingRegion=false;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -126,22 +127,22 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    void showRegionAndCenter(boolean show)
+    void showRegionAndCenter(boolean showRegion, boolean showCenter)
       {
-      if( mShowing!=show )
+      if( mShowingCenter!=showCenter  )
         {
-        if( show )
-          {
-          mScreen.attach(mCenterNode);
-          mScreen.attach(mRegionNode);
-          }
-        else
-          {
-          mScreen.detach(mCenterNode);
-          mScreen.detach(mRegionNode);
-          }
+        if( showCenter ) mScreen.attach(mCenterNode);
+        else             mScreen.detach(mCenterNode);
+
+        mShowingCenter = showCenter;
+        }
+
+      if( mShowingRegion!=showRegion  )
+        {
+        if( showRegion ) mScreen.attach(mRegionNode);
+        else             mScreen.detach(mRegionNode);
 
-        mShowing = show;
+        mShowingRegion = showRegion;
         }
       }
 
@@ -214,7 +215,7 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
       mCenterEffects.quaternion(mQuatInt2, rotateCen);
 
       mCenterEffects.move( new Static3D( (width -factorCen*centerSize-mFactorObj*mObjWidth )/2 ,
-                                  (height-factorCen*centerSize-mFactorObj*mObjHeight)/2 , 10) );
+                                  (height-factorCen*centerSize-mFactorObj*mObjHeight)/2 , 15) );
       mCenterEffects.move(mCenterInter);
       mCenterEffects.scale(factorCen);
 
diff --git a/src/main/res/layout/effects3dlayout.xml b/src/main/res/layout/effects3dlayout.xml
index c17e08d..98a3bd6 100644
--- a/src/main/res/layout/effects3dlayout.xml
+++ b/src/main/res/layout/effects3dlayout.xml
@@ -11,38 +11,74 @@
         android:layout_weight="1" />
 
     <LinearLayout
-        android:orientation="horizontal"
         android:layout_width="match_parent"
-        android:layout_height="50dp"
-        android:layout_gravity="center">
+        android:layout_height="32dp"
+        android:orientation="horizontal">
 
-        <Button
+        <CheckBox
+            android:id="@+id/effects3dCheckBoxCenter"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="@string/Add"
+            android:layout_weight="1"
+            android:checked="true"
+            android:onClick="showCenter"
+            android:text="@string/show_center"
+            android:textSize="12sp"/>
+
+        <CheckBox
+            android:id="@+id/effects3dCheckBoxRegion"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:checked="true"
+            android:onClick="showRegion"
+            android:text="@string/show_region"
+            android:textSize="12sp"/>
+
+        <CheckBox
+            android:id="@+id/effects3dCheckBoxNormal"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:checked="true"
+            android:onClick="showNormal"
+            android:text="@string/show_normal"
+            android:textSize="12sp"/>
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="42dp"
+        android:layout_gravity="center"
+        android:orientation="horizontal">
+
+        <Button
             android:id="@+id/buttonAdd"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
             android:onClick="newEffect"
+            android:text="@string/Add"
             />
 
         <TextView
+            android:id="@+id/textView10"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:textAppearance="?android:attr/textAppearanceMedium"
             android:text="@string/New"
-            android:id="@+id/textView10"/>
+            android:textAppearance="?android:attr/textAppearanceMedium"/>
 
         <Spinner
+            android:id="@+id/effects3dspinner"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:id="@+id/effects3dspinner"
             android:layout_weight="0.5"/>
 
         <Button
+            android:id="@+id/buttonRemove"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="@string/reset"
-            android:id="@+id/buttonRemove"
             android:onClick="removeAll"
+            android:text="@string/reset"
             />
 
     </LinearLayout>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 31c2d17..4c49474 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -65,6 +65,9 @@
     <string name="quality1">High</string>
     <string name="quality2">Medium</string>
     <string name="quality3">Low</string>
+    <string name="show_center">Show Center</string>
+    <string name="show_region">Show Region</string>
+    <string name="show_normal">Show Normals</string>
 
     <string name="radius_placeholder">Radius: %1$s</string>
     <string name="noise_placeholder">Noise %1$s</string>
