commit 7cf783cbf90dedecccc86e2f294ca109051eb7bd
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Thu Dec 15 00:58:19 2016 +0000

    Attempt to bring DTexture and DFramebuffer closer together.

diff --git a/src/main/java/org/distorted/library/DistortedEffectQueues.java b/src/main/java/org/distorted/library/DistortedEffectQueues.java
index 373c395..8e20912 100644
--- a/src/main/java/org/distorted/library/DistortedEffectQueues.java
+++ b/src/main/java/org/distorted/library/DistortedEffectQueues.java
@@ -199,7 +199,8 @@ public class DistortedEffectQueues
   public void draw(long currTime, DistortedTexture tex, GridObject grid, DistortedFramebuffer df)
     {
     tex.createTexture();
-    df.setAsOutput();
+    df.createFBO();
+    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, df.fboIds[0]);
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, tex.mTextureDataH[0]);
     drawPriv(currTime, tex, grid, df);
     DistortedFramebuffer.deleteAllMarked();
diff --git a/src/main/java/org/distorted/library/DistortedFramebuffer.java b/src/main/java/org/distorted/library/DistortedFramebuffer.java
index 9b3d9dc..60ccee8 100644
--- a/src/main/java/org/distorted/library/DistortedFramebuffer.java
+++ b/src/main/java/org/distorted/library/DistortedFramebuffer.java
@@ -50,8 +50,8 @@ public class DistortedFramebuffer
 
   private float mX, mY, mFOV;
 
-  private int[] texIds = new int[1];
-  private int[] fboIds = new int[1];
+  int[] texIds = new int[1];
+  int[] fboIds = new int[1];
 
   private boolean mMarked;
 
@@ -62,34 +62,37 @@ public class DistortedFramebuffer
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // Must be called from a thread holding OpenGL Context
 
-  private boolean createFBO()
+  boolean createFBO()
     {
-    GLES20.glGenTextures(1, texIds, 0);
-    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texIds[0]);
-    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
-    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
-    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
-    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);
-    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, mWidth, mHeight, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
+    if( texIds[0]==TEXTURE_NOT_CREATED_YET )
+      {
+      GLES20.glGenTextures(1, texIds, 0);
+      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texIds[0]);
+      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
+      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
+      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
+      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);
+      GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, mWidth, mHeight, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
 
-    GLES20.glGenFramebuffers(1, fboIds, 0);
-    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboIds[0]);
-    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, texIds[0], 0);
+      GLES20.glGenFramebuffers(1, fboIds, 0);
+      GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboIds[0]);
+      GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, texIds[0], 0);
 
-    int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
+      int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
 
-    if(status != GLES20.GL_FRAMEBUFFER_COMPLETE)
-      {
-      android.util.Log.e("DistortedFramebuffer", "failed to create framebuffer, error="+status);
-      GLES20.glDeleteTextures(1, texIds, 0);
-      GLES20.glDeleteFramebuffers(1, fboIds, 0);
-      fboIds[0] = 0;
-      texIds[0] = TEXTURE_FAILED_TO_CREATE;
-      return false;
-      }
+      if(status != GLES20.GL_FRAMEBUFFER_COMPLETE)
+        {
+        android.util.Log.e("DistortedFramebuffer", "failed to create framebuffer, error="+status);
+        GLES20.glDeleteTextures(1, texIds, 0);
+        GLES20.glDeleteFramebuffers(1, fboIds, 0);
+        fboIds[0] = 0;
+        texIds[0] = TEXTURE_FAILED_TO_CREATE;
+        return false;
+        }
 
-    mList.add(this);
-    //android.util.Log.e("FBO", "created ("+mWidth+","+mHeight+") "+fboIds[0]);
+      mList.add(this);
+      //android.util.Log.e("FBO", "created ("+mWidth+","+mHeight+") "+fboIds[0]);
+      }
 
     return true;
     }
@@ -113,26 +116,6 @@ public class DistortedFramebuffer
     mMarked = false;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Must be called from a thread holding OpenGL Context
-
-  void setAsOutput()
-    {
-    if( texIds[0]==TEXTURE_NOT_CREATED_YET ) createFBO();
-
-    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboIds[0]);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Must be called from a thread holding OpenGL Context
-
-  void setAsInput()
-    {
-    if( texIds[0]==TEXTURE_NOT_CREATED_YET ) createFBO();
-
-    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texIds[0]);
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   void reset()
@@ -180,6 +163,13 @@ public class DistortedFramebuffer
 
   static synchronized void onDestroy()
     {
+    // There are issues with this. Namely, if one
+    // 1. creates a DObjectTree (somewhere else than onSurfaceCreated of constructor so it does not get re-created on re-launch)
+    // 2. minimizes the app (here mList would be cleared)
+    // 3. re-launches the app
+    // 4. deletes some nodes
+    // then the underlying Framebuffers will never be deleted!
+
     mListMarked = false;
     mList.clear();
     }
diff --git a/src/main/java/org/distorted/library/DistortedObjectTree.java b/src/main/java/org/distorted/library/DistortedObjectTree.java
index b74ac4b..f2da08d 100644
--- a/src/main/java/org/distorted/library/DistortedObjectTree.java
+++ b/src/main/java/org/distorted/library/DistortedObjectTree.java
@@ -81,9 +81,11 @@ public class DistortedObjectTree
       }
     else
       {
+      mData.mDF.createFBO();
+
       if( mData.numRendered==0 )
         {
-        mData.mDF.setAsOutput();
+        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mData.mDF.fboIds[0]);
 
         GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
         GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
@@ -106,8 +108,8 @@ public class DistortedObjectTree
       mData.numRendered++;
       mData.numRendered %= mData.numPointingNodes;
 
-      df.setAsOutput();
-      mData.mDF.setAsInput();
+      GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, df.fboIds[0]);
+      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mData.mDF.texIds[0]);
       }
     
     mQueues.drawPriv(currTime, mTexture, mGrid, df);
@@ -475,7 +477,8 @@ public class DistortedObjectTree
  */
   public void draw(long currTime, DistortedFramebuffer df)
     {
-    df.setAsOutput();
+    df.createFBO();
+    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, df.fboIds[0]);
     drawRecursive(currTime,df);
     DistortedFramebuffer.deleteAllMarked();
     DistortedTexture.deleteAllMarked();
