commit 5f2a53b65e2d4aa90a0ea5029f4b35d1ce4a82e6
Author: leszek <leszek@koltunski.pl>
Date:   Thu May 4 01:13:23 2017 +0100

    Progress with VBOs - this time abstract out a new class, DistortedObject - i.e. everything that uploads something to GPU and thus needs to be auto re-created upon loss of the context.

diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
index 311446a..7e900d3 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
@@ -21,7 +21,6 @@ package org.distorted.examples.aroundtheworld;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
@@ -48,6 +47,7 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
    private DistortedEffects mEffects;
    private DistortedTexture mTexture;
    private DistortedScreen mScreen;
+   private MeshFlat mMesh;
    private AroundTheWorldEffectsManager mManager;
    private int mObjWidth, mObjHeight;
 
@@ -130,8 +130,10 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
       if( mTexture==null ) mTexture = new DistortedTexture(mObjWidth,mObjHeight);
       mTexture.setTexture(bitmap);
 
+      if( mMesh==null ) mMesh = new MeshFlat(30,30*mObjHeight/mObjWidth);
+
       mScreen.detachAll();
-      mScreen.attach(mTexture, mEffects, new MeshFlat(30,30*mObjHeight/mObjWidth));
+      mScreen.attach(mTexture, mEffects, mMesh);
 
       DistortedEffects.enableEffect(EffectNames.DISTORT);
       DistortedEffects.enableEffect(EffectNames.SINK);
diff --git a/src/main/java/org/distorted/examples/bean/BeanRenderer.java b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
index 3e3ab34..93b9bd4 100644
--- a/src/main/java/org/distorted/examples/bean/BeanRenderer.java
+++ b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
@@ -50,6 +50,7 @@ class BeanRenderer implements GLSurfaceView.Renderer
    private DistortedEffects mEffects;
    private DistortedScreen mScreen;
    private DistortedTexture mTexture;
+   private MeshFlat mMesh;
    private int bmpHeight, bmpWidth;
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -149,9 +150,9 @@ class BeanRenderer implements GLSurfaceView.Renderer
       
       if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
       mTexture.setTexture(bitmap);
-
+      if( mMesh==null ) mMesh = new MeshFlat(25,25*bmpHeight/bmpWidth);
       mScreen.detachAll();
-      mScreen.attach(mTexture,mEffects,new MeshFlat(25,25*bmpHeight/bmpWidth));
+      mScreen.attach(mTexture,mEffects,mMesh);
 
       DistortedEffects.enableEffect(EffectNames.DISTORT);
 
diff --git a/src/main/java/org/distorted/examples/check/CheckRenderer.java b/src/main/java/org/distorted/examples/check/CheckRenderer.java
index 5152a28..5f97b8d 100644
--- a/src/main/java/org/distorted/examples/check/CheckRenderer.java
+++ b/src/main/java/org/distorted/examples/check/CheckRenderer.java
@@ -59,6 +59,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
     private GLSurfaceView mView;
     private DistortedEffects mEffects;
     private DistortedTexture mTexture;
+    private MeshFlat mMesh;
     private DistortedScreen mScreen;
     private int bmpHeight, bmpWidth;
 
@@ -136,8 +137,10 @@ class CheckRenderer implements GLSurfaceView.Renderer
       if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
       mTexture.setTexture(bitmap);
 
+      if( mMesh==null ) mMesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
+
       mScreen.detachAll();
-      mScreen.attach(mTexture,mEffects,new MeshFlat(30,30*bmpHeight/bmpWidth));
+      mScreen.attach(mTexture,mEffects,mMesh);
 
       mEffects.abortEffects(EffectTypes.VERTEX);
       mEffects.abortEffects(EffectTypes.FRAGMENT);
diff --git a/src/main/java/org/distorted/examples/deform/DeformRenderer.java b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
index 26f91bb..67dc677 100644
--- a/src/main/java/org/distorted/examples/deform/DeformRenderer.java
+++ b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
@@ -211,6 +211,8 @@ class DeformRenderer implements GLSurfaceView.Renderer
      int w=width/2;
      int h=height/2;
 
+     if( stretchMesh!=null ) stretchMesh.markForDeletion();
+
      stretchMesh = new MeshFlat(50,50*h/w);
      Bitmap stretchBitmap = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
      stretchCanvas = new Canvas(stretchBitmap);
diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
index 14158bc..cb9f8eb 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
@@ -52,6 +52,7 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
    private GLSurfaceView mView;
    private DistortedEffects[] mEffects;
    private DistortedTexture[] mTexture;
+   private MeshFlat mMesh;
    private DistortedScreen mScreen;
    private int bmpHeight, bmpWidth;
     
@@ -169,10 +170,10 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
       mTexture[1].setTexture(bitmap1);
       mTexture[2].setTexture(bitmap2);
 
-      MeshFlat mesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
+      if( mMesh==null ) mMesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
 
       mScreen.detachAll();
-      for(int i=NUM-1; i>=0; i--) mScreen.attach(mTexture[i], mEffects[i], mesh);
+      for(int i=NUM-1; i>=0; i--) mScreen.attach(mTexture[i], mEffects[i], mMesh);
 
       DistortedEffects.enableEffect(EffectNames.SINK);
       DistortedEffects.enableEffect(EffectNames.DISTORT);
diff --git a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
index 4a074aa..8b5cb33 100644
--- a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
@@ -53,6 +53,7 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
    private GLSurfaceView mView;
    private DistortedEffects[] mEffects;
    private DistortedTexture mTexture;
+   private MeshFlat mMesh;
    private DistortedScreen mScreen;
    private int bmpHeight, bmpWidth;
     
@@ -162,12 +163,12 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
      bmpHeight = bitmap.getHeight();
      bmpWidth  = bitmap.getWidth();
 
-     MeshFlat mesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
+     if( mMesh==null ) mMesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
      if( mTexture==null ) mTexture  = new DistortedTexture(bmpWidth,bmpHeight);
      mTexture.setTexture(bitmap);
 
      mScreen.detachAll();
-     for(int i=NUM-1; i>=0; i--) mScreen.attach(mTexture, mEffects[i], mesh);
+     for(int i=NUM-1; i>=0; i--) mScreen.attach(mTexture, mEffects[i], mMesh);
 
      DistortedEffects.enableEffect(EffectNames.SINK);
      DistortedEffects.enableEffect(EffectNames.DISTORT);
diff --git a/src/main/java/org/distorted/examples/fbo/FBORenderer.java b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
index c255df2..db6255f 100644
--- a/src/main/java/org/distorted/examples/fbo/FBORenderer.java
+++ b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
@@ -56,6 +56,8 @@ class FBORenderer implements GLSurfaceView.Renderer
    private DistortedTexture mLisaTexture, mGridTexture;
    private DistortedScreen mScreen;
    private DistortedNode mRoot;
+   private MeshFlat mMeshFlat;
+   private MeshCubes mMeshCubes;
    private int lisaHeight, lisaWidth;
    private boolean mDepth;
 
@@ -166,8 +168,11 @@ class FBORenderer implements GLSurfaceView.Renderer
 
       mEffects.abortAllEffects();
 
-      mRoot = new DistortedNode(mLisaTexture, mEffects,new MeshFlat(1,1));
-      mRoot.attach(mGridTexture,gridEffects,new MeshCubes(10,10,false));
+      if( mMeshFlat==null ) mMeshFlat = new MeshFlat(1,1);
+      if( mMeshCubes==null) mMeshCubes= new MeshCubes(10,10,false);
+
+      mRoot = new DistortedNode(mLisaTexture, mEffects, mMeshFlat);
+      mRoot.attach(mGridTexture,gridEffects,mMeshCubes);
 
       setDepthPriv();
 
diff --git a/src/main/java/org/distorted/examples/girl/GirlRenderer.java b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
index bc9f8dc..cc0fe8b 100644
--- a/src/main/java/org/distorted/examples/girl/GirlRenderer.java
+++ b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
@@ -52,6 +52,7 @@ class GirlRenderer implements GLSurfaceView.Renderer
     private DistortedEffects mEffects;
     private DistortedScreen mScreen;
     private DistortedTexture mTexture;
+    private MeshFlat mMesh;
     private Static3D v0,v1,v2,v3;
     private Static1D dBegin, dMiddle, dEnd, s0;
     private int bmpHeight, bmpWidth;
@@ -207,8 +208,10 @@ class GirlRenderer implements GLSurfaceView.Renderer
       if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
       mTexture.setTexture(bitmap);
 
+      if( mMesh==null ) mMesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
+
       mScreen.detachAll();
-      mScreen.attach(mTexture,mEffects,new MeshFlat(30,30*bmpHeight/bmpWidth));
+      mScreen.attach(mTexture,mEffects,mMesh);
 
       DistortedEffects.enableEffect(EffectNames.DISTORT);
       DistortedEffects.enableEffect(EffectNames.SINK);
diff --git a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
index 0e39620..2466248 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
@@ -55,6 +55,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
    private DistortedEffects mEffects;
    private DistortedScreen mScreen;
    private DistortedTexture mTexture;
+   private MeshFlat mMesh;
    private int bmpHeight, bmpWidth;
    private Random mRnd;
 
@@ -158,8 +159,10 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
       if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
       mTexture.setTexture(bitmap);
 
+      if( mMesh==null ) mMesh = new MeshFlat(50,50*bmpHeight/bmpWidth);
+
       mScreen.detachAll();
-      mScreen.attach(mTexture,mEffects,new MeshFlat(50,50*bmpHeight/bmpWidth));
+      mScreen.attach(mTexture,mEffects,mMesh);
 
       for(int i=0; i<NUM_BUBBLES; i++) randomizeNewBubble();
 
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
index 4d7da15..14e1171 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
@@ -48,6 +48,7 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
     private GLSurfaceView mView;
     private DistortedEffects mEffects;
     private DistortedTexture mTexture;
+    private MeshFlat mMesh;
     private DistortedScreen mScreen;
     private int bmpHeight, bmpWidth;
 
@@ -135,6 +136,9 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
       // Do not leak memory by creating it the second time around.
       if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
 
+      // likewise the Mesh
+      if( mMesh==null ) mMesh = new MeshFlat(9,9*bmpHeight/bmpWidth);
+
       // even if mTexture wasn't null, we still need to call setTexture() on it
       // because every time activity goes to background, its OpenGL resources
       // - including Textures - get deleted. We always need to call setTexture()
@@ -142,7 +146,7 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
       mTexture.setTexture(bitmap);
 
       mScreen.detachAll();
-      mScreen.attach(mTexture,mEffects,new MeshFlat(9,9*bmpHeight/bmpWidth));
+      mScreen.attach(mTexture,mEffects,mMesh);
 
       DistortedEffects.enableEffect(EffectNames.DISTORT);
 
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
index 8ba1b05..67f33fb 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
@@ -48,6 +48,7 @@ class MovingEffectsRenderer implements GLSurfaceView.Renderer
    private DistortedEffects mEffects;
    private DistortedTexture mTexture;
    private DistortedScreen mScreen;
+   private MeshFlat mMesh;
    private boolean mRefresh;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -136,8 +137,11 @@ class MovingEffectsRenderer implements GLSurfaceView.Renderer
      mBitmap  = Bitmap.createBitmap(texW,texH, Bitmap.Config.ARGB_8888);
      mCanvas  = new Canvas(mBitmap);
 
+     if( mMesh!=null ) mMesh.markForDeletion();
+     mMesh = new MeshFlat(80,80*texH/texW);
+
      mScreen.detachAll();
-     mScreen.attach(mTexture,mEffects,new MeshFlat(80,80*texH/texW));
+     mScreen.attach(mTexture,mEffects,mMesh);
      mScreen.resize(texW, texH);
      mView.onSurfaceChanged(texW,texH);
 
diff --git a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
index 843cd2b..220bf88 100644
--- a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
+++ b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
@@ -65,6 +65,7 @@ class RenderThread extends Thread
 
   private DistortedEffects mEffects;
   private DistortedTexture mTexture;
+  private MeshFlat mMesh;
   private DistortedScreen mScreen;
   private int bmpHeight, bmpWidth;
   private SurfaceView mView;
@@ -259,8 +260,10 @@ class RenderThread extends Thread
     if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
     mTexture.setTexture(bmp);
 
+    if( mMesh==null ) mMesh = new MeshFlat(9,9*bmpHeight/bmpWidth);
+
     mScreen.detachAll();
-    mScreen.attach(mTexture,mEffects,new MeshFlat(9,9*bmpHeight/bmpWidth));
+    mScreen.attach(mTexture,mEffects,mMesh);
 
     DistortedEffects.enableEffect(EffectNames.DISTORT);
 
diff --git a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
index c032c4f..b71f895 100644
--- a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
+++ b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
@@ -44,6 +44,7 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
    private GLSurfaceView mView;
    private DistortedEffects mEffects;
    private DistortedScreen mScreen;
+   private MeshFlat mMesh;
    private DistortedTexture mTexture;
    private float mF, mNear;
 
@@ -122,8 +123,13 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
       mTexture= new DistortedTexture(width,height);
       mTexture.setTexture(bmp);
 
+      // likewise with the Mesh
+      if( mMesh!=null ) mMesh.markForDeletion();
+
+      mMesh = new MeshFlat(50,50*height/width);
+
       mScreen.detachAll();
-      mScreen.attach(mTexture,mEffects,new MeshFlat(50,50*height/width));
+      mScreen.attach(mTexture,mEffects,mMesh);
       mScreen.resize(width, height);
       }
 
diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
index f798bd9..b5dd979 100644
--- a/src/main/java/org/distorted/examples/save/SaveRenderer.java
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -58,6 +58,7 @@ class SaveRenderer implements GLSurfaceView.Renderer
   private DistortedEffects mEffects;
   private DistortedFramebuffer mOffscreen;
   private DistortedTexture mTexture;
+  private MeshFlat mMesh;
   private DistortedScreen mScreen;
   private Static1D s0;
   private Dynamic3D mScaleDyn;
@@ -242,16 +243,16 @@ class SaveRenderer implements GLSurfaceView.Renderer
     bmpHeight = bitmap.getHeight();
     bmpWidth  = bitmap.getWidth();
 
-    MeshFlat mesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
+    if( mMesh==null ) mMesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
     if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
     mTexture.setTexture(bitmap);
 
     if( mOffscreen==null ) mOffscreen = new DistortedFramebuffer( (int)(mScale*bmpWidth) , (int)(mScale*bmpHeight) );
 
     mOffscreen.detachAll();
-    mOffscreen.attach(mTexture,mEffects,mesh);
+    mOffscreen.attach(mTexture,mEffects,mMesh);
     mScreen.detachAll();
-    mScreen.attach(mTexture,mEffects,mesh);
+    mScreen.attach(mTexture,mEffects,mMesh);
 
     DistortedEffects.enableEffect(EffectNames.SINK);
 
diff --git a/src/main/java/org/distorted/examples/sink/SinkRenderer.java b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
index a112098..c8c4d9e 100644
--- a/src/main/java/org/distorted/examples/sink/SinkRenderer.java
+++ b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
@@ -50,6 +50,7 @@ class SinkRenderer implements GLSurfaceView.Renderer
   private DistortedEffects mEffects;
   private DistortedScreen mScreen;
   private DistortedTexture mTexture;
+  private MeshFlat mMesh;
   private int bmpHeight, bmpWidth;
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -126,9 +127,10 @@ class SinkRenderer implements GLSurfaceView.Renderer
 
     if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
     mTexture.setTexture(bitmap);
+    if( mMesh==null ) mMesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
 
     mScreen.detachAll();
-    mScreen.attach(mTexture,mEffects,new MeshFlat(30,30*bmpHeight/bmpWidth));
+    mScreen.attach(mTexture,mEffects,mMesh);
 
     DistortedEffects.enableEffect(EffectNames.SINK);
 
