commit da57b7da2585ec7665c394e7fe0e14c54a295aef
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue May 1 22:07:53 2018 +0100

    Fix the 'OIT' artefacts.

diff --git a/src/main/java/org/distorted/examples/blur/BlurRenderer.java b/src/main/java/org/distorted/examples/blur/BlurRenderer.java
index ed2dc56..e5dbd7a 100644
--- a/src/main/java/org/distorted/examples/blur/BlurRenderer.java
+++ b/src/main/java/org/distorted/examples/blur/BlurRenderer.java
@@ -24,12 +24,12 @@ import android.graphics.BitmapFactory;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
-import org.distorted.library.effect.EffectName;
 import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.effect.PostprocessEffectBlur;
 import org.distorted.library.main.Distorted;
 import org.distorted.library.main.DistortedEffects;
+import org.distorted.library.main.DistortedFramebuffer;
 import org.distorted.library.main.DistortedNode;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.DistortedTexture;
@@ -48,14 +48,17 @@ import javax.microedition.khronos.opengles.GL10;
 
 class BlurRenderer implements GLSurfaceView.Renderer
 {
+    private final static int SIZE = 500;
+
     private GLSurfaceView mView;
     private DistortedTexture mTexture;
-    private DistortedEffects mEffects;
+    private DistortedEffects mEffects, mBufferEffects;
     private DistortedScreen mScreen;
+    private DistortedFramebuffer mBuffer;
     private MeshFlat mMesh;
     private Static1D mRadiusSta;
     private int mObjHeight, mObjWidth;
-    private Static3D mMove, mScale;
+    private Static3D mMove, mScale, mBufferMove, mBufferScale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -64,6 +67,7 @@ class BlurRenderer implements GLSurfaceView.Renderer
       mView   = v;
       mMesh   = new MeshFlat(1,1);
       mScreen = new DistortedScreen();
+      mBuffer = new DistortedFramebuffer(SIZE,SIZE);
 
       mRadiusSta = new Static1D(5);
       Dynamic1D radiusDyn = new Dynamic1D();
@@ -71,6 +75,12 @@ class BlurRenderer implements GLSurfaceView.Renderer
 
       mMove = new Static3D(0,0,0);
       mScale= new Static3D(1,1,1);
+      mBufferMove = new Static3D(0,0,0);
+      mBufferScale= new Static3D(1,1,1);
+
+      mBufferEffects = new DistortedEffects();
+      mBufferEffects.apply(new MatrixEffectMove(mBufferMove));
+      mBufferEffects.apply(new MatrixEffectScale(mBufferScale));
 
       mEffects = new DistortedEffects();
       mEffects.apply( new PostprocessEffectBlur(radiusDyn) );
@@ -91,21 +101,34 @@ class BlurRenderer implements GLSurfaceView.Renderer
    
    public void onDrawFrame(GL10 glUnused) 
       {
-      mScreen.render( System.currentTimeMillis() );
+      long time = System.currentTimeMillis();
+
+      mBuffer.render(time);
+      mScreen.render(time);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
    public void onSurfaceChanged(GL10 glUnused, int width, int height)
      {
-     float qw = (float)width /mObjWidth;
-     float qh = (float)height/mObjHeight;
-     float factor = 0.8f* (qw<qh ? qw:qh);
-     int w = (int)(factor*mObjWidth);
-     int h = (int)(factor*mObjHeight);
-
-     mMove.set((width-w)/2 ,(height-h)/2, 0);
-     mScale.set( factor,factor,factor );
+     float qw1 = (float)width /SIZE;
+     float qh1 = (float)height/SIZE;
+     float factor1 = 0.8f* (qw1<qh1 ? qw1:qh1);
+     int w1 = (int)(factor1*SIZE);
+     int h1 = (int)(factor1*SIZE);
+
+     mBufferMove.set((width-w1)/2 ,(height-h1)/2, 0);
+     mBufferScale.set( factor1,factor1,factor1 );
+
+     float qw2 = (float)SIZE/mObjWidth;
+     float qh2 = (float)SIZE/mObjHeight;
+     float factor2 = 0.9f* (qw2<qh2 ? qw2:qh2);
+     int w2 = (int)(factor2*mObjWidth);
+     int h2 = (int)(factor2*mObjHeight);
+
+     mMove.set((SIZE-w2)/2 ,(SIZE-h2)/2, 0);
+     mScale.set( factor2,factor2,factor2 );
+
      mScreen.resize(width, height);
      }
 
@@ -136,7 +159,8 @@ class BlurRenderer implements GLSurfaceView.Renderer
      mTexture.setTexture(bitmap);
 
      mScreen.detachAll();
-     mScreen.attach(new DistortedNode(mTexture,mEffects,mMesh));
+     mScreen.attach(mBuffer, mBufferEffects, mMesh);
+     mBuffer.attach(new DistortedNode(mTexture,mEffects,mMesh));
 
      PostprocessEffectBlur.enable();
 
