commit a16bf106cf0b2fe81590807c057239c1eb19e77a
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Dec 10 13:39:09 2018 +0000

    Make the Effects3D app a bit more user-friendly.

diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java b/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java
index dedc039..fa719a6 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java
@@ -171,6 +171,9 @@ public class PostprocessEffectGlow extends PostprocessEffect
     float offsetCorrW = corrW/w;
     float offsetCorrH = corrH/h;
 
+    // try tracking the bug when sometimes the size of the GLOW overlay is wrong
+    android.util.Log.e("glow", "w="+w+" h="+h+" corrW="+corrW+" corrH="+corrH);
+
     int radius = (int)(uniforms[index]*mQualityScale);
     if( radius>=MAX_HALO ) radius = MAX_HALO-1;
     computeGaussianKernel(radius);
diff --git a/src/main/java/org/distorted/library/mesh/MeshCubes.java b/src/main/java/org/distorted/library/mesh/MeshCubes.java
index 363825e..173c313 100644
--- a/src/main/java/org/distorted/library/mesh/MeshCubes.java
+++ b/src/main/java/org/distorted/library/mesh/MeshCubes.java
@@ -57,7 +57,7 @@ public class MeshCubes extends MeshBase
    private int mCols, mRows, mSlices;
    private int[][] mCubes;
    private byte[][] mInflateX, mInflateY;
-   private float mInfCorrX, mInfCorrY, mInfCorrZ;
+   private float mInfCorr;
    private ArrayList<Edge> mEdges = new ArrayList<>();
 
    private int currVert;
@@ -191,12 +191,8 @@ public class MeshCubes extends MeshBase
        mCols = cols;
        mRows = desc.length()/cols;
 
-       int max = mRows>mCols ? mRows:mCols;
-       max = mSlices>max ? mSlices : max;
-
-       mInfCorrX = (float)max/mCols;
-       mInfCorrY = (float)max/mRows;
-       mInfCorrZ = (float)max/mSlices;
+       mInfCorr = mRows>mCols ? mRows:mCols;
+       mInfCorr = mSlices>mInfCorr ? mSlices : mInfCorr;
 
        mCubes    = new int[mRows][mCols];
        mInflateX = new byte[mRows+1][mCols+1];
@@ -234,12 +230,8 @@ public class MeshCubes extends MeshBase
        mInflateX = new byte[mRows+1][mCols+1];
        mInflateY = new byte[mRows+1][mCols+1];
 
-       int max = mRows>mCols ? mRows:mCols;
-       max = mSlices>max ? mSlices : max;
-
-       mInfCorrX = (float)max/mCols;
-       mInfCorrY = (float)max/mRows;
-       mInfCorrZ = (float)max/mSlices;
+       mInfCorr = mRows>mCols ? mRows:mCols;
+       mInfCorr = mSlices>mInfCorr ? mSlices : mInfCorr;
 
        for(int col=0; col<mCols; col++)
          for(int row=0; row<mRows; row++)
@@ -671,9 +663,9 @@ public class MeshCubes extends MeshBase
      attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+1] = mNormalY[index];
      attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+2] = mNormalZ[index];
 
-     attribs[VERT_ATTRIBS*currVert + INF_ATTRIB  ] = mInfCorrX*mInflateX[row][col]/2.0f;
-     attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInfCorrY*mInflateY[row][col]/2.0f;
-     attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = mInfCorrZ*vectZ;
+     attribs[VERT_ATTRIBS*currVert + INF_ATTRIB  ] = mInfCorr*mInflateX[row][col]/2.0f;
+     attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInfCorr*mInflateY[row][col]/2.0f;
+     attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = mInfCorr*vectZ;
 
      attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB  ] = x;
      attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 1.0f-y;
@@ -688,6 +680,7 @@ public class MeshCubes extends MeshBase
      //android.util.Log.e("CUBES", "adding Side vertex!");
      float x, y, z;
      int row, col;
+     float tmp1, tmp2;
 
      switch(curr.side)
        {
@@ -705,12 +698,31 @@ public class MeshCubes extends MeshBase
                    attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+1] = 1.0f;
                    attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );
 
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB  ] = mInfCorrX*mInflateX[row][col]/2.0f;
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInfCorrY*mInflateY[row][col]/2.0f;
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = mInfCorrZ*z;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB  ] = mInfCorr*mInflateX[row][col]/2.0f;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInfCorr*mInflateY[row][col]/2.0f;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = mInfCorr*z;
+
+                   /////////////////////////////////////////////////////////////////
+                   // clever stuff so that the sides of the mesh are textured nicely
+                   tmp1 = (float)(row-slice)/mRows;
+                   tmp2 = 1.0f-tmp1;
+
+                   if( tmp1 != (int)tmp1 )
+                     {
+                     tmp2 = tmp2 - (int)tmp2;
+                     if (tmp2 < 0.0f ) tmp2 += 1.0f;
+                     if ( ((int)tmp1)%2 == 1) tmp2 = 1.0f - tmp2;
+                     }
+                   else
+                     {
+                     tmp2 = ((int)tmp1)%2;
+                     if( tmp2 <0.0f ) tmp2 = -tmp2;
+                     }
+                   /////////////////////////////////////////////////////////////////
+                   // end clever stuff
 
                    attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB  ] = x;
-                   attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 1.0f-(float)(row-slice)/mRows;
+                   attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = tmp2;
                    break;
        case SOUTH: row = curr.row+1;
                    col = (back ? (curr.col+1):(curr.col));
@@ -726,12 +738,31 @@ public class MeshCubes extends MeshBase
                    attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+1] =-1.0f;
                    attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );
 
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB  ] = mInfCorrX*mInflateX[row][col]/2.0f;
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInfCorrY*mInflateY[row][col]/2.0f;
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = mInfCorrZ*z;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB  ] = mInfCorr*mInflateX[row][col]/2.0f;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInfCorr*mInflateY[row][col]/2.0f;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = mInfCorr*z;
+
+                   /////////////////////////////////////////////////////////////////
+                   // clever stuff so that the sides of the mesh are textured nicely
+                   tmp1 = (float)(row-slice)/mRows;
+                   tmp2 = 1.0f-tmp1;
+
+                   if( tmp1 != (int)tmp1 )
+                     {
+                     tmp2 = tmp2 - (int)tmp2;
+                     if (tmp2 < 0.0f ) tmp2 += 1.0f;
+                     if ( ((int)tmp1)%2 == 0 ) tmp2 = 1.0f - tmp2;
+                     }
+                   else
+                     {
+                     tmp2 = 1-((int)tmp1)%2;
+                     if( tmp2 <0.0f ) tmp2 = -tmp2;
+                     }
+                   /////////////////////////////////////////////////////////////////
+                   // end clever stuff
 
                    attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB  ] = x;
-                   attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 1.0f - (float)(row+slice)/mRows;
+                   attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = tmp2;
                    break;
        case WEST : row = (back  ? (curr.row+1):(curr.row));
                    col = curr.col;
@@ -747,9 +778,9 @@ public class MeshCubes extends MeshBase
                    attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+1] = side==WEST ? 0.0f : (side==NORTH?-R:R);
                    attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );
 
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB  ] = mInfCorrX*mInflateX[row][col]/2.0f;
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInfCorrY*mInflateY[row][col]/2.0f;
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = mInfCorrZ*z;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB  ] = mInfCorr*mInflateX[row][col]/2.0f;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInfCorr*mInflateY[row][col]/2.0f;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = mInfCorr*z;
 
                    attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB  ] = (float)(col-slice)/mCols;
                    attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 1.0f - y;
@@ -768,23 +799,39 @@ public class MeshCubes extends MeshBase
                    attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+1] = side==EAST ? 0.0f : (side==SOUTH?-R:R);
                    attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );
 
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB  ] = mInfCorrX*mInflateX[row][col]/2.0f;
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInfCorrY*mInflateY[row][col]/2.0f;
-                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = mInfCorrZ*z;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB  ] = mInfCorr*mInflateX[row][col]/2.0f;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInfCorr*mInflateY[row][col]/2.0f;
+                   attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = mInfCorr*z;
 
                    attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB  ] = (float)(col+slice)/mCols;
                    attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 1.0f - y;
                    break;
        }
-
+/*
      float tex0 =  attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB  ];
      float tex1 =  attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1];
 
-     if(tex0>1.0f) attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB  ] = 2.0f-tex0;
-     if(tex0<0.0f) attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB  ] =     -tex0;
-     if(tex1>1.0f) attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 2.0f-tex1;
-     if(tex1<0.0f) attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] =     -tex1;
+     if(tex0<0.0f) attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB  ] = tex0 - (int)tex0;
+     if(tex1<0.0f) attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = tex1 - (int)tex1;
+
+     if(tex0>1.0f) attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB  ] = tex0 - (int)tex0;
+     if(tex1>1.0f) attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = tex1 - (int)tex1;
 
+   //  tex0 =  attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB  ];
+   //  tex1 =  attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1];
+
+  float t = -1.4f;
+
+  float r = t - (int)t;
+  android.util.Log.e("mesh", "r="+r);
+
+
+     if( curr.side==NORTH )
+       {
+       android.util.Log.e("mesh", "tex0:" + tex0 + " slice=" + slice+" row="+row+" col="+col);
+       android.util.Log.e("mesh", "tex1:" + tex1 + " slice=" + slice+" row="+row+" col="+col);
+       }
+*/
      currVert++;
      }
 
diff --git a/src/main/java/org/distorted/library/mesh/MeshFlat.java b/src/main/java/org/distorted/library/mesh/MeshFlat.java
index 7df473e..c7d18c4 100644
--- a/src/main/java/org/distorted/library/mesh/MeshFlat.java
+++ b/src/main/java/org/distorted/library/mesh/MeshFlat.java
@@ -31,7 +31,7 @@ public class MeshFlat extends MeshBase
   private int mCols, mRows;
   private int remainingVert;
   private int numVertices;
-  private float mInfCorrX, mInfCorrY;
+  private float mInfCorr;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // Create a flat, full grid.
@@ -41,9 +41,7 @@ public class MeshFlat extends MeshBase
      mRows=rows;
      mCols=cols;
 
-     int max = mRows>mCols ? mRows:mCols;
-     mInfCorrX = (float)max/mCols;
-     mInfCorrY = (float)max/mRows;
+     mInfCorr = mRows>mCols ? mRows:mCols;
 
      if( cols==1 && rows==1 )
        {
@@ -74,13 +72,9 @@ public class MeshFlat extends MeshBase
      attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = 0.0f;
      attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = 1.0f;
 
-     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = (x-0.5f)*mInfCorrX;
-     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = (0.5f-y)*mInfCorrY;
-
-     // TODO: this better be non-zero, so that when the GLOW gets rendered it is slightly above
-     // the original MeshFlat surface, but simply setting this to non-zero here does not work,
-     // because MeshFlat's u_objD.z is 0 and this gets multipled by it in the main vertex shader.
-     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f;
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = (x-0.5f)*mInfCorr;
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = (0.5f-y)*mInfCorr;
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.01f   *mInfCorr;  // Inflated surface needs to be slightly in front
 
      attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB  ] = x;
      attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f-y;
diff --git a/src/main/res/raw/main_vertex_shader.glsl b/src/main/res/raw/main_vertex_shader.glsl
index 45b3277..3b7cbc1 100644
--- a/src/main/res/raw/main_vertex_shader.glsl
+++ b/src/main/res/raw/main_vertex_shader.glsl
@@ -145,7 +145,7 @@ float degree(in vec4 region, in vec2 S, in vec2 PS)
 
 void main()
   {
-  vec3 v = 2.0*u_objD*(a_Position + u_Inflate*a_Inflate);
+  vec3 v = 2.0*u_objD*a_Position + u_Inflate*a_Inflate;
   vec3 n = a_Normal;
 
 #if NUM_VERTEX>0
