commit 061449ed1571199b79dd6f51af9b6e87be9ac6ce
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Jun 16 20:37:49 2020 +0100

    Only compile the Full, Normal & OIT programs when they are actually needed.

diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
index 97dbb31..6d0280e 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
@@ -48,7 +48,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class AroundTheWorldRenderer implements GLSurfaceView.Renderer
+class AroundTheWorldRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    private GLSurfaceView mView;
    private DistortedEffects mEffects;
@@ -146,13 +146,13 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
       FragmentEffectChroma.enable();
       FragmentEffectContrast.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("AroundTheWorld", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(),this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("AroundTheWorld", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/bean/BeanRenderer.java b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
index 3409330..004e40c 100644
--- a/src/main/java/org/distorted/examples/bean/BeanRenderer.java
+++ b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
@@ -44,7 +44,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class BeanRenderer implements GLSurfaceView.Renderer 
+class BeanRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    private GLSurfaceView mView;
    private DistortedEffects mEffects;
@@ -162,13 +162,13 @@ class BeanRenderer implements GLSurfaceView.Renderer
 
      VertexEffectDistort.enable();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("Bean", ex.getMessage() );
-       }
+     DistortedLibrary.onCreate(mView.getContext(), this);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("Bean", ex.getMessage() );
      }
 }
diff --git a/src/main/java/org/distorted/examples/blur/BlurRenderer.java b/src/main/java/org/distorted/examples/blur/BlurRenderer.java
index 33aedd5..9baf6fe 100644
--- a/src/main/java/org/distorted/examples/blur/BlurRenderer.java
+++ b/src/main/java/org/distorted/examples/blur/BlurRenderer.java
@@ -45,7 +45,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class BlurRenderer implements GLSurfaceView.Renderer
+class BlurRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private final static int SIZE = 500;
 
@@ -146,13 +146,13 @@ class BlurRenderer implements GLSurfaceView.Renderer
 
      PostprocessEffectBlur.enable();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("Blur", ex.getMessage() );
-       }
+     DistortedLibrary.onCreate(mView.getContext(),this);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("Blur", ex.getMessage() );
      }
 }
diff --git a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
index 98bf1c9..43b0747 100644
--- a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
+++ b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
@@ -48,7 +48,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class CatAndDogRenderer implements GLSurfaceView.Renderer
+class CatAndDogRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private GLSurfaceView mView;
     private DistortedTexture mTexture;
@@ -158,13 +158,13 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
       FragmentEffectChroma.enable();
       FragmentEffectAlpha.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("CatAndDog", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(),this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("CatAndDog", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/check/CheckRenderer.java b/src/main/java/org/distorted/examples/check/CheckRenderer.java
index 53d00b0..079d5dd 100644
--- a/src/main/java/org/distorted/examples/check/CheckRenderer.java
+++ b/src/main/java/org/distorted/examples/check/CheckRenderer.java
@@ -55,7 +55,7 @@ import android.util.Log;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class CheckRenderer implements GLSurfaceView.Renderer 
+class CheckRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private static String compilationResult;
     private static String compilationTitle;
@@ -201,59 +201,55 @@ class CheckRenderer implements GLSurfaceView.Renderer
       mDeform1.set(           0,          0, 0);
       mDeform2.set(           0, mObjHeight, 0);
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
+      DistortedLibrary.onCreate(mView.getContext(),this);
+      }
+    
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// We have failed to compile or link shaders - probably too many effects.
+// (each effect adds a certain number of Uniforms to the shader and there
+// can only be a limited number of those )
+
+    public void distortedException(Exception ex)
+      {
+      compilationTitle = ex.getClass().getSimpleName();
+      compilationResult= ex.getMessage();
+
+      String ver;
+
+      ver = GLES31.glGetString(GLES31.GL_SHADING_LANGUAGE_VERSION);
+      compilationResult += "\n\nGLSL version: "+(ver==null ? "null" : ver);
+      ver = GLES31.glGetString(GLES31.GL_VERSION);
+      compilationResult += "\nGL version: "+(ver==null ? "null" : ver);
+      ver = GLES31.glGetString(GLES31.GL_VENDOR);
+      compilationResult += "\nGL vendor: "+(ver==null ? "null" : ver);
+      ver = GLES31.glGetString(GLES31.GL_RENDERER);
+      compilationResult += "\nGL renderer: "+(ver==null ? "null" : ver);
+
+      CheckActivity act = (CheckActivity)mView.getContext();
+
+      act.runOnUiThread(new Runnable()
         {
-        // We have failed to compile or link shaders - probably too many effects.
-        // (each effect adds a certain number of Uniforms to the shader and there
-        // can only be a limited number of those )
-
-        compilationTitle = ex.getClass().getSimpleName();
-        compilationResult= ex.getMessage();
-      
-        String ver;
-      
-        ver = GLES31.glGetString(GLES31.GL_SHADING_LANGUAGE_VERSION);
-        compilationResult += "\n\nGLSL version: "+(ver==null ? "null" : ver);
-        ver = GLES31.glGetString(GLES31.GL_VERSION);
-        compilationResult += "\nGL version: "+(ver==null ? "null" : ver);
-        ver = GLES31.glGetString(GLES31.GL_VENDOR);
-        compilationResult += "\nGL vendor: "+(ver==null ? "null" : ver);
-        ver = GLES31.glGetString(GLES31.GL_RENDERER);
-        compilationResult += "\nGL renderer: "+(ver==null ? "null" : ver);
-
-        CheckActivity act = (CheckActivity)mView.getContext();
-
-        act.runOnUiThread(new Runnable() 
+        public void run()
           {
-          public void run() 
+          Context context = mView.getContext();
+
+          AlertDialog.Builder builder = new AlertDialog.Builder(context);
+          builder.setTitle(compilationTitle);
+          builder.setMessage(compilationResult);
+          builder.setCancelable(true);
+
+          builder.setOnCancelListener(new DialogInterface.OnCancelListener()
             {
-            Context context = mView.getContext();
-      
-            AlertDialog.Builder builder = new AlertDialog.Builder(context);
-            builder.setTitle(compilationTitle);
-            builder.setMessage(compilationResult);
-            builder.setCancelable(true);
-           
-            builder.setOnCancelListener(new DialogInterface.OnCancelListener() 
+            @Override
+            public void onCancel(DialogInterface dialog)
               {
-              @Override
-              public void onCancel(DialogInterface dialog) 
-                {
-                ((CheckActivity)mView.getContext()).finish();
-                }
-              });
-            
-            AlertDialog alert = builder.create();
-            alert.show();
-            }
-          });
-        }
+              ((CheckActivity)mView.getContext()).finish();
+              }
+            });
+
+          AlertDialog alert = builder.create();
+          alert.show();
+          }
+        });
       }
-    
-///////////////////////////////////////////////////////////////////////////////////////////////////
-    
 }
diff --git a/src/main/java/org/distorted/examples/deferredjob/DeferredJobRenderer.java b/src/main/java/org/distorted/examples/deferredjob/DeferredJobRenderer.java
index 05b71b7..2e9825a 100644
--- a/src/main/java/org/distorted/examples/deferredjob/DeferredJobRenderer.java
+++ b/src/main/java/org/distorted/examples/deferredjob/DeferredJobRenderer.java
@@ -47,7 +47,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class DeferredJobRenderer implements GLSurfaceView.Renderer
+class DeferredJobRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private GLSurfaceView mView;
     private DistortedTexture mTexture;
@@ -134,14 +134,14 @@ class DeferredJobRenderer implements GLSurfaceView.Renderer
       DistortedLibrary.setMax(EffectType.VERTEX, 11);
       VertexEffectRotate.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("DeferredJob", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(),this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("DeferredJob", ex.getMessage() );
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/deform/DeformRenderer.java b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
index c8b1c25..5554d13 100644
--- a/src/main/java/org/distorted/examples/deform/DeformRenderer.java
+++ b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
@@ -48,7 +48,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class DeformRenderer implements GLSurfaceView.Renderer, EffectListener
+class DeformRenderer implements GLSurfaceView.Renderer, EffectListener, DistortedLibrary.ExceptionListener
    {
    private static final int NUM_VECTORS =  8;
    private static final int NUM_LINES   = 10;
@@ -230,14 +230,14 @@ class DeformRenderer implements GLSurfaceView.Renderer, EffectListener
      VertexEffectDistort.enable();
      VertexEffectDeform.enable();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("Deform", ex.toString() );
-       }
+     DistortedLibrary.onCreate(mView.getContext(),this);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("Deform", ex.getMessage() );
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
index c211f83..5669c22 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
@@ -48,7 +48,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class DifferentBitmapsRenderer implements GLSurfaceView.Renderer 
+class DifferentBitmapsRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    private static final int[] bitmap = { R.raw.dog, R.raw.face, R.raw.cat };
    private static final int NUM = bitmap.length;
@@ -168,14 +168,14 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
      VertexEffectSink.enable();
      VertexEffectDistort.enable();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("Renderer", ex.getMessage() );
-       }
+     DistortedLibrary.onCreate(mView.getContext(),this);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("DifferentBitmaps", ex.getMessage() );
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
index a4f635f..676064c 100644
--- a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
@@ -50,7 +50,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class DifferentEffectsRenderer implements GLSurfaceView.Renderer 
+class DifferentEffectsRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    private static final int NUM = 3;
    
@@ -188,13 +188,13 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
      VertexEffectDistort.enable();
      FragmentEffectChroma.enable();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("DifferentEffects", ex.getMessage() );
-       }
+     DistortedLibrary.onCreate(mView.getContext(), this);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("DifferentEffects", ex.getMessage() );
      }
 }
diff --git a/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java b/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java
index eba71b1..781c0f8 100644
--- a/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java
+++ b/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java
@@ -38,7 +38,7 @@ import org.distorted.library.type.Static3D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class DynamicRenderer implements GLSurfaceView.Renderer
+class DynamicRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
    {  
    private DynamicSurfaceView mView;
    private DistortedTexture mTexture;
@@ -72,17 +72,15 @@ class DynamicRenderer implements GLSurfaceView.Renderer
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-   
-   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
-     {   
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("Renderer", ex.getMessage() );
-       }
+
+   public void onDrawFrame(GL10 glUnused)
+     {
+     long time = System.currentTimeMillis();
+
+     mCanvas.drawRect(0, 0, texW, texH, mPaint);
+     mView.drawCurve(mCanvas,time);
+     mTexture.setTexture(mBitmap);
+     mScreen.render( System.currentTimeMillis() );
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -103,16 +101,18 @@ class DynamicRenderer implements GLSurfaceView.Renderer
      mView.onSurfaceChanged(texW,texH);
      DynamicSurfaceView.surfaceChanged(texW,texH);
      }
-   
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-   
-   public void onDrawFrame(GL10 glUnused)
-     {   
-     long time = System.currentTimeMillis();
-      
-     mCanvas.drawRect(0, 0, texW, texH, mPaint);
-     mView.drawCurve(mCanvas,time);
-     mTexture.setTexture(mBitmap);
-     mScreen.render( System.currentTimeMillis() );
+
+   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
+     {
+     DistortedLibrary.onCreate(mView.getContext(),this);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("Dynamic", ex.getMessage() );
      }
   }
diff --git a/src/main/java/org/distorted/examples/earth/EarthRenderer.java b/src/main/java/org/distorted/examples/earth/EarthRenderer.java
index 169702f..b6e8134 100644
--- a/src/main/java/org/distorted/examples/earth/EarthRenderer.java
+++ b/src/main/java/org/distorted/examples/earth/EarthRenderer.java
@@ -62,7 +62,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class EarthRenderer implements GLSurfaceView.Renderer
+class EarthRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private static final float RADIUS_V= 1.0f/ 8;
     private static final float RADIUS_F= 1.0f/15;
@@ -281,13 +281,13 @@ class EarthRenderer implements GLSurfaceView.Renderer
       DistortedLibrary.setMax(EffectType.VERTEX  , MAX_EFF);
       DistortedLibrary.setMax(EffectType.FRAGMENT, MAX_EFF);
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Earth", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("Earth", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
index 63b60c0..35e49d6 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
@@ -44,7 +44,7 @@ import org.distorted.library.type.Static3D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
+class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener, DistortedLibrary.ExceptionListener
   {
   private static final int NUMLINES =  10;
   private static final int MESH_QUALITY = 100;
@@ -93,6 +93,27 @@ class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
     return mEffects;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void onDrawFrame(GL10 glUnused)
+    {
+    mScreen.render( System.currentTimeMillis() );
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void onSurfaceChanged(GL10 glUnused, int width, int height)
+    {
+    // (w+h)/2 because we need to stretch more or less uniformly in all 3 directions.
+    // If we set it to 0, Distort would not be shaded. If we set it to 1, the Distorted normal
+    // vectors would get stretched only in X and Y dirs, becoming very 'flat' and the Distorted
+    // area very dark.
+    mScale.set(width, height, (width+height)*0.5f);
+
+    mScreen.resize(width,height);
+    mView.setScreenSize(width,height);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
@@ -120,35 +141,14 @@ class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
     FragmentEffectChroma.enable();
     FragmentEffectSaturation.enable();
 
-    try
-      {
-      DistortedLibrary.onCreate(mView.getContext());
-      }
-    catch(Exception ex)
-      {
-      android.util.Log.e("EffectQueue", ex.getMessage() );
-      }
+    DistortedLibrary.onCreate(mView.getContext(), this);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void onSurfaceChanged(GL10 glUnused, int width, int height)
+  public void distortedException(Exception ex)
     {
-    // (w+h)/2 because we need to stretch more or less uniformly in all 3 directions.
-    // If we set it to 0, Distort would not be shaded. If we set it to 1, the Distorted normal
-    // vectors would get stretched only in X and Y dirs, becoming very 'flat' and the Distorted
-    // area very dark.
-    mScale.set(width, height, (width+height)*0.5f);
-
-    mScreen.resize(width,height);
-    mView.setScreenSize(width,height);
-    }
-   
-///////////////////////////////////////////////////////////////////////////////////////////////////
-   
-  public void onDrawFrame(GL10 glUnused)
-    {   
-    mScreen.render( System.currentTimeMillis() );
+    android.util.Log.e("EffectQueue", ex.getMessage() );
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/flag/FlagRenderer.java b/src/main/java/org/distorted/examples/flag/FlagRenderer.java
index b8b2a2d..1c2fd32 100644
--- a/src/main/java/org/distorted/examples/flag/FlagRenderer.java
+++ b/src/main/java/org/distorted/examples/flag/FlagRenderer.java
@@ -47,7 +47,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class FlagRenderer implements GLSurfaceView.Renderer
+class FlagRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private GLSurfaceView mView;
     private DistortedTexture mTexture;
@@ -191,13 +191,13 @@ class FlagRenderer implements GLSurfaceView.Renderer
       VertexEffectScale.enable();
       VertexEffectWave.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Flag", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("Flag", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/generic/GenericRenderer.java b/src/main/java/org/distorted/examples/generic/GenericRenderer.java
index c856448..023676c 100644
--- a/src/main/java/org/distorted/examples/generic/GenericRenderer.java
+++ b/src/main/java/org/distorted/examples/generic/GenericRenderer.java
@@ -49,7 +49,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class GenericRenderer implements GLSurfaceView.Renderer
+class GenericRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private static final float FOV = 30.0f;
     private static final float NEAR = 0.1f;
@@ -322,13 +322,13 @@ class GenericRenderer implements GLSurfaceView.Renderer
       Effect.enableEffects(EffectType.FRAGMENT);
       Effect.enableEffects(EffectType.POSTPROCESS);
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Effects3D", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+      {
+      android.util.Log.e("Generic", ex.getMessage() );
       }
 }
\ No newline at end of file
diff --git a/src/main/java/org/distorted/examples/girl/GirlRenderer.java b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
index 15c0518..0002872 100644
--- a/src/main/java/org/distorted/examples/girl/GirlRenderer.java
+++ b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
@@ -50,7 +50,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class GirlRenderer implements GLSurfaceView.Renderer 
+class GirlRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private GLSurfaceView mView;
     private DistortedEffects mEffects;
@@ -212,13 +212,13 @@ class GirlRenderer implements GLSurfaceView.Renderer
      VertexEffectSink.enable();
      VertexEffectSwirl.enable();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("Girl", ex.getMessage() );
-       }
+     DistortedLibrary.onCreate(mView.getContext(), this);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("Girl", ex.getMessage() );
      }
 }
diff --git a/src/main/java/org/distorted/examples/glow/GlowRenderer.java b/src/main/java/org/distorted/examples/glow/GlowRenderer.java
index e18d1a9..aacd2ad 100644
--- a/src/main/java/org/distorted/examples/glow/GlowRenderer.java
+++ b/src/main/java/org/distorted/examples/glow/GlowRenderer.java
@@ -44,7 +44,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class GlowRenderer implements GLSurfaceView.Renderer
+class GlowRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    private static final float HALO_TO_RADIUS = 0.2f;
 
@@ -146,13 +146,13 @@ class GlowRenderer implements GLSurfaceView.Renderer
 
      PostprocessEffectGlow.enable();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("Glow", ex.getMessage() );
-       }
+     DistortedLibrary.onCreate(mView.getContext(), this);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("Glow", ex.getMessage() );
      }
 }
diff --git a/src/main/java/org/distorted/examples/inflate/InflateRenderer.java b/src/main/java/org/distorted/examples/inflate/InflateRenderer.java
index 8031ef5..6367703 100644
--- a/src/main/java/org/distorted/examples/inflate/InflateRenderer.java
+++ b/src/main/java/org/distorted/examples/inflate/InflateRenderer.java
@@ -40,7 +40,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class InflateRenderer implements GLSurfaceView.Renderer
+class InflateRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private static final float FOV = 30.0f;
     private static final float NEAR = 0.1f;
@@ -154,13 +154,13 @@ class InflateRenderer implements GLSurfaceView.Renderer
       VertexEffectScale.enable();
       FragmentEffectAlpha.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(act);
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Inflate", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(act,this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("Inflate", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
index 68403b3..873ac29 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
@@ -48,7 +48,7 @@ import android.opengl.GLSurfaceView;
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // Show how to use the setMax, notifyWhenFinished / effectFinished APIs
 
-class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener 
+class ListenerRenderer implements GLSurfaceView.Renderer, EffectListener, DistortedLibrary.ExceptionListener
 {
    private final int NUM_CONCURRENT_BUBBLES = 12;
 
@@ -183,13 +183,13 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
      DistortedLibrary.setMax(EffectType.VERTEX,NUM_CONCURRENT_BUBBLES+1);
      VertexEffectDistort.enable();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("Listener", ex.getMessage() );
-       }
+     DistortedLibrary.onCreate(mView.getContext(), this);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("Listener", ex.getMessage() );
      }
 }
diff --git a/src/main/java/org/distorted/examples/meshfile/MeshFileRenderer.java b/src/main/java/org/distorted/examples/meshfile/MeshFileRenderer.java
index cdf5ce0..29ae389 100644
--- a/src/main/java/org/distorted/examples/meshfile/MeshFileRenderer.java
+++ b/src/main/java/org/distorted/examples/meshfile/MeshFileRenderer.java
@@ -48,7 +48,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class MeshFileRenderer implements GLSurfaceView.Renderer
+class MeshFileRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private GLSurfaceView mView;
     private DistortedTexture mTexture;
@@ -114,14 +114,14 @@ class MeshFileRenderer implements GLSurfaceView.Renderer
       {
       if( mTexture==null ) mTexture = new DistortedTexture();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("MeshFile", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("MeshFile", ex.getMessage() );
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/meshjoin/MeshJoinRenderer.java b/src/main/java/org/distorted/examples/meshjoin/MeshJoinRenderer.java
index 0bd2f8d..853bbb6 100644
--- a/src/main/java/org/distorted/examples/meshjoin/MeshJoinRenderer.java
+++ b/src/main/java/org/distorted/examples/meshjoin/MeshJoinRenderer.java
@@ -50,7 +50,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class MeshJoinRenderer implements GLSurfaceView.Renderer
+class MeshJoinRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private GLSurfaceView mView;
     private DistortedTexture mTexture;
@@ -132,14 +132,14 @@ class MeshJoinRenderer implements GLSurfaceView.Renderer
       DistortedLibrary.setMax(EffectType.VERTEX, 11);
       VertexEffectSink.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("MeshJoin", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("MeshJoin", ex.getMessage() );
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java b/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
index 875de7f..7542b14 100644
--- a/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
+++ b/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
@@ -45,7 +45,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class MirrorRenderer implements GLSurfaceView.Renderer
+class MirrorRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    private static final float MIRROR_SCALE     =0.70f;  // each next mirror will be 70% of the size or the previous
    private static final float HEAD_SCALE       =0.30f;  // Head's height will be 30% of the height of the mirror
@@ -219,13 +219,13 @@ class MirrorRenderer implements GLSurfaceView.Renderer
       VertexEffectScale.enable();
       FragmentEffectBrightness.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Mirror", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("Mirror", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
index 9770537..bf89f1d 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
@@ -43,7 +43,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class MonaLisaRenderer implements GLSurfaceView.Renderer 
+class MonaLisaRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private GLSurfaceView mView;
     private DistortedEffects mEffects;
@@ -161,13 +161,13 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
       // before the call to DistortedLibrary.onCreate(). Best done here.
       VertexEffectDistort.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("MonaLisa", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("MonaLisa", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
index 757f69a..71414fb 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
@@ -46,7 +46,7 @@ import org.distorted.library.type.Static3D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class MovingEffectsRenderer implements GLSurfaceView.Renderer
+class MovingEffectsRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
    {  
    private MovingEffectsSurfaceView mView;
    private Canvas mCanvas;
@@ -128,23 +128,19 @@ class MovingEffectsRenderer implements GLSurfaceView.Renderer
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
+   public void onDrawFrame(GL10 glUnused)
      {
-     VertexEffectScale.enable();
-     VertexEffectSwirl.enable();
-     VertexEffectDeform.enable();
-     VertexEffectSink.enable();
-     FragmentEffectChroma.enable();
-     FragmentEffectAlpha.enable();
+     long time = System.currentTimeMillis();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
+     if (mView.getCurrentEffect() == MovingEffectsSurfaceView.EFFECT_POINTS && mRefresh )
        {
-       android.util.Log.e("MovingEffects", ex.getMessage() );
+       drawBackground();
+       mView.drawCurve(mCanvas,time);
+       mTexture.setTexture(mBitmap);
+       mRefresh = false;
        }
+
+     mScreen.render(time);
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -170,23 +166,25 @@ class MovingEffectsRenderer implements GLSurfaceView.Renderer
 
      mRefresh = true;
      }
-   
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-   
-   public void onDrawFrame(GL10 glUnused)
-     {   
-     long time = System.currentTimeMillis();
-      
-     if (mView.getCurrentEffect() == MovingEffectsSurfaceView.EFFECT_POINTS && mRefresh )
-       {
-       drawBackground();
-       mView.drawCurve(mCanvas,time);
-       mTexture.setTexture(mBitmap);
-       mRefresh = false;
-       }
-      
-     mScreen.render(time);
+
+   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
+     {
+     VertexEffectScale.enable();
+     VertexEffectSwirl.enable();
+     VertexEffectDeform.enable();
+     VertexEffectSink.enable();
+     FragmentEffectChroma.enable();
+     FragmentEffectAlpha.enable();
+
+     DistortedLibrary.onCreate(mView.getContext(), this);
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("MovingEffects", ex.getMessage() );
+     }
 }
diff --git a/src/main/java/org/distorted/examples/movingglow/MovingGlowRenderer.java b/src/main/java/org/distorted/examples/movingglow/MovingGlowRenderer.java
index 5848627..c38aae8 100644
--- a/src/main/java/org/distorted/examples/movingglow/MovingGlowRenderer.java
+++ b/src/main/java/org/distorted/examples/movingglow/MovingGlowRenderer.java
@@ -52,7 +52,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class MovingGlowRenderer implements GLSurfaceView.Renderer,EffectListener
+class MovingGlowRenderer implements GLSurfaceView.Renderer, EffectListener, DistortedLibrary.ExceptionListener
 {
    private static final int[] colors  = new int[] {0,0,1,  1,0,1,  1,0,0,  1,1,0,  0,1,0,  1,1,1}; // blue, pink, red, yellow, green, white
    private static final int FLASH_TIME = 2000;
@@ -194,13 +194,13 @@ class MovingGlowRenderer implements GLSurfaceView.Renderer,EffectListener
      FragmentEffectChroma.enable();
      PostprocessEffectGlow.enable();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("MovingGlow", ex.getMessage() );
-       }
+     DistortedLibrary.onCreate(mView.getContext(), this);
      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("MovingGlow", ex.getMessage() );
+      }
 }
diff --git a/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java b/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
index c8a1919..81c2d20 100644
--- a/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
+++ b/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
@@ -47,7 +47,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class MultiblurRenderer implements GLSurfaceView.Renderer
+class MultiblurRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private static final int[] MOVE_VEC =
         {
@@ -196,14 +196,14 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
 
       PostprocessEffectBlur.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Multiblur", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("Multiblur", ex.getMessage() );
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/objecttree/ObjectTreeRenderer.java b/src/main/java/org/distorted/examples/objecttree/ObjectTreeRenderer.java
index bfbe2bb..a1da70b 100644
--- a/src/main/java/org/distorted/examples/objecttree/ObjectTreeRenderer.java
+++ b/src/main/java/org/distorted/examples/objecttree/ObjectTreeRenderer.java
@@ -54,7 +54,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class ObjectTreeRenderer implements GLSurfaceView.Renderer
+class ObjectTreeRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    private static final int NODE_FBO_SIZE = 300;
    private static final int GRID = 10;
@@ -201,13 +201,13 @@ class ObjectTreeRenderer implements GLSurfaceView.Renderer
       VertexEffectSink.enable();
       FragmentEffectChroma.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("ObjectTree", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("ObjectTree", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
index c0236d0..6349ef5 100644
--- a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
+++ b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
@@ -47,7 +47,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class OlimpicRenderer implements GLSurfaceView.Renderer 
+class OlimpicRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    private static final int LEAF_SIZE = 100;
    private static final int NUM_CIRCLES = 5;
@@ -207,13 +207,13 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
 
      FragmentEffectChroma.enable();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("Olympic", ex.getMessage() );
-       }
+     DistortedLibrary.onCreate(mView.getContext(), this);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("Olympic", ex.getMessage() );
      }
 }
diff --git a/src/main/java/org/distorted/examples/postprocesstree/PostprocessTreeRenderer.java b/src/main/java/org/distorted/examples/postprocesstree/PostprocessTreeRenderer.java
index 5d98f2a..35a0321 100644
--- a/src/main/java/org/distorted/examples/postprocesstree/PostprocessTreeRenderer.java
+++ b/src/main/java/org/distorted/examples/postprocesstree/PostprocessTreeRenderer.java
@@ -49,7 +49,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class PostprocessTreeRenderer implements GLSurfaceView.Renderer
+class PostprocessTreeRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    private static final int LEAF_SIZE = 100;
    private static final int NUM_LEAVES  = 8;
@@ -185,13 +185,13 @@ class PostprocessTreeRenderer implements GLSurfaceView.Renderer
      FragmentEffectChroma.enable();
      PostprocessEffectBlur.enable();
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("PostprocessTree", ex.getMessage() );
-       }
+     DistortedLibrary.onCreate(mView.getContext(), this);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("PostprocessTree", ex.getMessage() );
      }
 }
diff --git a/src/main/java/org/distorted/examples/predeform/PredeformRenderer.java b/src/main/java/org/distorted/examples/predeform/PredeformRenderer.java
index 67fcab2..f3dd975 100644
--- a/src/main/java/org/distorted/examples/predeform/PredeformRenderer.java
+++ b/src/main/java/org/distorted/examples/predeform/PredeformRenderer.java
@@ -43,7 +43,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class PredeformRenderer implements GLSurfaceView.Renderer
+class PredeformRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private static final float FOV = 30.0f;
     private static final float NEAR = 0.1f;
@@ -180,13 +180,13 @@ class PredeformRenderer implements GLSurfaceView.Renderer
 
       Effect.enableEffects(EffectType.VERTEX);
 
-      try
-        {
-        DistortedLibrary.onCreate(act);
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Inflate", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(act, this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("Predeform", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
index 21d56f4..9d4bfe4 100644
--- a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
+++ b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
@@ -41,7 +41,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class ProjectionRenderer implements GLSurfaceView.Renderer
+class ProjectionRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    private GLSurfaceView mView;
    private DistortedEffects mEffects;
@@ -146,13 +146,13 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
       {
       VertexEffectDeform.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Projection", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("Projection", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
index 7950854..6dfd1a5 100644
--- a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
+++ b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
@@ -46,7 +46,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class QuaternionRenderer implements GLSurfaceView.Renderer 
+class QuaternionRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
   {
   private static final int NUM_QUATERNIONS = 5;
 
@@ -104,7 +104,7 @@ class QuaternionRenderer implements GLSurfaceView.Renderer
     
   public void onSurfaceChanged(GL10 glUnused, int width, int height) 
     {
-    float factor = 0.5f*(width>height ? height:width);
+    float factor = 0.5f*Math.min(width,height);
 
     mScale.set(factor,factor,factor);
     mScreen.resize(width, height);
@@ -131,14 +131,14 @@ class QuaternionRenderer implements GLSurfaceView.Renderer
       }  
       
     mTexture.setTexture(bitmap);
-      
-    try
-      {
-      DistortedLibrary.onCreate(mView.getContext());
-      }
-    catch(Exception ex)
-      {
-      android.util.Log.e("Quaternion", ex.getMessage() );
-      }
+
+    DistortedLibrary.onCreate(mView.getContext(), this);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void distortedException(Exception ex)
+    {
+    android.util.Log.e("Quaternion", ex.getMessage() );
     }
   }
diff --git a/src/main/java/org/distorted/examples/rubik/RubikRenderer.java b/src/main/java/org/distorted/examples/rubik/RubikRenderer.java
index 94f81fa..e9a3d27 100644
--- a/src/main/java/org/distorted/examples/rubik/RubikRenderer.java
+++ b/src/main/java/org/distorted/examples/rubik/RubikRenderer.java
@@ -32,7 +32,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
+class RubikRenderer implements GLSurfaceView.Renderer, EffectListener, DistortedLibrary.ExceptionListener
 {
     private static final float CUBE_SCREEN_RATIO = 0.5f;
     private static final float CAMERA_DISTANCE   = 0.6f;  // 0.6 of the length of max(scrHeight,scrWidth)
@@ -111,17 +111,15 @@ class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
      {
      createNextCube();
-
      VertexEffectSink.enable();
+     DistortedLibrary.onCreate(mView.getContext(), this);
+     }
 
-     try
-       {
-       DistortedLibrary.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("Rubik", ex.getMessage() );
-       }
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void distortedException(Exception ex)
+     {
+     android.util.Log.e("Rubik", ex.getMessage() );
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
index ab210bc..5ade8bd 100644
--- a/src/main/java/org/distorted/examples/save/SaveRenderer.java
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -52,7 +52,7 @@ import android.os.Environment;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class SaveRenderer implements GLSurfaceView.Renderer
+class SaveRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
   {
   private GLSurfaceView mView;
   private DistortedEffects mEffects;
@@ -249,13 +249,13 @@ class SaveRenderer implements GLSurfaceView.Renderer
     VertexEffectScale.enable();
     VertexEffectSink.enable();
 
-    try
-      {
-      DistortedLibrary.onCreate(mView.getContext());
-      }
-    catch(Exception ex)
-      {
-      android.util.Log.e("Renderer", ex.getMessage() );
-      }
+    DistortedLibrary.onCreate(mView.getContext(), this);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void distortedException(Exception ex)
+    {
+    android.util.Log.e("Save", ex.getMessage() );
     }
   }
diff --git a/src/main/java/org/distorted/examples/singlemesh/SingleMeshRenderer.java b/src/main/java/org/distorted/examples/singlemesh/SingleMeshRenderer.java
index e557a88..8dc10fa 100644
--- a/src/main/java/org/distorted/examples/singlemesh/SingleMeshRenderer.java
+++ b/src/main/java/org/distorted/examples/singlemesh/SingleMeshRenderer.java
@@ -50,7 +50,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class SingleMeshRenderer implements GLSurfaceView.Renderer
+class SingleMeshRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private static final float DIST = 0.5f;
 
@@ -185,14 +185,14 @@ class SingleMeshRenderer implements GLSurfaceView.Renderer
       DistortedLibrary.setMax(EffectType.VERTEX, 15);
       VertexEffectRotate.enable();
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("DeferredJob", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("SingleMesh", ex.getMessage() );
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/sink/SinkRenderer.java b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
index 60590bc..5ef8698 100644
--- a/src/main/java/org/distorted/examples/sink/SinkRenderer.java
+++ b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
@@ -45,7 +45,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class SinkRenderer implements GLSurfaceView.Renderer 
+class SinkRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
   {
   private GLSurfaceView mView;
   private DistortedEffects mEffects;
@@ -125,14 +125,13 @@ class SinkRenderer implements GLSurfaceView.Renderer
     mScreen.attach(mTexture,mEffects,mMesh);
 
     VertexEffectSink.enable();
+    DistortedLibrary.onCreate(mView.getContext(), this);
+    }
 
-    try
-      {
-      DistortedLibrary.onCreate(mView.getContext());
-      }
-    catch(Exception ex)
-      {
-      android.util.Log.e("Sink", ex.getMessage() );
-      }
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void distortedException(Exception ex)
+    {
+    android.util.Log.e("Sink", ex.getMessage() );
     }
   }
diff --git a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
index d51e53e..0b7e682 100644
--- a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
+++ b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
@@ -54,7 +54,7 @@ import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
+class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener, DistortedLibrary.ExceptionListener
   {
   private final String[] mGFFAString = 
          
@@ -186,19 +186,17 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
     {
     setupBitmaps();
-
     FragmentEffectAlpha.enable();
+    DistortedLibrary.onCreate(mView.getContext(), this);
+    }
 
-    try
-      {
-      DistortedLibrary.onCreate(mView.getContext());
-      }
-    catch(Exception ex)
-      {
-      android.util.Log.e("Star Wars", ex.getMessage() );
-      }
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void distortedException(Exception ex)
+    {
+    android.util.Log.e("StarWars", ex.getMessage() );
     }
-    
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private void setupScreen(int scrW, int scrH)
diff --git a/src/main/java/org/distorted/examples/stencil/StencilRenderer.java b/src/main/java/org/distorted/examples/stencil/StencilRenderer.java
index c0226a5..d66ba74 100644
--- a/src/main/java/org/distorted/examples/stencil/StencilRenderer.java
+++ b/src/main/java/org/distorted/examples/stencil/StencilRenderer.java
@@ -50,7 +50,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class StencilRenderer implements GLSurfaceView.Renderer
+class StencilRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private GLSurfaceView mView;
     private DistortedScreen mScreen;
@@ -226,14 +226,13 @@ class StencilRenderer implements GLSurfaceView.Renderer
 
       VertexEffectScale.enable();
       FragmentEffectBrightness.enable();
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Stencil", ex.getMessage() );
-        }
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("Stencil", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/surfaceview/RenderThread.java b/src/main/java/org/distorted/examples/surfaceview/RenderThread.java
index 5e714f0..03c1e6d 100644
--- a/src/main/java/org/distorted/examples/surfaceview/RenderThread.java
+++ b/src/main/java/org/distorted/examples/surfaceview/RenderThread.java
@@ -47,7 +47,7 @@ import java.io.InputStream;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class RenderThread extends Thread
+class RenderThread extends Thread implements DistortedLibrary.ExceptionListener
   {
   private static final String TAG = "RenderThread";
 
@@ -253,15 +253,14 @@ class RenderThread extends Thread
     mScreen.attach(mTexture,mEffects,mMesh);
 
     VertexEffectDistort.enable();
+    DistortedLibrary.onCreate(mView.getContext(), this);
+    }
 
-    try
-      {
-      DistortedLibrary.onCreate(mView.getContext());
-      }
-    catch(Exception ex)
-      {
-      Log.e("PlainMonaLisa", ex.getMessage() );
-      }
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void distortedException(Exception ex)
+    {
+    android.util.Log.e("SurfaceView", ex.getMessage() );
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java b/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java
index 7eaaaf3..524477a 100644
--- a/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java
+++ b/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java
@@ -43,7 +43,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class TransparencyRenderer implements GLSurfaceView.Renderer
+class TransparencyRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private static final int NUM = 4; // 4 ints (x,y,z, argb) each describe 1 object below
 
@@ -185,6 +185,24 @@ class TransparencyRenderer implements GLSurfaceView.Renderer
       mScreen.render(System.currentTimeMillis());
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onSurfaceChanged(GL10 glUnused, int width, int height)
+      {
+      float size= 0.02f*OBJ_SIZE;
+      mScreenMin = Math.min(width, height);
+
+      float factor = 0.65f*mScreenMin/OBJ_SIZE;
+      mScale.set(factor,factor,factor);
+
+      for(int i=0; i<NUM_OBJECTS; i++)
+        {
+        mMoveVector[i].set(size*OBJECTS[NUM*i], size*OBJECTS[NUM*i+1], size*OBJECTS[NUM*i+2]);
+        }
+
+      mScreen.resize(width, height);
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
@@ -197,32 +215,13 @@ class TransparencyRenderer implements GLSurfaceView.Renderer
       VertexEffectScale.enable();
       PostprocessEffectBlur.enable();
       FragmentEffectAlpha.enable();
-
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Transparency", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public void onSurfaceChanged(GL10 glUnused, int width, int height)
+    public void distortedException(Exception ex)
       {
-      float size= 0.02f*OBJ_SIZE;
-      mScreenMin = Math.min(width, height);
-
-      float factor = 0.65f*mScreenMin/OBJ_SIZE;
-      mScale.set(factor,factor,factor);
-
-      for(int i=0; i<NUM_OBJECTS; i++)
-        {
-        mMoveVector[i].set(size*OBJECTS[NUM*i], size*OBJECTS[NUM*i+1], size*OBJECTS[NUM*i+2]);
-        }
-
-      mScreen.resize(width, height);
+      android.util.Log.e("Transparency", ex.getMessage() );
       }
 }
diff --git a/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java b/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
index c08b130..b676b7f 100644
--- a/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
+++ b/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
@@ -52,7 +52,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class TriblurRenderer implements GLSurfaceView.Renderer
+class TriblurRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
     private static final int NUM = 6; // 6 ints (x,y,z,R,G,B) each describe 1 object below
 
@@ -173,6 +173,19 @@ class TriblurRenderer implements GLSurfaceView.Renderer
       mScreen.render(System.currentTimeMillis());
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onSurfaceChanged(GL10 glUnused, int width, int height)
+      {
+      mScreenMin = Math.min(width, height);
+
+      float factor1 = 0.20f*mScreenMin/OBJ_SIZE;
+      float factor2 = 0.75f*factor1;
+      mScale1.set(factor1,factor1,factor1);
+      mScale2.set(factor2,factor2,factor2);
+      mScreen.resize(width, height);
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
@@ -198,28 +211,14 @@ class TriblurRenderer implements GLSurfaceView.Renderer
       VertexEffectScale.enable();
       PostprocessEffectBlur.enable();
       FragmentEffectChroma.enable();
-
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Triblur", ex.getMessage() );
-        }
+      DistortedLibrary.onCreate(mView.getContext(), this);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public void onSurfaceChanged(GL10 glUnused, int width, int height)
+    public void distortedException(Exception ex)
       {
-      mScreenMin = Math.min(width, height);
-
-      float factor1 = 0.20f*mScreenMin/OBJ_SIZE;
-      float factor2 = 0.75f*factor1;
-      mScale1.set(factor1,factor1,factor1);
-      mScale2.set(factor2,factor2,factor2);
-      mScreen.resize(width, height);
+      android.util.Log.e("Triblur", ex.getMessage() );
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/wind/WindRenderer.java b/src/main/java/org/distorted/examples/wind/WindRenderer.java
index 71c56b3..4e12327 100644
--- a/src/main/java/org/distorted/examples/wind/WindRenderer.java
+++ b/src/main/java/org/distorted/examples/wind/WindRenderer.java
@@ -46,7 +46,7 @@ import javax.microedition.khronos.opengles.GL10;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class WindRenderer implements GLSurfaceView.Renderer
+class WindRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
    private static final int X = 50;
    private static final int Y = 30;
@@ -150,14 +150,13 @@ class WindRenderer implements GLSurfaceView.Renderer
       VertexEffectScale.enable();
       VertexEffectDeform.enable();
       VertexEffectWave.enable();
+      DistortedLibrary.onCreate(mView.getContext(), this);
+      }
 
-      try
-        {
-        DistortedLibrary.onCreate(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("Wind", ex.getMessage() );
-        }
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void distortedException(Exception ex)
+      {
+      android.util.Log.e("Wind", ex.getMessage() );
       }
 }
