commit c1e2464676f8ad3c7710946b78023d54b808d5ea
Author: leszek <leszek@koltunski.pl>
Date:   Wed Mar 1 23:02:38 2017 +0000

    Introduce Effects.blitPriv()   (faster than previous drawNoEffectsPriv)

diff --git a/src/main/java/org/distorted/library/DistortedEffects.java b/src/main/java/org/distorted/library/DistortedEffects.java
index 36c57a7..ac3adfe 100644
--- a/src/main/java/org/distorted/library/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/DistortedEffects.java
@@ -54,7 +54,9 @@ public class DistortedEffects
   private static final int NORMAL_DATA_SIZE  = 3; // Main Program: size of the normal data in elements
   private static final int TEX_DATA_SIZE     = 2; // Main Program: size of the texture coordinate data in elements.
 
-  private static DistortedProgram mProgram;
+  /// MAIN PROGRAM ///
+  private static DistortedProgram mMainProgram;
+  private static int mMainTextureH;
   private static boolean[] mEffectEnabled = new boolean[EffectNames.size()];
 
   static
@@ -67,8 +69,11 @@ public class DistortedEffects
       }
     }
 
-  /// DEBUG ONLY /////
-  private static DistortedProgram mDebugProgram;
+  /// BLIT PROGRAM ///
+  private static DistortedProgram mBlitProgram;
+  private static int mBlitTextureH;
+  private static int mBlitObjDH;
+  private static int mBlitMVPMatrixH;
   private static final FloatBuffer mQuadPositions;
 
   static
@@ -78,8 +83,11 @@ public class DistortedEffects
     mQuadPositions.put(positionData).position(0);
     }
 
-  private static int mObjDH;
-  private static int mMVPMatrixH;
+  /// DEBUG ONLY /////
+  private static DistortedProgram mDebugProgram;
+
+  private static int mDebugObjDH;
+  private static int mDebugMVPMatrixH;
   /// END DEBUG //////
 
   private static float[] mMVPMatrix = new float[16];
@@ -139,13 +147,27 @@ public class DistortedEffects
     //android.util.Log.e("Effects", "vertHeader= "+mainVertHeader);
     //android.util.Log.e("Effects", "fragHeader= "+mainFragHeader);
 
-    mProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader);
+    mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader);
 
-    int mainProgramH = mProgram.getProgramHandle();
+    int mainProgramH = mMainProgram.getProgramHandle();
     EffectQueueFragment.getUniforms(mainProgramH);
     EffectQueueVertex.getUniforms(mainProgramH);
     EffectQueueMatrix.getUniforms(mainProgramH);
-    DistortedTexture.getUniforms(mainProgramH);
+    mMainTextureH= GLES30.glGetUniformLocation( mainProgramH, "u_Texture");
+
+    // BLIT PROGRAM ////////////////////////////////////
+    final InputStream blitVertStream = resources.openRawResource(R.raw.blit_vertex_shader);
+    final InputStream blitFragStream = resources.openRawResource(R.raw.blit_fragment_shader);
+
+    String blitVertHeader= ("#version 100\n#define NUM_VERTEX 0\n"  );
+    String blitFragHeader= ("#version 100\n#define NUM_FRAGMENT 0\n");
+
+    mBlitProgram = new DistortedProgram(blitVertStream,blitFragStream,blitVertHeader,blitFragHeader);
+
+    int blitProgramH = mBlitProgram.getProgramHandle();
+    mBlitTextureH  = GLES30.glGetUniformLocation( blitProgramH, "u_Texture");
+    mBlitObjDH     = GLES30.glGetUniformLocation( blitProgramH, "u_objD");
+    mBlitMVPMatrixH= GLES30.glGetUniformLocation( blitProgramH, "u_MVPMatrix");
 
     // DEBUG ONLY //////////////////////////////////////
     final InputStream debugVertexStream   = resources.openRawResource(R.raw.test_vertex_shader);
@@ -154,8 +176,8 @@ public class DistortedEffects
     mDebugProgram = new DistortedProgram(debugVertexStream,debugFragmentStream, "#version 100\n", "#version 100\n");
 
     int debugProgramH = mDebugProgram.getProgramHandle();
-    mObjDH      = GLES30.glGetUniformLocation( debugProgramH, "u_objD");
-    mMVPMatrixH = GLES30.glGetUniformLocation( debugProgramH, "u_MVPMatrix");
+    mDebugObjDH = GLES30.glGetUniformLocation( debugProgramH, "u_objD");
+    mDebugMVPMatrixH = GLES30.glGetUniformLocation( debugProgramH, "u_MVPMatrix");
     // END DEBUG  //////////////////////////////////////
     }
 
@@ -254,8 +276,8 @@ public class DistortedEffects
     Matrix.translateM  ( mTmpMatrix, 0, halfX,-halfY, 0);
     Matrix.multiplyMM  ( mMVPMatrix, 0, surface.mProjectionMatrix, 0, mTmpMatrix, 0);
 
-    GLES30.glUniform2f( mObjDH , 2*halfX, 2*halfY);
-    GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
+    GLES30.glUniform2f(mDebugObjDH, 2*halfX, 2*halfY);
+    GLES30.glUniformMatrix4fv(mDebugMVPMatrixH, 1, false, mMVPMatrix , 0);
 
     GLES30.glVertexAttribPointer(mDebugProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
     GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
@@ -263,48 +285,50 @@ public class DistortedEffects
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void drawPriv(float halfInputW, float halfInputH, MeshObject mesh, DistortedOutputSurface surface, long currTime)
+  void drawPriv(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime)
     {
     mM.compute(currTime);
     mV.compute(currTime);
     mF.compute(currTime);
     mP.compute(currTime);
 
-    float halfZ = halfInputW*mesh.zFactor;
+    float halfZ = halfW*mesh.zFactor;
     GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight);
 
     if( mP.mNumEffects==0 )
       {
-      mProgram.useProgram();
+      mMainProgram.useProgram();
+      GLES30.glUniform1i(mMainTextureH, 0);
       surface.setAsOutput();
-      mM.send(surface,halfInputW,halfInputH,halfZ);
-      mV.send(halfInputW,halfInputH,halfZ);
-      mF.send(halfInputW,halfInputH);
-      GLES30.glVertexAttribPointer(mProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mesh.mMeshPositions);
-      GLES30.glVertexAttribPointer(mProgram.mAttribute[1], NORMAL_DATA_SIZE  , GLES30.GL_FLOAT, false, 0, mesh.mMeshNormals);
-      GLES30.glVertexAttribPointer(mProgram.mAttribute[2], TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, mesh.mMeshTexture);
+      mM.send(surface,halfW,halfH,halfZ);
+      mV.send(halfW,halfH,halfZ);
+      mF.send(halfW,halfH);
+      GLES30.glVertexAttribPointer(mMainProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mesh.mMeshPositions);
+      GLES30.glVertexAttribPointer(mMainProgram.mAttribute[1], NORMAL_DATA_SIZE  , GLES30.GL_FLOAT, false, 0, mesh.mMeshNormals);
+      GLES30.glVertexAttribPointer(mMainProgram.mAttribute[2], TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, mesh.mMeshTexture);
       GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.dataLength);
       }
     else
       {
       if( mV.mNumEffects==0 && mF.mNumEffects==0 && (mesh instanceof MeshFlat) && mM.canUseShortcut() )
         {
-        mM.constructMatrices(surface,halfInputW,halfInputH);
-        mP.render(2*halfInputW, 2*halfInputH, mM.getMVP(), surface);
+        mM.constructMatrices(surface,halfW,halfH);
+        mP.render(2*halfW, 2*halfH, mM.getMVP(), surface);
         }
       else
         {
-        mProgram.useProgram();
+        mMainProgram.useProgram();
+        GLES30.glUniform1i(mMainTextureH, 0);
         mBufferFBO.resizeFast(surface.mWidth, surface.mHeight);
         mBufferFBO.setAsOutput();
         GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
         GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
-        mM.send(mBufferFBO,halfInputW,halfInputH,halfZ);
-        mV.send(halfInputW,halfInputH,halfZ);
-        mF.send(halfInputW,halfInputH);
-        GLES30.glVertexAttribPointer(mProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mesh.mMeshPositions);
-        GLES30.glVertexAttribPointer(mProgram.mAttribute[1], NORMAL_DATA_SIZE  , GLES30.GL_FLOAT, false, 0, mesh.mMeshNormals);
-        GLES30.glVertexAttribPointer(mProgram.mAttribute[2], TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, mesh.mMeshTexture);
+        mM.send(mBufferFBO,halfW,halfH,halfZ);
+        mV.send(halfW,halfH,halfZ);
+        mF.send(halfW,halfH);
+        GLES30.glVertexAttribPointer(mMainProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mesh.mMeshPositions);
+        GLES30.glVertexAttribPointer(mMainProgram.mAttribute[1], NORMAL_DATA_SIZE  , GLES30.GL_FLOAT, false, 0, mesh.mMeshNormals);
+        GLES30.glVertexAttribPointer(mMainProgram.mAttribute[2], TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, mesh.mMeshTexture);
         GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.dataLength);
 
         Matrix.setIdentityM(mTmpMatrix, 0);
@@ -323,22 +347,21 @@ public class DistortedEffects
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-  static void drawNoEffectsPriv(float halfInputW, float halfInputH, MeshObject mesh, DistortedOutputSurface projection)
+  static void blitPriv(DistortedOutputSurface projection)
     {
     GLES30.glViewport(0, 0, projection.mWidth, projection.mHeight);
 
+    mBlitProgram.useProgram();
+
     Matrix.setIdentityM(mTmpMatrix, 0);
     Matrix.translateM(mTmpMatrix, 0, 0, 0, -projection.mDistance);
     Matrix.multiplyMM(mMVPMatrix, 0, projection.mProjectionMatrix, 0, mTmpMatrix, 0);
 
-    EffectQueueMatrix.sendZero(projection,halfInputW,halfInputH,halfInputW*mesh.zFactor);
-    EffectQueueVertex.sendZero();
-    EffectQueueFragment.sendZero();
-
-    GLES30.glVertexAttribPointer(mProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mesh.mMeshPositions);
-    GLES30.glVertexAttribPointer(mProgram.mAttribute[1], NORMAL_DATA_SIZE  , GLES30.GL_FLOAT, false, 0, mesh.mMeshNormals);
-    GLES30.glVertexAttribPointer(mProgram.mAttribute[2], TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, mesh.mMeshTexture);
-    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.dataLength);
+    GLES30.glUniform1i(mBlitTextureH, 0);
+    GLES30.glUniform2f( mBlitObjDH , projection.mWidth/2, projection.mHeight/2);
+    GLES30.glUniformMatrix4fv(mBlitMVPMatrixH, 1, false, mMVPMatrix, 0);
+    GLES30.glVertexAttribPointer(mBlitProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions);
+    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
     }
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/DistortedNode.java b/src/main/java/org/distorted/library/DistortedNode.java
index a49ebaf..0c7a3c3 100644
--- a/src/main/java/org/distorted/library/DistortedNode.java
+++ b/src/main/java/org/distorted/library/DistortedNode.java
@@ -200,8 +200,6 @@ public class DistortedNode implements DistortedAttacheable
   int drawRecursive(int renderNum, long currTime, DistortedOutputSurface surface)
     {
     int ret = 0;
-    float halfX = mSurface.getWidth()/2.0f;
-    float halfY = mSurface.getHeight()/2.0f;
 
     if( mNumChildren[0]>0 && mData.numRender!=renderNum )
       {
@@ -214,7 +212,7 @@ public class DistortedNode implements DistortedAttacheable
       if( mSurface.setAsInput() )
         {
         ret++;
-        DistortedEffects.drawNoEffectsPriv(halfX, halfY, mMesh, mData.mFBO);
+        DistortedEffects.blitPriv(mData.mFBO);
         }
 
       for(int i=0; i<mNumChildren[0]; i++)
@@ -229,7 +227,7 @@ public class DistortedNode implements DistortedAttacheable
       {
       ret++;
       mState.apply();
-      mEffects.drawPriv(halfX, halfY, mMesh, surface, currTime);
+      mEffects.drawPriv(mSurface.getWidth()/2, mSurface.getHeight()/2, mMesh, surface, currTime);
       }
 
     return ret;
diff --git a/src/main/java/org/distorted/library/DistortedTexture.java b/src/main/java/org/distorted/library/DistortedTexture.java
index e28c295..f05d2ed 100644
--- a/src/main/java/org/distorted/library/DistortedTexture.java
+++ b/src/main/java/org/distorted/library/DistortedTexture.java
@@ -101,16 +101,6 @@ public class DistortedTexture extends DistortedSurface implements DistortedInput
     if( mColorCreated!=DONT_CREATE ) mColorCreated = NOT_CREATED_YET;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  static void getUniforms(int mProgramH)
-    {
-    int textureH= GLES30.glGetUniformLocation( mProgramH, "u_Texture");
-
-    GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
-    GLES30.glUniform1i(textureH, 0);
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // create SYSTEM or TREE textures (those are just like normal Textures, just hold information
 // that they were autocreated only for the Library's internal purposes (SYSTEM) or for using
diff --git a/src/main/res/raw/blit_fragment_shader.glsl b/src/main/res/raw/blit_fragment_shader.glsl
new file mode 100644
index 0000000..aec3028
--- /dev/null
+++ b/src/main/res/raw/blit_fragment_shader.glsl
@@ -0,0 +1,30 @@
+//////////////////////////////////////////////////////////////////////////////////////////////
+// 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/>.                       //
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+precision lowp float;
+  
+uniform sampler2D u_Texture;  // The input texture.
+varying vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment.
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+void main()                    		
+  {  
+  gl_FragColor = texture2D(u_Texture,v_TexCoordinate);
+  }
\ No newline at end of file
diff --git a/src/main/res/raw/blit_vertex_shader.glsl b/src/main/res/raw/blit_vertex_shader.glsl
new file mode 100644
index 0000000..a232bb4
--- /dev/null
+++ b/src/main/res/raw/blit_vertex_shader.glsl
@@ -0,0 +1,34 @@
+//////////////////////////////////////////////////////////////////////////////////////////////
+// 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/>.                       //
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+precision lowp float;
+
+uniform vec2 u_objD;          // half of object width x half of object height
+uniform mat4 u_MVPMatrix;     // the combined model/view/projection matrix.
+attribute vec2 a_Position;    // Per-vertex position.
+varying vec2 v_TexCoordinate; //
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+void main()
+  {
+  v_TexCoordinate = a_Position + 0.5;
+  //gl_Position     = vec4(2.0*a_Position,0.0,1.0);
+  gl_Position     = u_MVPMatrix*vec4(2.0*u_objD*a_Position,0.0,1.0);
+  }                               
