commit 55c14a19a9734a8d69c4122fd133d103ae2acb7b
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Wed Jan 11 16:14:21 2017 +0000

    Minor reorganization.

diff --git a/src/main/java/org/distorted/library/Distorted.java b/src/main/java/org/distorted/library/Distorted.java
index 05d87b6..27039e2 100644
--- a/src/main/java/org/distorted/library/Distorted.java
+++ b/src/main/java/org/distorted/library/Distorted.java
@@ -77,7 +77,7 @@ public class Distorted
    */
   public static final int CLONE_CHILDREN= 0x20;
 
-  static DistortedProgram mMainProgram, mPostProgram;
+  private static boolean mInitialized=false;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // private: hide this from Javadoc
@@ -91,7 +91,7 @@ public class Distorted
 
   static boolean isInitialized()
     {
-    return (mMainProgram!=null);
+    return mInitialized;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -132,8 +132,8 @@ public class Distorted
         mainFragmentHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
       }
 
-    mMainProgram = new DistortedProgram(mainVertexStream,mainFragmentStream, mainVertexHeader, mainFragmentHeader);
-    int mainProgramH = mMainProgram.getProgramHandle();
+    DistortedProgram mainProgram = new DistortedProgram(mainVertexStream,mainFragmentStream, mainVertexHeader, mainFragmentHeader);
+    int mainProgramH = mainProgram.getProgramHandle();
 
     GLES20.glDepthFunc(GLES20.GL_LEQUAL);
     GLES20.glEnable(GLES20.GL_BLEND);
@@ -158,11 +158,12 @@ public class Distorted
         postFragmentHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
       }
 
-    mPostProgram = new DistortedProgram(postVertexStream,postFragmentStream, "", postFragmentHeader);
-    int postProgramH = mPostProgram.getProgramHandle();
+    DistortedProgram postProgram = new DistortedProgram(postVertexStream,postFragmentStream, "", postFragmentHeader);
+    int postProgramH = postProgram.getProgramHandle();
 
     EffectQueuePostprocess.getUniforms(postProgramH);
 
+    DistortedEffects.setPrograms(mainProgram,postProgram);
     DistortedTree.reset();
     EffectMessageSender.startSending();
     }
@@ -181,7 +182,6 @@ public class Distorted
     DistortedEffects.onDestroy();
     EffectMessageSender.stopSending();
 
-    mMainProgram = null;
-    mPostProgram = null;
+    mInitialized = false;
     }
   }
diff --git a/src/main/java/org/distorted/library/DistortedEffects.java b/src/main/java/org/distorted/library/DistortedEffects.java
index ff168df..0f381f1 100644
--- a/src/main/java/org/distorted/library/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/DistortedEffects.java
@@ -22,6 +22,7 @@ package org.distorted.library;
 import android.opengl.GLES20;
 
 import org.distorted.library.message.EffectListener;
+import org.distorted.library.program.DistortedProgram;
 import org.distorted.library.type.Data1D;
 import org.distorted.library.type.Data2D;
 import org.distorted.library.type.Data3D;
@@ -42,9 +43,14 @@ import java.nio.FloatBuffer;
 public class DistortedEffects
   {
   private static final int BYTES_PER_FLOAT   = 4; //
-  private static final int POSITION_DATA_SIZE= 2; // Size of the position data in elements
-  private static final int TEX_DATA_SIZE     = 2; // Size of the texture coordinate data in elements.
+  private static final int MAIN_POSITION_DATA_SIZE= 3; // Size of the position data in elements
+  private static final int MAIN_NORMAL_DATA_SIZE  = 3; // Size of the position data in elements
+  private static final int MAIN_TEX_DATA_SIZE     = 2; // Size of the texture coordinate data in elements.
+  private static final int POST_POSITION_DATA_SIZE= 2; // Size of the position data in elements
+  private static final int POST_TEX_DATA_SIZE     = 2; // Size of the texture coordinate data in elements.
+
   private static final FloatBuffer mQuadPositions, mQuadTexture;
+  private static DistortedProgram mMainProgram, mPostProgram;
 
   private static long mNextID =0;
   private long mID;
@@ -65,16 +71,24 @@ public class DistortedEffects
     float[] positionData= { -0.5f, -0.5f,  -0.5f, 0.5f,  0.5f,-0.5f,  0.5f, 0.5f };
     float[] textureData = {  0.0f,  0.0f,   0.0f, 1.0f,  1.0f, 0.0f,  1.0f, 1.0f };
 
-    mQuadPositions = ByteBuffer.allocateDirect(POSITION_DATA_SIZE*dataLength*BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
+    mQuadPositions = ByteBuffer.allocateDirect(POST_POSITION_DATA_SIZE*dataLength*BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
     mQuadPositions.put(positionData).position(0);
-    mQuadTexture   = ByteBuffer.allocateDirect(TEX_DATA_SIZE     *dataLength*BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
+    mQuadTexture   = ByteBuffer.allocateDirect(POST_TEX_DATA_SIZE     *dataLength*BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
     mQuadTexture.put(textureData).position(0);
 
     mBufferFBO = new DistortedFramebuffer(1,1);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-    
+
+  static void setPrograms(DistortedProgram main, DistortedProgram post)
+    {
+    mMainProgram = main;
+    mPostProgram = post;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   private void initializeEffectLists(DistortedEffects d, int flags)
     {
     if( (flags & Distorted.CLONE_MATRIX) != 0 )
@@ -132,53 +146,49 @@ public class DistortedEffects
     mP.compute(currTime);
 
     float halfZ = halfInputW*mesh.zFactor;
+    GLES20.glViewport(0, 0, df.mWidth, df.mHeight);
 
     if( mP.mNumEffects==0 )
       {
-      Distorted.mMainProgram.useProgram();
-      GLES20.glViewport(0, 0, df.mWidth, df.mHeight);
-
+      mMainProgram.useProgram();
       mM.send(df,halfInputW,halfInputH,halfZ);
       mV.send(halfInputW,halfInputH,halfZ);
       mF.send(halfInputW,halfInputH);
-
-      mesh.draw();
+      GLES20.glVertexAttribPointer(mMainProgram.mAttribute[0], MAIN_POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mesh.mMeshPositions);
+      GLES20.glVertexAttribPointer(mMainProgram.mAttribute[1], MAIN_NORMAL_DATA_SIZE  , GLES20.GL_FLOAT, false, 0, mesh.mMeshNormals);
+      GLES20.glVertexAttribPointer(mMainProgram.mAttribute[2], MAIN_TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mesh.mMeshTexture);
+      GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, mesh.dataLength);
       }
     else
       {
       if( mV.mNumEffects>0 || mF.mNumEffects>0 )
         {
-        Distorted.mMainProgram.useProgram();
-        GLES20.glViewport(0, 0, df.mWidth, df.mHeight);
-
+        mMainProgram.useProgram();
         mBufferFBO.resizeFast(df.mWidth, df.mHeight);
         mBufferFBO.setAsOutput();
-
         mM.send(mBufferFBO,halfInputW,halfInputH,halfZ);
         mV.send(halfInputW,halfInputH,halfZ);
         mF.send(halfInputW,halfInputH);
+        GLES20.glVertexAttribPointer(mMainProgram.mAttribute[0], MAIN_POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mesh.mMeshPositions);
+        GLES20.glVertexAttribPointer(mMainProgram.mAttribute[1], MAIN_NORMAL_DATA_SIZE  , GLES20.GL_FLOAT, false, 0, mesh.mMeshNormals);
+        GLES20.glVertexAttribPointer(mMainProgram.mAttribute[2], MAIN_TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mesh.mMeshTexture);
+        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, mesh.dataLength);
 
-        mesh.draw();
-
-        Distorted.mPostProgram.useProgram();
+        mPostProgram.useProgram();
         mBufferFBO.setAsInput();
         df.setAsOutput();
         mP.send(df);
-
-        GLES20.glVertexAttribPointer(Distorted.mPostProgram.mAttribute[0], POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mQuadPositions);
-        GLES20.glVertexAttribPointer(Distorted.mPostProgram.mAttribute[1], TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mQuadTexture);
+        GLES20.glVertexAttribPointer(mPostProgram.mAttribute[0], POST_POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mQuadPositions);
+        GLES20.glVertexAttribPointer(mPostProgram.mAttribute[1], POST_TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mQuadTexture);
         GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
         }
       else
         {
-        Distorted.mPostProgram.useProgram();
-        GLES20.glViewport(0, 0, df.mWidth, df.mHeight);
-
+        mPostProgram.useProgram();
         mM.constructMatrices(df,halfInputW,halfInputH);
         mP.send(2*halfInputW,2*halfInputH, mM.getMVP() );
-
-        GLES20.glVertexAttribPointer(Distorted.mPostProgram.mAttribute[0], POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mQuadPositions);
-        GLES20.glVertexAttribPointer(Distorted.mPostProgram.mAttribute[1], TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mQuadTexture);
+        GLES20.glVertexAttribPointer(mPostProgram.mAttribute[0], POST_POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mQuadPositions);
+        GLES20.glVertexAttribPointer(mPostProgram.mAttribute[1], POST_TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mQuadTexture);
         GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
         }
       }
@@ -195,7 +205,10 @@ public class DistortedEffects
     EffectQueueFragment.sendZero();
     EffectQueuePostprocess.sendZero(df);
 
-    mesh.draw();
+    GLES20.glVertexAttribPointer(mMainProgram.mAttribute[0], MAIN_POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mesh.mMeshPositions);
+    GLES20.glVertexAttribPointer(mMainProgram.mAttribute[1], MAIN_NORMAL_DATA_SIZE  , GLES20.GL_FLOAT, false, 0, mesh.mMeshNormals);
+    GLES20.glVertexAttribPointer(mMainProgram.mAttribute[2], MAIN_TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mesh.mMeshTexture);
+    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, mesh.dataLength);
     }
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/MeshObject.java b/src/main/java/org/distorted/library/MeshObject.java
index 6883cfd..fa0423d 100644
--- a/src/main/java/org/distorted/library/MeshObject.java
+++ b/src/main/java/org/distorted/library/MeshObject.java
@@ -21,8 +21,6 @@ package org.distorted.library;
 
 import java.nio.FloatBuffer;
 
-import android.opengl.GLES20;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Abstract class which represents a Mesh, ie 3 arrays of Vertex attributes: 1) positions
@@ -33,13 +31,13 @@ import android.opengl.GLES20;
  */
 public abstract class MeshObject
    {
-   protected static final int BYTES_PER_FLOAT   = 4; //
-   protected static final int POSITION_DATA_SIZE= 3; // Size of the position data in elements
-   protected static final int NORMAL_DATA_SIZE  = 3; // Size of the normal data in elements.
-   protected static final int TEX_DATA_SIZE     = 2; // Size of the texture coordinate data in elements. 
+   static final int BYTES_PER_FLOAT   = 4; //
+   static final int POSITION_DATA_SIZE= 3; // Size of the position data in elements
+   static final int NORMAL_DATA_SIZE  = 3; // Size of the normal data in elements.
+   static final int TEX_DATA_SIZE     = 2; // Size of the texture coordinate data in elements.
 
-   protected int dataLength;
-   protected FloatBuffer mMeshPositions, mMeshNormals, mMeshTexture;
+   int dataLength;
+   FloatBuffer mMeshPositions, mMeshNormals, mMeshTexture;
 
    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().
@@ -50,17 +48,4 @@ public abstract class MeshObject
      {
      zFactor = factor;
      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-   void draw()
-     { 
-     GLES20.glVertexAttribPointer(Distorted.mMainProgram.mAttribute[0], POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mMeshPositions);
-     GLES20.glVertexAttribPointer(Distorted.mMainProgram.mAttribute[1], NORMAL_DATA_SIZE  , GLES20.GL_FLOAT, false, 0, mMeshNormals);
-     GLES20.glVertexAttribPointer(Distorted.mMainProgram.mAttribute[2], TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mMeshTexture);
-
-     GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, dataLength); 
-     }
    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
