commit 83e0ca5ea2f4fdccdd68b32442e5ed49e29eab16
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Feb 27 21:47:41 2020 +0000

    New Mesh 'Triangles' and updated Inflate & Generic apps to test it.

diff --git a/src/main/java/org/distorted/examples/generic/GenericActivity.java b/src/main/java/org/distorted/examples/generic/GenericActivity.java
index 7ba7b4f..0ae1fc8 100644
--- a/src/main/java/org/distorted/examples/generic/GenericActivity.java
+++ b/src/main/java/org/distorted/examples/generic/GenericActivity.java
@@ -108,7 +108,12 @@ public class GenericActivity extends Activity
     Spinner typeSpinner  = findViewById(R.id.objectpicker_spinnerType);
     typeSpinner.setOnItemSelectedListener(this);
 
-    String[] objectType = new String[] {"Mesh: Cubes", "Mesh: Flat", "Mesh: Sphere", "Mesh: Quad"};
+    String[] objectType = new String[GenericMeshList.LENGTH];
+
+    for(int mesh=0; mesh<GenericMeshList.LENGTH; mesh++)
+      {
+      objectType[mesh] = "Mesh: "+GenericMeshList.getName(mesh);
+      }
 
     ArrayAdapter<String> adapterType = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectType);
     adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
@@ -214,19 +219,18 @@ public class GenericActivity extends Activity
     Intent mainInt = new Intent( getApplicationContext(), GenericActivity2.class);
     Bundle b = new Bundle();
 
-    int rows=0, cols=0;
+    int rows,cols;
 
-    switch(mObjectType)
+    switch( GenericMeshList.getDimension(mObjectType) )
       {
-      case 0:
-      case 1: rows = mNumRows;
-              cols = mNumCols;
+      case 0: rows = 1;          // a quad
+              cols = 1;
               break;
-      case 2: rows = mNumRows;   // always make the sphere equal in X and Y
-              cols = mNumRows;   //
+      case 1: rows = mNumRows;   // Triangles, Sphere
+              cols = mNumRows;
               break;
-      case 3: rows = 1;          // a quad is always 1x1
-              cols = 1;
+      default:rows = mNumRows;
+              cols = mNumCols;
               break;
       }
 
@@ -265,25 +269,11 @@ public class GenericActivity extends Activity
                                               mObjectType = pos;
                                               uncheckAll();
 
-                                              switch(mObjectType)
-                                                {
-                                                case 0: mColsPicker.setEnabled(true);
-                                                        mRowsPicker.setEnabled(true);
-                                                        mSlicPicker.setEnabled(true);
-                                                        break;
-                                                case 1: mColsPicker.setEnabled(true);
-                                                        mRowsPicker.setEnabled(true);
-                                                        mSlicPicker.setEnabled(false);
-                                                        break;
-                                                case 2: mColsPicker.setEnabled(false);
-                                                        mRowsPicker.setEnabled(true);
-                                                        mSlicPicker.setEnabled(false);
-                                                        break;
-                                                case 3: mColsPicker.setEnabled(false);
-                                                        mRowsPicker.setEnabled(false);
-                                                        mSlicPicker.setEnabled(false);
-                                                        break;
-                                                }
+                                              int dim = GenericMeshList.getDimension(mObjectType);
+
+                                              mRowsPicker.setEnabled(dim>=1);
+                                              mColsPicker.setEnabled(dim>=2);
+                                              mSlicPicker.setEnabled(dim>=3);
                                               }
                                             break;
       case R.id.objectpicker_spinnerBitmap: switch(pos)
diff --git a/src/main/java/org/distorted/examples/generic/GenericActivity2.java b/src/main/java/org/distorted/examples/generic/GenericActivity2.java
index 952a215..cedbd7c 100644
--- a/src/main/java/org/distorted/examples/generic/GenericActivity2.java
+++ b/src/main/java/org/distorted/examples/generic/GenericActivity2.java
@@ -34,11 +34,7 @@ import org.distorted.examples.R;
 import org.distorted.library.main.DistortedLibrary;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedTexture;
-import org.distorted.library.mesh.MeshCubes;
-import org.distorted.library.mesh.MeshRectangles;
 import org.distorted.library.mesh.MeshBase;
-import org.distorted.library.mesh.MeshQuad;
-import org.distorted.library.mesh.MeshSphere;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 
@@ -80,41 +76,13 @@ public class GenericActivity2 extends AppCompatActivity
     mShowNormal = false;
     mUseOIT     = false;
 
-    mEffects= new DistortedEffects();
-
-    int maxsize = numCols > numRows ? (numCols>numSlic ? numCols:numSlic) : (numRows>numSlic ? numRows:numSlic) ;
-
+    int maxsize = numCols > numRows ? (numCols>numSlic ? numCols:numSlic) : (numRows>numSlic ? numRows:numSlic);
     createBitmap(maxsize, bitmapID);
-
-    switch(objectType)
-      {
-      case 0: if( bitmapID!=-1 )
-                {
-                mMesh = new MeshCubes(numCols, str, numSlic);
-                }
-              else
-                {
-                Static4D mapFB = new Static4D(0.0f,0.0f, (float)numCols/maxsize, (float)numRows/maxsize);
-                Static4D mapLR = new Static4D(0.0f,0.0f, (float)numSlic/maxsize, (float)numRows/maxsize);
-                Static4D mapTB = new Static4D(0.0f,0.0f, (float)numCols/maxsize, (float)numSlic/maxsize);
-
-                mMesh = new MeshCubes(numCols, str, numSlic, mapFB, mapFB, mapLR, mapLR, mapTB, mapTB);
-                }
-              mMesh.setStretch(numCols,numRows,numSlic);
-              break;
-      case 1: mMesh = new MeshRectangles(numCols,numRows);
-              mMesh.setStretch(numCols,numRows,0);
-              break;
-      case 2: mMesh = new MeshSphere(numRows);
-              mMesh.setStretch(numRows,numRows,numRows);
-              break;
-      case 3: mMesh = new MeshQuad();
-              mMesh.setStretch(1,1,0);
-              break;
-      }
+    mMesh =  GenericMeshList.createMesh(objectType, numCols, numRows, numSlic, bitmapID, str);
 
     mMesh.setShowNormals(mShowNormal);
     mTexture= new DistortedTexture();
+    mEffects= new DistortedEffects();
 
     final View view = getLayoutInflater().inflate(R.layout.genericlayout, null);
 
diff --git a/src/main/java/org/distorted/examples/generic/GenericEffect.java b/src/main/java/org/distorted/examples/generic/GenericEffect.java
index 8ded9be..e169399 100644
--- a/src/main/java/org/distorted/examples/generic/GenericEffect.java
+++ b/src/main/java/org/distorted/examples/generic/GenericEffect.java
@@ -107,7 +107,7 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
 
     switch(mName)
       {
-      case ROTATE           : effect = new MatrixEffectRotate      (mDyn1, mDyn3, mCenterDyn); android.util.Log.e("eff", "adding rotate with center "+mCenterSta.get0());break;
+      case ROTATE           : effect = new MatrixEffectRotate      (mDyn1, mDyn3, mCenterDyn);break;
       case QUATERNION       : effect = new MatrixEffectQuaternion  (mDyn4, mCenterDyn); break;
       case MOVE             : effect = new MatrixEffectMove        (mDyn3)            ; break;
       case SCALE            : effect = new MatrixEffectScale       (mDyn3)            ; break;
diff --git a/src/main/java/org/distorted/examples/generic/GenericMeshList.java b/src/main/java/org/distorted/examples/generic/GenericMeshList.java
new file mode 100644
index 0000000..832e3ef
--- /dev/null
+++ b/src/main/java/org/distorted/examples/generic/GenericMeshList.java
@@ -0,0 +1,121 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2020 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted is free software: you can redistribute it and/or modify                             //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted is distributed in the hope that it will be useful,                                  //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.examples.generic;
+
+import org.distorted.library.mesh.MeshBase;
+import org.distorted.library.mesh.MeshCubes;
+import org.distorted.library.mesh.MeshQuad;
+import org.distorted.library.mesh.MeshRectangles;
+import org.distorted.library.mesh.MeshSphere;
+import org.distorted.library.mesh.MeshTriangles;
+import org.distorted.library.type.Static4D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public enum GenericMeshList
+  {
+  CUBES      ( "Cubes"      , 3 ),
+  RECTANGLES ( "Rectangles" , 2 ),
+  SPHERE     ( "Sphere"     , 1 ),
+  QUAD       ( "Quad"       , 0 ),
+  TRIANGLES  ( "Triangles"  , 1 ),
+  ;
+
+  static final int LENGTH = values().length;
+  private static final GenericMeshList[] meshes;
+  private String mName;
+  private int mDimension;
+
+  static
+    {
+    int i=0;
+    meshes = new GenericMeshList[LENGTH];
+
+    for(GenericMeshList mesh: GenericMeshList.values())
+      {
+      meshes[i++] = mesh;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  GenericMeshList(String name, int dim )
+    {
+    mName      = name;
+    mDimension =  dim;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static String getName(int ordinal)
+    {
+    return meshes[ordinal].mName;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static int getDimension(int ordinal)
+    {
+    return  meshes[ordinal].mDimension;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static MeshBase createMesh(int ordinal, int cols, int rows, int slic, int bitmapID, String str)
+    {
+    MeshBase mesh;
+
+    int maxsize = cols > rows ? (cols>slic ? cols:slic) : (rows>slic ? rows:slic) ;
+
+    switch( meshes[ordinal] )
+      {
+      case CUBES     : if( bitmapID!=-1 )
+                         {
+                         mesh = new MeshCubes(cols, str, slic);
+                         }
+                       else
+                         {
+                         Static4D mapFB = new Static4D(0.0f,0.0f, (float)cols/maxsize, (float)rows/maxsize);
+                         Static4D mapLR = new Static4D(0.0f,0.0f, (float)slic/maxsize, (float)rows/maxsize);
+                         Static4D mapTB = new Static4D(0.0f,0.0f, (float)cols/maxsize, (float)slic/maxsize);
+
+                         mesh = new MeshCubes(cols, str, slic, mapFB, mapFB, mapLR, mapLR, mapTB, mapTB);
+                         }
+                       mesh.setStretch(cols,rows,slic);
+                       break;
+      case RECTANGLES: mesh = new MeshRectangles(cols,rows);
+                       mesh.setStretch(cols,rows,0);
+                       break;
+      case SPHERE    : mesh = new MeshSphere(rows);
+                       mesh.setStretch(rows,rows,rows);
+                       break;
+      case QUAD      : mesh = new MeshQuad();
+                       mesh.setStretch(1,1,0);
+                       break;
+      case TRIANGLES : mesh = new MeshTriangles(rows);
+                       mesh.setStretch(rows,rows,0);
+                       break;
+      default:         mesh = null;
+                       android.util.Log.e("Meshes", "Error: unimplemented Mesh!");
+      }
+
+    return mesh;
+    }
+  }
diff --git a/src/main/java/org/distorted/examples/inflate/InflateActivity.java b/src/main/java/org/distorted/examples/inflate/InflateActivity.java
index 488c924..953d57b 100644
--- a/src/main/java/org/distorted/examples/inflate/InflateActivity.java
+++ b/src/main/java/org/distorted/examples/inflate/InflateActivity.java
@@ -108,7 +108,12 @@ public class InflateActivity extends Activity
     Spinner typeSpinner  = findViewById(R.id.objectpicker_spinnerType);
     typeSpinner.setOnItemSelectedListener(this);
 
-    String[] objectType = new String[] {"Mesh: Cubes", "Mesh: Flat", "Mesh: Sphere", "Mesh: Quad"};
+    String[] objectType = new String[InflateMeshList.LENGTH];
+
+    for(int mesh=0; mesh<InflateMeshList.LENGTH; mesh++)
+      {
+      objectType[mesh] = "Mesh: "+InflateMeshList.getName(mesh);
+      }
 
     ArrayAdapter<String> adapterType = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectType);
     adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
@@ -214,19 +219,18 @@ public class InflateActivity extends Activity
     Intent mainInt = new Intent( getApplicationContext(), InflateActivity2.class);
     Bundle b = new Bundle();
 
-    int rows=0, cols=0;
+    int rows,cols;
 
-    switch(mObjectType)
+    switch( InflateMeshList.getDimension(mObjectType) )
       {
-      case 0:
-      case 1: rows = mNumRows;
-              cols = mNumCols;
+      case 0: rows = 1;          // a quad
+              cols = 1;
               break;
-      case 2: rows = mNumRows;   // always make the sphere equal in X and Y
-              cols = mNumRows;   //
+      case 1: rows = mNumRows;   // Triangles, Sphere
+              cols = mNumRows;
               break;
-      case 3: rows = 1;          // a quad is always 1x1
-              cols = 1;
+      default:rows = mNumRows;
+              cols = mNumCols;
               break;
       }
 
@@ -265,25 +269,11 @@ public class InflateActivity extends Activity
                                               mObjectType = pos;
                                               uncheckAll();
 
-                                              switch(mObjectType)
-                                                {
-                                                case 0: mColsPicker.setEnabled(true);
-                                                        mRowsPicker.setEnabled(true);
-                                                        mSlicPicker.setEnabled(true);
-                                                        break;
-                                                case 1: mColsPicker.setEnabled(true);
-                                                        mRowsPicker.setEnabled(true);
-                                                        mSlicPicker.setEnabled(false);
-                                                        break;
-                                                case 2: mColsPicker.setEnabled(false);
-                                                        mRowsPicker.setEnabled(true);
-                                                        mSlicPicker.setEnabled(false);
-                                                        break;
-                                                case 3: mColsPicker.setEnabled(false);
-                                                        mRowsPicker.setEnabled(false);
-                                                        mSlicPicker.setEnabled(false);
-                                                        break;
-                                                }
+                                              int dim = InflateMeshList.getDimension(mObjectType);
+
+                                              mRowsPicker.setEnabled(dim>=1);
+                                              mColsPicker.setEnabled(dim>=2);
+                                              mSlicPicker.setEnabled(dim>=3);
                                               }
                                             break;
       case R.id.objectpicker_spinnerBitmap: switch(pos)
diff --git a/src/main/java/org/distorted/examples/inflate/InflateActivity2.java b/src/main/java/org/distorted/examples/inflate/InflateActivity2.java
index aedf88a..cd2e2ee 100644
--- a/src/main/java/org/distorted/examples/inflate/InflateActivity2.java
+++ b/src/main/java/org/distorted/examples/inflate/InflateActivity2.java
@@ -23,11 +23,6 @@ import org.distorted.library.main.DistortedLibrary;
 import org.distorted.examples.R;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshBase;
-import org.distorted.library.mesh.MeshCubes;
-import org.distorted.library.mesh.MeshRectangles;
-import org.distorted.library.mesh.MeshQuad;
-import org.distorted.library.mesh.MeshSphere;
-import org.distorted.library.type.Static4D;
 
 import android.app.Activity;
 import android.graphics.Bitmap;
@@ -54,7 +49,6 @@ public class InflateActivity2 extends Activity implements SeekBar.OnSeekBarChang
     private TextView mTextLevel;
     private DistortedTexture mTexture;
     private MeshBase mMesh;
-    private int mNumCols, mNumRows, mNumSlic;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
@@ -100,46 +94,18 @@ public class InflateActivity2 extends Activity implements SeekBar.OnSeekBarChang
       String str     = b.getString("string");
       int objectType = b.getInt("type");
       int bitmapID   = b.getInt("bitmap");
-      mNumCols       = b.getInt("cols");
-      mNumRows       = b.getInt("rows");
-      mNumSlic       = b.getInt("slices");
-
-      int maxsize = mNumCols > mNumRows ? (mNumCols>mNumSlic ? mNumCols:mNumSlic) : (mNumRows>mNumSlic ? mNumRows:mNumSlic) ;
+      int numCols    = b.getInt("cols");
+      int numRows    = b.getInt("rows");
+      int numSlic    = b.getInt("slices");
 
+      int maxsize = numCols > numRows ? (numCols>numSlic ? numCols:numSlic) : (numRows>numSlic ? numRows:numSlic);
       createBitmap(maxsize,bitmapID);
-
-      switch(objectType)
-        {
-        case 0: if( bitmapID!=-1 )
-                  {
-                  mMesh = new MeshCubes(mNumCols, str, mNumSlic);
-                  }
-                else
-                  {
-                  Static4D mapFB = new Static4D(0.0f,0.0f, (float)mNumCols/maxsize, (float)mNumRows/maxsize);
-                  Static4D mapLR = new Static4D(0.0f,0.0f, (float)mNumSlic/maxsize, (float)mNumRows/maxsize);
-                  Static4D mapTB = new Static4D(0.0f,0.0f, (float)mNumCols/maxsize, (float)mNumSlic/maxsize);
-
-                  mMesh = new MeshCubes(mNumCols, str, mNumSlic, mapFB, mapFB, mapLR, mapLR, mapTB, mapTB);
-                  }
-                mMesh.setStretch(mNumCols,mNumRows,mNumSlic);
-                break;
-        case 1: mMesh = new MeshRectangles(mNumCols,mNumRows);
-                mMesh.setStretch(mNumCols,mNumRows,0);
-                break;
-        case 2: mMesh = new MeshSphere(mNumRows);
-                mMesh.setStretch(mNumRows,mNumRows,mNumRows);
-                break;
-        case 3: mMesh = new MeshQuad();
-                mMesh.setStretch(1,1,0);
-                break;
-        }
-
+      mMesh =  InflateMeshList.createMesh(objectType, numCols, numRows, numSlic, bitmapID, str);
       mTexture = new DistortedTexture();
 
       setContentView(R.layout.inflatelayout);
 
-      Spinner renderSpinner  = findViewById(R.id.inflateSpinnerMode);
+      Spinner renderSpinner = findViewById(R.id.inflateSpinnerMode);
       renderSpinner.setOnItemSelectedListener(this);
 
       String[] objectBitmap = new String[] { "Render: Normal", "Render: OIT" };
@@ -268,25 +234,4 @@ public class InflateActivity2 extends Activity implements SeekBar.OnSeekBarChang
       {
       return mMesh;
       }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    public int getNumCols()
-      {
-      return mNumCols;
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    public int getNumRows()
-      {
-      return mNumRows;
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    public int getNumSlic()
-      {
-      return mNumSlic;
-      }
 }
diff --git a/src/main/java/org/distorted/examples/inflate/InflateMeshList.java b/src/main/java/org/distorted/examples/inflate/InflateMeshList.java
new file mode 100644
index 0000000..f4e4c2d
--- /dev/null
+++ b/src/main/java/org/distorted/examples/inflate/InflateMeshList.java
@@ -0,0 +1,121 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2020 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted is free software: you can redistribute it and/or modify                             //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted is distributed in the hope that it will be useful,                                  //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.examples.inflate;
+
+import org.distorted.library.mesh.MeshBase;
+import org.distorted.library.mesh.MeshCubes;
+import org.distorted.library.mesh.MeshQuad;
+import org.distorted.library.mesh.MeshRectangles;
+import org.distorted.library.mesh.MeshSphere;
+import org.distorted.library.mesh.MeshTriangles;
+import org.distorted.library.type.Static4D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public enum InflateMeshList
+  {
+  CUBES      ( "Cubes"      , 3 ),
+  RECTANGLES ( "Rectangles" , 2 ),
+  SPHERE     ( "Sphere"     , 1 ),
+  QUAD       ( "Quad"       , 0 ),
+  TRIANGLES  ( "Triangles"  , 1 ),
+  ;
+
+  static final int LENGTH = values().length;
+  private static final InflateMeshList[] meshes;
+  private String mName;
+  private int mDimension;
+
+  static
+    {
+    int i=0;
+    meshes = new InflateMeshList[LENGTH];
+
+    for(InflateMeshList mesh: InflateMeshList.values())
+      {
+      meshes[i++] = mesh;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  InflateMeshList(String name, int dim )
+    {
+    mName      = name;
+    mDimension =  dim;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static String getName(int ordinal)
+    {
+    return meshes[ordinal].mName;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static int getDimension(int ordinal)
+    {
+    return  meshes[ordinal].mDimension;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static MeshBase createMesh(int ordinal, int cols, int rows, int slic, int bitmapID, String str)
+    {
+    MeshBase mesh;
+
+    int maxsize = cols > rows ? (cols>slic ? cols:slic) : (rows>slic ? rows:slic) ;
+
+    switch( meshes[ordinal] )
+      {
+      case CUBES     : if( bitmapID!=-1 )
+                         {
+                         mesh = new MeshCubes(cols, str, slic);
+                         }
+                       else
+                         {
+                         Static4D mapFB = new Static4D(0.0f,0.0f, (float)cols/maxsize, (float)rows/maxsize);
+                         Static4D mapLR = new Static4D(0.0f,0.0f, (float)slic/maxsize, (float)rows/maxsize);
+                         Static4D mapTB = new Static4D(0.0f,0.0f, (float)cols/maxsize, (float)slic/maxsize);
+
+                         mesh = new MeshCubes(cols, str, slic, mapFB, mapFB, mapLR, mapLR, mapTB, mapTB);
+                         }
+                       mesh.setStretch(cols,rows,slic);
+                       break;
+      case RECTANGLES: mesh = new MeshRectangles(cols,rows);
+                       mesh.setStretch(cols,rows,0);
+                       break;
+      case SPHERE    : mesh = new MeshSphere(rows);
+                       mesh.setStretch(rows,rows,rows);
+                       break;
+      case QUAD      : mesh = new MeshQuad();
+                       mesh.setStretch(1,1,0);
+                       break;
+      case TRIANGLES : mesh = new MeshTriangles(rows);
+                       mesh.setStretch(rows,rows,0);
+                       break;
+      default:         mesh = null;
+                       android.util.Log.e("Meshes", "Error: unimplemented Mesh!");
+      }
+
+    return mesh;
+    }
+  }
