commit 52358355f3c4556fd1f60b93b38868c9184ca320
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Thu Dec 15 17:01:33 2016 +0000

    Add API to render from a FBO to another FBO

diff --git a/src/main/java/org/distorted/library/DistortedEffects.java b/src/main/java/org/distorted/library/DistortedEffects.java
index c742dc8..fbdf8c9 100644
--- a/src/main/java/org/distorted/library/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/DistortedEffects.java
@@ -86,31 +86,31 @@ public class DistortedEffects
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-  void drawPriv(long currTime, DistortedTexture tex, GridObject grid, DistortedFramebuffer df)
+  void drawPriv(float halfInputW, float halfInputH, GridObject grid, DistortedFramebuffer df, long currTime)
     {
     GLES20.glViewport(0, 0, df.mWidth, df.mHeight);
 
-    float halfZ = tex.mHalfX*grid.zFactor;
+    float halfZ = halfInputW*grid.zFactor;
 
     mM.compute(currTime);
-    mM.send(df,tex.mHalfX,tex.mHalfY,halfZ);
+    mM.send(df,halfInputW,halfInputH,halfZ);
       
     mV.compute(currTime);
-    mV.send(tex.mHalfX,tex.mHalfY,halfZ);
+    mV.send(halfInputW,halfInputH,halfZ);
         
     mF.compute(currTime);
-    mF.send(tex.mHalfX,tex.mHalfY);
+    mF.send(halfInputW,halfInputH);
 
     grid.draw();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-  void drawNoEffectsPriv(DistortedTexture tex, GridObject grid, DistortedFramebuffer df)
+  void drawNoEffectsPriv(float halfInputW, float halfInputH, GridObject grid, DistortedFramebuffer df)
     {
     GLES20.glViewport(0, 0, df.mWidth, df.mHeight);
 
-    mM.sendZero(df,tex.mHalfX,tex.mHalfY,tex.mHalfX*grid.zFactor);
+    mM.sendZero(df,halfInputW,halfInputH,halfInputW*grid.zFactor);
     mV.sendZero();
     mF.sendZero();
 
diff --git a/src/main/java/org/distorted/library/DistortedFramebuffer.java b/src/main/java/org/distorted/library/DistortedFramebuffer.java
index fd251a2..df4850b 100644
--- a/src/main/java/org/distorted/library/DistortedFramebuffer.java
+++ b/src/main/java/org/distorted/library/DistortedFramebuffer.java
@@ -262,11 +262,37 @@ public class DistortedFramebuffer
     createFBO();
     GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboIds[0]);
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, tex.mTextureDataH[0]);
-    effects.drawPriv(time, tex, grid, this);
+    effects.drawPriv(tex.mHalfX, tex.mHalfY, grid, this, time);
     DistortedFramebuffer.deleteAllMarked();
     DistortedTexture.deleteAllMarked();
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Draw the (framebuffer,grid,effects) object to the Framebuffer.
+ * <p>
+ * Must be called from a thread holding OpenGL Context
+ *
+ * @param fbo The Framebuffer whose COLOR attachment 0 will be used as input texture.
+ * @param grid Class descendant from GridObject
+ * @param effects The DistortedEffects to use when rendering
+ * @param time Current time, in milliseconds.
+ */
+  public void renderTo(DistortedFramebuffer fbo, GridObject grid, DistortedEffects effects, long time)
+    {
+    fbo.createFBO();
+
+    if( fbo.texIds[0]>=0 )    // we cannot (yet?) render to FBO created with the second constructor.
+      {
+      createFBO();
+      GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboIds[0]);
+      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, fbo.texIds[0]);
+      effects.drawPriv(fbo.mWidth/2, fbo.mHeight/2, grid, this, time);
+      DistortedFramebuffer.deleteAllMarked();
+      DistortedTexture.deleteAllMarked();
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Draws the Tree, and all its children, to the Framebuffer.
diff --git a/src/main/java/org/distorted/library/DistortedTree.java b/src/main/java/org/distorted/library/DistortedTree.java
index 232cf31..9e0b15f 100644
--- a/src/main/java/org/distorted/library/DistortedTree.java
+++ b/src/main/java/org/distorted/library/DistortedTree.java
@@ -224,7 +224,7 @@ public class DistortedTree
         if( mTexture.mBitmapSet[0] )
           {
           GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexture.mTextureDataH[0]);
-          mEffects.drawNoEffectsPriv(mTexture, mGrid, mData.mDF);
+          mEffects.drawNoEffectsPriv(mTexture.mHalfX, mTexture.mHalfY, mGrid, mData.mDF);
           }
 
         synchronized(this)
@@ -243,7 +243,7 @@ public class DistortedTree
       GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mData.mDF.texIds[0]);
       }
 
-    mEffects.drawPriv(currTime, mTexture, mGrid, df);
+    mEffects.drawPriv(mTexture.mHalfX, mTexture.mHalfY, mGrid, df, currTime);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
