commit 7a5e538a074ddeb9422eaa533c6faeccfb3c368a
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Nov 30 14:28:49 2018 +0000

    Progress with Inflate (building block of postprocessing effects: the proper way of marking a halo around a Mesh)
    'Inflate' app testing the machanism. MeshFlat appears to be working, now we only need to fill up the per-vertex Inflate vector in the MeshCubes.

diff --git a/src/main/java/org/distorted/library/main/DistortedEffects.java b/src/main/java/org/distorted/library/main/DistortedEffects.java
index a02d5fe..8a6e0e1 100644
--- a/src/main/java/org/distorted/library/main/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/main/DistortedEffects.java
@@ -445,10 +445,10 @@ public class DistortedEffects
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void send(float halfW, float halfH, float halfZ, float margin, DistortedOutputSurface surface, int variant)
+  void send(float halfW, float halfH, float halfZ, float inflate, DistortedOutputSurface surface, int variant)
     {
-    mM.send(surface,halfW,halfH,halfZ,margin,variant);
-    mV.send(variant);
+    mM.send(surface,halfW,halfH,halfZ,variant);
+    mV.send(inflate,variant);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -471,8 +471,10 @@ public class DistortedEffects
 
     mesh.bindVertexAttribs(mMainOITProgram);
 
-    mM.send(surface,halfW,halfH,halfZ,0,1);
-    mV.send(1);
+    float inflate = mesh.getInflate();
+
+    mM.send(surface,halfW,halfH,halfZ,1);
+    mV.send(inflate,1);
     mF.send(1);
 
     GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() );
@@ -480,8 +482,8 @@ public class DistortedEffects
     if( mesh.getShowNormals() )
       {
       mMainProgram.useProgram();
-      mM.send(surface,halfW,halfH,halfZ,0,0);
-      mV.send(0);
+      mM.send(surface,halfW,halfH,halfZ,0);
+      mV.send(inflate,0);
       mF.send(0);
       displayNormals(mesh);
       }
@@ -505,8 +507,8 @@ public class DistortedEffects
 
     mesh.bindVertexAttribs(mMainProgram);
 
-    mM.send(surface,halfW,halfH,halfZ,0,0);
-    mV.send(0);
+    mM.send(surface,halfW,halfH,halfZ,0);
+    mV.send( mesh.getInflate(),0);
     mF.send(0);
 
     GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() );
diff --git a/src/main/java/org/distorted/library/main/DistortedNode.java b/src/main/java/org/distorted/library/main/DistortedNode.java
index 0d00090..9987941 100644
--- a/src/main/java/org/distorted/library/main/DistortedNode.java
+++ b/src/main/java/org/distorted/library/main/DistortedNode.java
@@ -357,12 +357,8 @@ public class DistortedNode implements DistortedMaster.Slave
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Not part of the Public API.
- *
- * @y.exclude
- */
-  public EffectQueuePostprocess getPostprocessQueue()
+
+  EffectQueuePostprocess getPostprocessQueue()
     {
     return mEffects.getPostprocess();
     }
diff --git a/src/main/java/org/distorted/library/main/EffectQueueMatrix.java b/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
index 7b2e4ed..3a27e56 100644
--- a/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
+++ b/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
@@ -36,13 +36,6 @@ class EffectQueueMatrix extends EffectQueue
 
   private static float[] mMVPMatrix = new float[16];
   private static float[] mViewMatrix= new float[16];
-  private static float[] mTmpMatrix = new float[16];
-  private static float[] mTmpResult = new float[4];
-  private static float[] mTmpPoint  = new float[4];
-  private static float mMinx;
-  private static float mMaxx;
-  private static float mMiny;
-  private static float mMaxy;
 
   private static int[] mObjDH      = new int[Distorted.MAIN_VARIANTS];
   private static int[] mMVPMatrixH = new int[Distorted.MAIN_VARIANTS];
@@ -55,51 +48,6 @@ class EffectQueueMatrix extends EffectQueue
     super(id,NUM_UNIFORMS,INDEX );
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void magnifyDir()
-    {
-    Matrix.multiplyMV(mTmpResult,0,mTmpMatrix,0,mTmpPoint,0);
-    float nx = mTmpResult[0]/mTmpResult[3];
-    float ny = mTmpResult[1]/mTmpResult[3];
-
-    if( nx<mMinx ) mMinx = nx;
-    if( nx>mMaxx ) mMaxx = nx;
-    if( ny<mMiny ) mMiny = ny;
-    if( ny>mMaxy ) mMaxy = ny;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// modify the ModelView matrix so that the object drawn appears to be (about) 'marginInPixels' pixels
-// larger in each direction when rendered. Used in Postprocessing.
-
-  private void magnify(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels)
-    {
-    mMinx = Integer.MAX_VALUE;
-    mMaxx = Integer.MIN_VALUE;
-    mMiny = Integer.MAX_VALUE;
-    mMaxy = Integer.MIN_VALUE;
-
-    mTmpPoint[3] = 1.0f;
-
-    Matrix.multiplyMM(mTmpMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0);
-
-    mTmpPoint[0] = +halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = +halfZ; magnifyDir();
-    mTmpPoint[0] = +halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = -halfZ; magnifyDir();
-    mTmpPoint[0] = +halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = +halfZ; magnifyDir();
-    mTmpPoint[0] = +halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = -halfZ; magnifyDir();
-    mTmpPoint[0] = -halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = +halfZ; magnifyDir();
-    mTmpPoint[0] = -halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = -halfZ; magnifyDir();
-    mTmpPoint[0] = -halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = +halfZ; magnifyDir();
-    mTmpPoint[0] = -halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = -halfZ; magnifyDir();
-
-    float xlen = projection.mWidth *(mMaxx-mMinx)/2;
-    float ylen = projection.mHeight*(mMaxy-mMiny)/2;
-    float scale = 1.0f + 2*marginInPixels/( xlen>ylen ? ylen:xlen );
-
-    Matrix.scaleM(mViewMatrix, 0, scale, scale, scale);
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   static void getUniforms(int mProgramH, int variant)
@@ -146,7 +94,7 @@ class EffectQueueMatrix extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void send(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels, int variant)
+  void send(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, int variant)
     {
     Matrix.setIdentityM(mViewMatrix, 0);
     Matrix.translateM(mViewMatrix, 0, -projection.mWidth/2, projection.mHeight/2, -projection.mDistance);
@@ -156,7 +104,6 @@ class EffectQueueMatrix extends EffectQueue
     for(int i=0; i<mNumEffects; i++) ((MatrixEffect)mEffects[i]).apply(mViewMatrix,mUniforms,i);
 
     Matrix.translateM(mViewMatrix, 0, halfX,-halfY,-halfZ);
-    if( marginInPixels!=0 ) magnify(projection,halfX,halfY,halfZ, marginInPixels);
     Matrix.multiplyMM(mMVPMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0);
 
     GLES31.glUniform3f( mObjDH[variant] , halfX, halfY, halfZ);
diff --git a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
index 28406e4..d9258ed 100644
--- a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
@@ -159,7 +159,6 @@ class EffectQueuePostprocess extends EffectQueue
     if( input.setAsInput() )
       {
       MeshBase mesh = node.getMesh();
-      float    margin = mHalo*buffer.mMipmap;
 
       float halfW = input.getWidth() / 2.0f;
       float halfH = input.getHeight()/ 2.0f;
@@ -173,7 +172,7 @@ class EffectQueuePostprocess extends EffectQueue
 
       mesh.bindVertexAttribs(mPreProgram);
 
-      node.getEffects().send(halfW, halfH, halfZ, margin, buffer, 2);
+      node.getEffects().send(halfW, halfH, halfZ, mHalo, buffer, 2);
 
       if( mA!=0.0f )
         {
diff --git a/src/main/java/org/distorted/library/main/EffectQueueVertex.java b/src/main/java/org/distorted/library/main/EffectQueueVertex.java
index 017aea3..a5cda6d 100644
--- a/src/main/java/org/distorted/library/main/EffectQueueVertex.java
+++ b/src/main/java/org/distorted/library/main/EffectQueueVertex.java
@@ -36,6 +36,7 @@ class EffectQueueVertex extends EffectQueue
   private static int[] mNumEffectsH = new int[Distorted.MAIN_VARIANTS];
   private static int[] mNameH       = new int[Distorted.MAIN_VARIANTS];
   private static int[] mUniformsH   = new int[Distorted.MAIN_VARIANTS];
+  private static int[] mInflateH    = new int[Distorted.MAIN_VARIANTS];
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
@@ -51,6 +52,7 @@ class EffectQueueVertex extends EffectQueue
     mNumEffectsH[variant]= GLES31.glGetUniformLocation( mProgramH, "vNumEffects");
     mNameH[variant]      = GLES31.glGetUniformLocation( mProgramH, "vName");
     mUniformsH[variant]  = GLES31.glGetUniformLocation( mProgramH, "vUniforms");
+    mInflateH[variant]   = GLES31.glGetUniformLocation( mProgramH, "u_Inflate");
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -88,10 +90,11 @@ class EffectQueueVertex extends EffectQueue
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void send(int variant)
+  void send(float inflate, int variant)
     {
     GLES31.glUniform1i( mNumEffectsH[variant], mNumEffects);
-      
+    GLES31.glUniform1f( mInflateH[variant]   , inflate    );
+
     if( mNumEffects>0 )
       {
       GLES31.glUniform1iv( mNameH[variant]    ,                 mNumEffects, mName    ,0);
diff --git a/src/main/java/org/distorted/library/mesh/MeshBase.java b/src/main/java/org/distorted/library/mesh/MeshBase.java
index 48ee521..3af6b9b 100644
--- a/src/main/java/org/distorted/library/mesh/MeshBase.java
+++ b/src/main/java/org/distorted/library/mesh/MeshBase.java
@@ -34,7 +34,7 @@ import java.nio.FloatBuffer;
  * Abstract class which represents a Mesh, i.e. an array of vertices (rendered as a TRIANGLE_STRIP)
  * <p>
  * If you want to render to a particular shape, extend from here, construct a float array
- * containing per-vertex attributes, and call back setData().
+ * containing per-vertex attributes, and call back setAttribs().
  */
 public abstract class MeshBase
    {
@@ -42,7 +42,7 @@ public abstract class MeshBase
    private static final int POS_DATA_SIZE= 3; // vertex coordinates: x,y,z
    private static final int NOR_DATA_SIZE= 3; // normal vector: x,y,z
    private static final int INF_DATA_SIZE= 3; // 'inflate' vector: x,y,z
-   private static final int TEX_DATA_SIZE= 2; // texture coordinates
+   private static final int TEX_DATA_SIZE= 2; // texture coordinates: s,t
 
    static final int POS_ATTRIB   = 0;
    static final int NOR_ATTRIB   = POS_DATA_SIZE;
@@ -66,6 +66,7 @@ public abstract class MeshBase
                                        // of the Mesh. Used in DistortedEffects. See DistortedTexture.getDepth().
    private int mNumVertices;
    private FloatBuffer mVertAttribs;   // packed: PosX,PosY,PosZ, NorX,NorY,NorZ, InfX,InfY,InfZ, TexS,TexT
+   private float mInflate;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -154,6 +155,28 @@ public abstract class MeshBase
      GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
      }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Not part of public API, do not document (public only because has to be used from the main package)
+ *
+ * @y.exclude
+ */
+   public void setInflate(float inflate)
+     {
+     mInflate = inflate;
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Not part of public API, do not document (public only because has to be used from the main package)
+ *
+ * @y.exclude
+ */
+   public float getInflate()
+     {
+     return mInflate;
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/mesh/MeshFlat.java b/src/main/java/org/distorted/library/mesh/MeshFlat.java
index 89dc122..44f0fbd 100644
--- a/src/main/java/org/distorted/library/mesh/MeshFlat.java
+++ b/src/main/java/org/distorted/library/mesh/MeshFlat.java
@@ -64,15 +64,15 @@ public class MeshFlat extends MeshBase
 
      attribs[VERT_ATTRIBS*vertex + POS_ATTRIB  ] = x-0.5f;
      attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f-y;
-     attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0;
+     attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0.0f;
 
      attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB  ] = 0.0f;
      attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = 0.0f;
      attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = 1.0f;
 
-     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = 1.0f;  //
-     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f;  // TODO
-     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f;  //
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB  ] = x-0.5f;
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.5f-y;
+     attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f;
 
      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 a88a1fb..45b3277 100644
--- a/src/main/res/raw/main_vertex_shader.glsl
+++ b/src/main/res/raw/main_vertex_shader.glsl
@@ -36,6 +36,7 @@ uniform vec3 u_objD;                 // half of object width x half of object he
 
 uniform mat4 u_MVPMatrix;            // the combined model/view/projection matrix.
 uniform mat4 u_MVMatrix;             // the combined model/view matrix.
+uniform float u_Inflate;             // how much should we inflate (>0.0) or deflate (<0.0) the mesh.
 
 #if NUM_VERTEX>0
 uniform int vNumEffects;             // total number of vertex effects
@@ -144,7 +145,7 @@ float degree(in vec4 region, in vec2 S, in vec2 PS)
 
 void main()
   {
-  vec3 v = 2.0*u_objD*a_Position;
+  vec3 v = 2.0*u_objD*(a_Position + u_Inflate*a_Inflate);
   vec3 n = a_Normal;
 
 #if NUM_VERTEX>0
