commit 715e77266b2f4c9bdc31ab2000e74b176f61b264
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Nov 21 11:00:05 2018 +0000

    Rename MeshObject to MeshBase.

diff --git a/src/main/java/org/distorted/library/main/DistortedEffects.java b/src/main/java/org/distorted/library/main/DistortedEffects.java
index a87405c..f29982a 100644
--- a/src/main/java/org/distorted/library/main/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/main/DistortedEffects.java
@@ -29,7 +29,7 @@ import org.distorted.library.effect.EffectName;
 import org.distorted.library.effect.EffectType;
 import org.distorted.library.effect.FragmentEffect;
 import org.distorted.library.effect.VertexEffect;
-import org.distorted.library.mesh.MeshObject;
+import org.distorted.library.mesh.MeshBase;
 import org.distorted.library.message.EffectListener;
 import org.distorted.library.program.DistortedProgram;
 
@@ -43,7 +43,7 @@ import java.nio.IntBuffer;
 /**
  * Class containing Matrix, Vertex, Fragment and Postprocessing effect queues.
  * <p>
- * The queues hold actual effects to be applied to a given (InputSurface,MeshObject) combo.
+ * The queues hold actual effects to be applied to a given (InputSurface,MeshBase) combo.
  */
 public class DistortedEffects
   {
@@ -423,7 +423,7 @@ public class DistortedEffects
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void displayNormals(MeshObject mesh)
+  private void displayNormals(MeshBase mesh)
     {
     int num = mesh.getNumVertices();
 
@@ -438,7 +438,7 @@ public class DistortedEffects
     mNormalProgram.useProgram();
     GLES31.glUniformMatrix4fv(mNormalMVPMatrixH, 1, false, mM.getMVP() , 0);
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getTFO() );
-    GLES31.glVertexAttribPointer(mNormalProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES31.GL_FLOAT, false, 0, 0);
+    GLES31.glVertexAttribPointer(mNormalProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, 0, 0);
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
     GLES31.glLineWidth(8.0f);
     GLES31.glDrawArrays(GLES31.GL_LINES, 0, 2*num);
@@ -454,7 +454,7 @@ public class DistortedEffects
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void drawPrivOIT(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime)
+  void drawPrivOIT(float halfW, float halfH, MeshBase mesh, DistortedOutputSurface surface, long currTime)
     {
     float halfZ = halfW*mesh.getZFactor();
 
@@ -471,9 +471,9 @@ public class DistortedEffects
     GLES31.glUniform1ui(mMainOITNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) );
 
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getVBO() );
-    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0);
-    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[1], MeshObject.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET1);
-    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2);
+    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET0);
+    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[1], MeshBase.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET1);
+    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[2], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET2);
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
 
     mM.send(surface,halfW,halfH,halfZ,0,1);
@@ -494,7 +494,7 @@ public class DistortedEffects
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void drawPriv(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime)
+  void drawPriv(float halfW, float halfH, MeshBase mesh, DistortedOutputSurface surface, long currTime)
     {
     float halfZ = halfW*mesh.getZFactor();
 
@@ -509,9 +509,9 @@ public class DistortedEffects
     GLES31.glUniform1i(mMainTextureH, 0);
 
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getVBO() );
-    GLES31.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0);
-    GLES31.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshObject.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET1);
-    GLES31.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2);
+    GLES31.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET0);
+    GLES31.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshBase.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET1);
+    GLES31.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET2);
     GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
 
     mM.send(surface,halfW,halfH,halfZ,0,0);
@@ -931,7 +931,7 @@ public class DistortedEffects
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Returns the maximum number of effects of a given type that can be simultaneously applied to a
- * single (InputSurface,MeshObject) combo.
+ * single (InputSurface,MeshBase) combo.
  *
  * @param type {@link EffectType}
  * @return The maximum number of effects of a given type.
diff --git a/src/main/java/org/distorted/library/main/DistortedNode.java b/src/main/java/org/distorted/library/main/DistortedNode.java
index 23ae5c1..0d00090 100644
--- a/src/main/java/org/distorted/library/main/DistortedNode.java
+++ b/src/main/java/org/distorted/library/main/DistortedNode.java
@@ -21,7 +21,7 @@ package org.distorted.library.main;
 
 import android.opengl.GLES31;
 
-import org.distorted.library.mesh.MeshObject;
+import org.distorted.library.mesh.MeshBase;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -68,7 +68,7 @@ public class DistortedNode implements DistortedMaster.Slave
   private boolean mRenderWayOIT;
   private DistortedNode mParent;
   private DistortedOutputSurface mSurfaceParent;
-  private MeshObject mMesh;
+  private MeshBase mMesh;
   private DistortedEffects mEffects;
   private DistortedSurface mSurface;
   private DistortedRenderState mState;
@@ -375,9 +375,9 @@ public class DistortedNode implements DistortedMaster.Slave
  *     
  * @param surface InputSurface to put into the new Node.
  * @param effects DistortedEffects to put into the new Node.
- * @param mesh MeshObject to put into the new Node.
+ * @param mesh MeshBase to put into the new Node.
  */
-  public DistortedNode(DistortedSurface surface, DistortedEffects effects, MeshObject mesh)
+  public DistortedNode(DistortedSurface surface, DistortedEffects effects, MeshBase mesh)
     {
     mSurface       = surface;
     mEffects       = effects;
@@ -559,10 +559,10 @@ public class DistortedNode implements DistortedMaster.Slave
  *
  * @param surface InputSurface to initialize our child Node with.
  * @param effects DistortedEffects to initialize our child Node with.
- * @param mesh MeshObject to initialize our child Node with.
+ * @param mesh MeshBase to initialize our child Node with.
  * @return the newly constructed child Node, or null if we couldn't allocate resources.
  */
-  public DistortedNode attach(DistortedSurface surface, DistortedEffects effects, MeshObject mesh)
+  public DistortedNode attach(DistortedSurface surface, DistortedEffects effects, MeshBase mesh)
     {
     DistortedNode node = new DistortedNode(surface,effects,mesh);
     mJobs.add(new Job(ATTACH,node));
@@ -748,7 +748,7 @@ public class DistortedNode implements DistortedMaster.Slave
  *
  * @return Mesh contained in the Node.
  */
-  public MeshObject getMesh()
+  public MeshBase getMesh()
     {
     return mMesh;
     }
diff --git a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
index 4e8028a..eab4103 100644
--- a/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
+++ b/src/main/java/org/distorted/library/main/DistortedOutputSurface.java
@@ -23,7 +23,7 @@ import android.opengl.GLES31;
 import android.opengl.Matrix;
 
 import org.distorted.library.effect.EffectQuality;
-import org.distorted.library.mesh.MeshObject;
+import org.distorted.library.mesh.MeshBase;
 
 import java.util.ArrayList;
 
@@ -921,10 +921,10 @@ public void setOrderIndependentTransparency(boolean oit, float initialSize)
  *
  * @param surface InputSurface to initialize our child Node with.
  * @param effects DistortedEffects to initialize our child Node with.
- * @param mesh MeshObject to initialize our child Node with.
+ * @param mesh MeshBase to initialize our child Node with.
  * @return the newly constructed child Node, or null if we couldn't allocate resources.
  */
-  public DistortedNode attach(DistortedSurface surface, DistortedEffects effects, MeshObject mesh)
+  public DistortedNode attach(DistortedSurface surface, DistortedEffects effects, MeshBase mesh)
     {
     DistortedNode node = new DistortedNode(surface,effects,mesh);
     mJobs.add(new Job(ATTACH,node));
diff --git a/src/main/java/org/distorted/library/main/DistortedScreen.java b/src/main/java/org/distorted/library/main/DistortedScreen.java
index 37db7d7..0dceac6 100644
--- a/src/main/java/org/distorted/library/main/DistortedScreen.java
+++ b/src/main/java/org/distorted/library/main/DistortedScreen.java
@@ -27,8 +27,8 @@ import android.graphics.Paint;
 import android.opengl.GLES31;
 
 import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.mesh.MeshBase;
 import org.distorted.library.mesh.MeshFlat;
-import org.distorted.library.mesh.MeshObject;
 import org.distorted.library.type.Static3D;
 
 /**
@@ -43,7 +43,7 @@ public class DistortedScreen extends DistortedFramebuffer
 
   private static final int NUM_FRAMES  = 100;
 
-  private MeshObject fpsMesh;
+  private MeshBase fpsMesh;
   private DistortedTexture fpsTexture;
   private DistortedEffects fpsEffects;
   private Canvas fpsCanvas;
diff --git a/src/main/java/org/distorted/library/main/DistortedSurface.java b/src/main/java/org/distorted/library/main/DistortedSurface.java
index 4d43f66..d93338f 100644
--- a/src/main/java/org/distorted/library/main/DistortedSurface.java
+++ b/src/main/java/org/distorted/library/main/DistortedSurface.java
@@ -21,7 +21,7 @@ package org.distorted.library.main;
 
 import android.opengl.GLES31;
 
-import org.distorted.library.mesh.MeshObject;
+import org.distorted.library.mesh.MeshBase;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
@@ -100,7 +100,7 @@ public abstract class DistortedSurface extends DistortedObject
  *
  * @return depth of the Object, in pixels.
  */
-  public int getDepth(MeshObject mesh)
+  public int getDepth(MeshBase mesh)
     {
     return mesh==null ? 0 : (int)(mWidth*mesh.getZFactor() );
     }
diff --git a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
index 64af4ce..d8f9c54 100644
--- a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
@@ -27,7 +27,7 @@ import org.distorted.library.R;
 import org.distorted.library.effect.EffectType;
 import org.distorted.library.effect.PostprocessEffect;
 import org.distorted.library.effect.VertexEffect;
-import org.distorted.library.mesh.MeshObject;
+import org.distorted.library.mesh.MeshBase;
 import org.distorted.library.message.EffectMessage;
 import org.distorted.library.program.DistortedProgram;
 
@@ -157,7 +157,7 @@ class EffectQueuePostprocess extends EffectQueue
 
     if( input.setAsInput() )
       {
-      MeshObject mesh = node.getMesh();
+      MeshBase mesh = node.getMesh();
       float    margin = mHalo*buffer.mMipmap;
 
       float halfW = input.getWidth() / 2.0f;
@@ -171,9 +171,9 @@ class EffectQueuePostprocess extends EffectQueue
       mPreProgram.useProgram();
 
       GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getVBO() );
-      GLES31.glVertexAttribPointer(mPreProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0);
-      GLES31.glVertexAttribPointer(mPreProgram.mAttribute[1], MeshObject.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET1);
-      GLES31.glVertexAttribPointer(mPreProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2);
+      GLES31.glVertexAttribPointer(mPreProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET0);
+      GLES31.glVertexAttribPointer(mPreProgram.mAttribute[1], MeshBase.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET1);
+      GLES31.glVertexAttribPointer(mPreProgram.mAttribute[2], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET2);
       GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
 
       node.getEffects().send(halfW, halfH, halfZ, margin, buffer, 2);
diff --git a/src/main/java/org/distorted/library/mesh/MeshBase.java b/src/main/java/org/distorted/library/mesh/MeshBase.java
new file mode 100644
index 0000000..372d34a
--- /dev/null
+++ b/src/main/java/org/distorted/library/mesh/MeshBase.java
@@ -0,0 +1,168 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2016 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.library.mesh;
+
+import android.opengl.GLES31;
+
+import org.distorted.library.main.Distorted;
+import org.distorted.library.main.DistortedBuffer;
+
+import java.nio.FloatBuffer;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Abstract class which represents a Mesh, ie 3 arrays of Vertex attributes: 1) positions
+ * 2) normals 3) texture coordinates.
+ * <p>
+ * If you want to render to a particular shape, extend from here, construct the attrib FloatBuffer
+ * and provide correct numVertices.
+ */
+public abstract class MeshBase
+   {
+   private static final int BYTES_PER_FLOAT = 4;
+
+   public static final int POS_DATA_SIZE= 3;
+   public static final int NOR_DATA_SIZE= 3;
+   public static final int TEX_DATA_SIZE= 2;
+
+   public static final int OFFSET0 =                                                           0;
+   public static final int OFFSET1 = (POS_DATA_SIZE                            )*BYTES_PER_FLOAT;
+   public static final int OFFSET2 = (POS_DATA_SIZE+NOR_DATA_SIZE              )*BYTES_PER_FLOAT;
+
+   public static final int TFSIZE  = (POS_DATA_SIZE+POS_DATA_SIZE              )*BYTES_PER_FLOAT;
+   public static final int VERTSIZE= (POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*BYTES_PER_FLOAT;
+
+   private boolean mShowNormals;       // when rendering this mesh, draw normal vectors?
+   private DistortedBuffer mVBO, mTFO; // main vertex buffer and transform feedback buffer
+   private final float zFactor;        // strange workaround for the fact that we need to somehow store the 'depth'
+                                       // of the Mesh. Used in DistortedEffects. See DistortedTexture.getDepth().
+
+   ////////////////////////////////////////////////////////////////////////////////
+   // derived classes need to compute and fill up those 2 variables with data
+   // describing a particular shape. Having done so, call setData()
+   int numVertices;
+   FloatBuffer mVertAttribs;   // packed: PosX,PosY,PosZ, NorX,NorY,NorZ, TexS,TexT
+   ////////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   MeshBase(float factor)
+     {
+     zFactor      = factor;
+     mShowNormals = false;
+
+     mVBO = new DistortedBuffer(GLES31.GL_ARRAY_BUFFER             , GLES31.GL_STATIC_READ);
+     mTFO = new DistortedBuffer(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, GLES31.GL_STATIC_READ);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// when a derived class is done computing its mesh, it has to call this method.
+
+   void setData(int size, FloatBuffer buffer)
+     {
+     mVBO.setData(size*VERTSIZE, buffer);
+     mTFO.setData(size*TFSIZE  , null  );
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Not part of public API, do not document (public only because has to be used from the main package)
+ *
+ * @y.exclude
+ */
+   public int getVBO()
+     {
+     return mVBO.mIndex[0];
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Not part of public API, do not document (public only because has to be used from the main package)
+ *
+ * @y.exclude
+ */
+   public int getTFO()
+     {
+     return mTFO.mIndex[0];
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Not part of public API, do not document (public only because has to be used from the main package)
+ *
+ * @y.exclude
+ */
+   public int getNumVertices()
+     {
+     return numVertices;
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Not part of public API, do not document (public only because has to be used from the main package)
+ *
+ * @y.exclude
+ */
+   public float getZFactor()
+     {
+     return zFactor;
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// PUBLIC API
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * When rendering this Mesh, do we want to render the Normal vectors as well?
+ * <p>
+ * Will work only on OpenGL ES >= 3.0 devices.
+ *
+ * @param show Controls if we render the Normal vectors or not.
+ */
+   public void setShowNormals(boolean show)
+     {
+     mShowNormals = (Distorted.GLSL >= 300 && show);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * When rendering this mesh, should we also draw the normal vectors?
+ *
+ * @return <i>true</i> if we do render normal vectors
+ */
+   public boolean getShowNormals()
+     {
+     return mShowNormals;
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Release all internal resources.
+ */
+   public void markForDeletion()
+     {
+     mVertAttribs.clear();
+
+     mVBO.markForDeletion();
+     mTFO.markForDeletion();
+     }
+   }
+
+
+
diff --git a/src/main/java/org/distorted/library/mesh/MeshCubes.java b/src/main/java/org/distorted/library/mesh/MeshCubes.java
index 3ada4f2..09ce84a 100644
--- a/src/main/java/org/distorted/library/mesh/MeshCubes.java
+++ b/src/main/java/org/distorted/library/mesh/MeshCubes.java
@@ -29,7 +29,7 @@ import java.util.ArrayList;
  * <p>
  * Any subset of a MxNx1 cuboid is possible.
  */
-public class MeshCubes extends MeshObject
+public class MeshCubes extends MeshBase
    {
    private static final float R = 0.0f;//0.2f;
 
diff --git a/src/main/java/org/distorted/library/mesh/MeshFlat.java b/src/main/java/org/distorted/library/mesh/MeshFlat.java
index 8b97ea9..acf7c85 100644
--- a/src/main/java/org/distorted/library/mesh/MeshFlat.java
+++ b/src/main/java/org/distorted/library/mesh/MeshFlat.java
@@ -29,7 +29,7 @@ import java.nio.ByteOrder;
  * Perfect if you just want to display a flat Texture. If you are not planning to apply any VERTEX
  * effects to it, use MeshFlat(1,1), i.e. a Quad. Otherwise, create more vertices for more realistic effects!
  */
-public class MeshFlat extends MeshObject
+public class MeshFlat extends MeshBase
   {
   private int mCols, mRows;
   private int remainingVert;
diff --git a/src/main/java/org/distorted/library/mesh/MeshObject.java b/src/main/java/org/distorted/library/mesh/MeshObject.java
deleted file mode 100644
index 15cc4ef..0000000
--- a/src/main/java/org/distorted/library/mesh/MeshObject.java
+++ /dev/null
@@ -1,168 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2016 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.library.mesh;
-
-import android.opengl.GLES31;
-
-import org.distorted.library.main.Distorted;
-import org.distorted.library.main.DistortedBuffer;
-
-import java.nio.FloatBuffer;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Abstract class which represents a Mesh, ie 3 arrays of Vertex attributes: 1) positions
- * 2) normals 3) texture coordinates.
- * <p>
- * If you want to render to a particular shape, extend from here, construct the attrib FloatBuffer
- * and provide correct numVertices.
- */
-public abstract class MeshObject
-   {
-   private static final int BYTES_PER_FLOAT = 4;
-
-   public static final int POS_DATA_SIZE= 3;
-   public static final int NOR_DATA_SIZE= 3;
-   public static final int TEX_DATA_SIZE= 2;
-
-   public static final int OFFSET0 =                                                           0;
-   public static final int OFFSET1 = (POS_DATA_SIZE                            )*BYTES_PER_FLOAT;
-   public static final int OFFSET2 = (POS_DATA_SIZE+NOR_DATA_SIZE              )*BYTES_PER_FLOAT;
-
-   public static final int TFSIZE  = (POS_DATA_SIZE+POS_DATA_SIZE              )*BYTES_PER_FLOAT;
-   public static final int VERTSIZE= (POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*BYTES_PER_FLOAT;
-
-   private boolean mShowNormals;       // when rendering this mesh, draw normal vectors?
-   private DistortedBuffer mVBO, mTFO; // main vertex buffer and transform feedback buffer
-   private final float zFactor;        // strange workaround for the fact that we need to somehow store the 'depth'
-                                       // of the Mesh. Used in DistortedEffects. See DistortedTexture.getDepth().
-
-   ////////////////////////////////////////////////////////////////////////////////
-   // derived classes need to compute and fill up those 2 variables with data
-   // describing a particular shape. Having done so, call setData()
-   int numVertices;
-   FloatBuffer mVertAttribs;   // packed: PosX,PosY,PosZ, NorX,NorY,NorZ, TexS,TexT
-   ////////////////////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-   MeshObject(float factor)
-     {
-     zFactor      = factor;
-     mShowNormals = false;
-
-     mVBO = new DistortedBuffer(GLES31.GL_ARRAY_BUFFER             , GLES31.GL_STATIC_READ);
-     mTFO = new DistortedBuffer(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, GLES31.GL_STATIC_READ);
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// when a derived class is done computing its mesh, it has to call this method.
-
-   void setData(int size, FloatBuffer buffer)
-     {
-     mVBO.setData(size*VERTSIZE, buffer);
-     mTFO.setData(size*TFSIZE  , null  );
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Not part of public API, do not document (public only because has to be used from the main package)
- *
- * @y.exclude
- */
-   public int getVBO()
-     {
-     return mVBO.mIndex[0];
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Not part of public API, do not document (public only because has to be used from the main package)
- *
- * @y.exclude
- */
-   public int getTFO()
-     {
-     return mTFO.mIndex[0];
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Not part of public API, do not document (public only because has to be used from the main package)
- *
- * @y.exclude
- */
-   public int getNumVertices()
-     {
-     return numVertices;
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Not part of public API, do not document (public only because has to be used from the main package)
- *
- * @y.exclude
- */
-   public float getZFactor()
-     {
-     return zFactor;
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// PUBLIC API
-///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * When rendering this Mesh, do we want to render the Normal vectors as well?
- * <p>
- * Will work only on OpenGL ES >= 3.0 devices.
- *
- * @param show Controls if we render the Normal vectors or not.
- */
-   public void setShowNormals(boolean show)
-     {
-     mShowNormals = (Distorted.GLSL >= 300 && show);
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * When rendering this mesh, should we also draw the normal vectors?
- *
- * @return <i>true</i> if we do render normal vectors
- */
-   public boolean getShowNormals()
-     {
-     return mShowNormals;
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Release all internal resources.
- */
-   public void markForDeletion()
-     {
-     mVertAttribs.clear();
-
-     mVBO.markForDeletion();
-     mTFO.markForDeletion();
-     }
-   }
-
-
-
