commit 5bf698ee8c74c7bf5aa8b3ca9e2c86c821b15c62
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Wed Jul 27 00:24:41 2016 +0100

    Tesselate DistortedBitmaps better - now all the triangles long edges point at the center of the bitmap, which makes z-distortions look much better!

diff --git a/src/main/java/org/distorted/library/Distorted.java b/src/main/java/org/distorted/library/Distorted.java
index 4a47a94..01a9ae8 100644
--- a/src/main/java/org/distorted/library/Distorted.java
+++ b/src/main/java/org/distorted/library/Distorted.java
@@ -349,6 +349,7 @@ public class Distorted
     GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
     GLES20.glEnable(GLES20.GL_CULL_FACE);
     GLES20.glCullFace(GLES20.GL_BACK);
+    GLES20.glFrontFace(GLES20.GL_CW);
 
     mTextureUniformH = GLES20.glGetUniformLocation(mProgramH, "u_Texture");
     
diff --git a/src/main/java/org/distorted/library/DistortedBitmapGrid.java b/src/main/java/org/distorted/library/DistortedBitmapGrid.java
index 6f39e58..e2522fa 100644
--- a/src/main/java/org/distorted/library/DistortedBitmapGrid.java
+++ b/src/main/java/org/distorted/library/DistortedBitmapGrid.java
@@ -34,7 +34,18 @@ class DistortedBitmapGrid extends DistortedObjectGrid
     float tmpx,tmpy,tmpz;
     float[] bufferData;
 
-    dataLength = 2*xLength*(yLength-1)+2*(yLength-2); // (yLength-1) strips, 2*xLength triangles in each, plus 2 degenerate triangles per each of (yLength-2) joins 
+    dataLength = 2*xLength*(yLength-1)  // (yLength-1) strips, 2*xLength triangles in each,
+                        +2*(yLength-2); // plus 2 degenerate triangles per each of (yLength-2) joins
+
+    if( xLength>2 )
+      {
+      dataLength += 3*(yLength-1); // we change direction of triangles midway through each row (+3 triangles per row)
+      dataLength +=   (yLength-2); // we also need to change direction when pulling back to the left (+1 extra triangle)
+
+      if( yLength>2 )
+        dataLength -= 1;           // but if we do a vertical triangle direction shift as well, then one of the 'pull backs'
+                                   // does not have to add an extra triangle.
+      }
 
     ////////////////////////////////////////////////////////////
     // vertex indices
@@ -42,20 +53,86 @@ class DistortedBitmapGrid extends DistortedObjectGrid
     int offset=0;
     final short[] indexData = new short[dataLength];
 
+    int changePointX = xLength/2;
+    int changePointY = yLength/2;
+
     for(int y=0; y<yLength-1; y++)
       {
-      if (y>0) indexData[offset++] = (short) (y*xLength); // Degenerate begin: repeat first vertex
+      if( y>0 )
+        {
+        if( y<changePointY )
+          {
+          indexData[offset++] = (short) ((y+1)*xLength);
+          if( xLength>2 )
+            indexData[offset++] = (short) ((y+1)*xLength);
+          }
+        else
+          {
+          indexData[offset++] = (short) (y*xLength);
+          if( xLength>2 && y!=changePointY)
+            indexData[offset++] = (short) (y*xLength);
+          }
+        }
 
-      for (int x = 0; x < xLength; x++)
+      if (y<changePointY)
         {
-        indexData[offset++] = (short) (( y   *xLength)+x);
-        indexData[offset++] = (short) (((y+1)*xLength)+x);
+        for(int x=0; x<xLength; x++)
+          {
+          if( x<=changePointX )
+            {
+            indexData[offset++] = (short) (((y+1)*xLength)+x);
+            indexData[offset++] = (short) (( y   *xLength)+x);
+            }
+          else
+            {
+            indexData[offset++] = (short) (( y   *xLength)+x);
+            indexData[offset++] = (short) (((y+1)*xLength)+x);
+            }
+
+          if( x==changePointX && xLength>2 )
+            {
+            indexData[offset++] = (short) (( y   *xLength)+x);
+            indexData[offset++] = (short) (( y   *xLength)+x);
+            indexData[offset++] = (short) (((y+1)*xLength)+x);
+            }
+          }
+        }
+      else
+        {
+        for(int x=0; x<xLength; x++)
+          {
+          if( x<=changePointX )
+            {
+            indexData[offset++] = (short) (( y   *xLength)+x);
+            indexData[offset++] = (short) (((y+1)*xLength)+x);
+            }
+          else
+            {
+            indexData[offset++] = (short) (((y+1)*xLength)+x);
+            indexData[offset++] = (short) (( y   *xLength)+x);
+            }
+
+          if( x==changePointX && xLength>2 )
+            {
+            indexData[offset++] = (short) (((y+1)*xLength)+x);
+            indexData[offset++] = (short) (((y+1)*xLength)+x);
+            indexData[offset++] = (short) (( y   *xLength)+x);
+            }
+          }
         }
 
-      if (y<yLength-2) indexData[offset++] = (short) (((y+1)*xLength) + (xLength-1)); // Degenerate end: repeat last vertex
+      if (y<changePointY && yLength>2 )
+        {
+        indexData[offset++] = (short) (((y+1)*xLength) + (xLength-1));
+        }
+      else if(y<yLength-2)
+        {
+        indexData[offset++] = (short) ((y    *xLength) + (xLength-1));
+        }
       }
 
-    // for(int g=0; g<dataLength; g++) Log.e("grid", "index["+g+"]="+indexData[g]);
+     //android.util.Log.e("grid", "xLength="+xLength+" yLength="+yLength);
+     //for(int g=0; g<dataLength; g++) android.util.Log.e("grid", "index["+g+"]="+indexData[g]);
 
     ////////////////////////////////////////////////////////////
     // texture
@@ -65,8 +142,8 @@ class DistortedBitmapGrid extends DistortedObjectGrid
 
     for(int i=0; i<dataLength; i++)
       {
-      tmpx = ((float)(indexData[offset/2]%xLength))/(xLength-1);
-      tmpy = ((float)(indexData[offset/2]/xLength))/(yLength-1);
+      tmpx = ((float)(indexData[i]%xLength))/(xLength-1);
+      tmpy = ((float)(indexData[i]/xLength))/(yLength-1);
 
       bufferData[offset++] = tmpx; // s=x
       bufferData[offset++] = tmpy; // t=y
@@ -85,8 +162,8 @@ class DistortedBitmapGrid extends DistortedObjectGrid
 
     for(int i=0; i<dataLength; i++)
       {
-      tmpx = ((float)(indexData[offset/3]%xLength))/(xLength-1);
-      tmpy = ((float)(indexData[offset/3]/xLength))/(yLength-1);
+      tmpx = ((float)(indexData[i]%xLength))/(xLength-1);
+      tmpy = ((float)(indexData[i]/xLength))/(yLength-1);
       tmpz = 0;
 
       bufferData[offset++] = (tmpx-0.5f); // x
