commit 28fe91aecd57c508c86a6f6ae71dc99170ec6e91
Author: leszek <leszek@koltunski.pl>
Date:   Sun Apr 16 23:25:05 2017 +0100

    Multiblur: add FPS

diff --git a/src/main/java/org/distorted/examples/deform/DeformRenderer.java b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
index 8cf31ae..40da5bc 100644
--- a/src/main/java/org/distorted/examples/deform/DeformRenderer.java
+++ b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
@@ -39,7 +39,6 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -48,7 +47,7 @@ class DeformRenderer implements GLSurfaceView.Renderer
    {
    private static final int NUM_VECTORS =  8;
    private static final int NUM_LINES   = 10;
-   private static final int NUM_FRAMES  = 10;
+   private static final int NUM_FRAMES  = 100;
 
    private GLSurfaceView mView;
    private DistortedTexture fpsTexture, stretchTexture;
diff --git a/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java b/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
index 6d06033..575b6b5 100644
--- a/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
+++ b/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
@@ -21,6 +21,8 @@ package org.distorted.examples.multiblur;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Paint;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
@@ -33,6 +35,7 @@ import org.distorted.library.DistortedTexture;
 import org.distorted.library.EffectNames;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.MeshCubes;
+import org.distorted.library.MeshFlat;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.DynamicQuat;
@@ -50,6 +53,8 @@ import javax.microedition.khronos.opengles.GL10;
 
 class MultiblurRenderer implements GLSurfaceView.Renderer
 {
+    private static final int NUM_FRAMES  = 100;
+
     private static final int[] MOVE_VEC =
         {
         +1,+1,+1,
@@ -81,7 +86,20 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
 
     Static4D mQuat1, mQuat2;
     int mScreenMin;
-    
+
+    // FPS
+    private DistortedTexture fpsTexture;
+    private DistortedEffects fpsEffects;
+    private MeshFlat fpsMesh;
+    private Canvas fpsCanvas;
+    private Bitmap fpsBitmap;
+    private Paint mPaint;
+    private int fpsH, fpsW;
+    private String fpsString = "";
+    private long lastTime=0;
+    private long[] durations;
+    private int currDuration;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     MultiblurRenderer(GLSurfaceView v)
@@ -89,6 +107,19 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
       mView = v;
       mDistance = -1;
 
+      mPaint = new Paint();
+      mPaint.setAntiAlias(true);
+      mPaint.setTextAlign(Paint.Align.CENTER);
+
+      fpsTexture = new DistortedTexture(100,100);
+      fpsEffects = new DistortedEffects();
+      fpsEffects.move( new Static3D(5,5,0) );
+      fpsMesh = new MeshFlat(1,1);
+      durations = new long[NUM_FRAMES+1];
+      currDuration = 0;
+
+      for(int i=0; i<NUM_FRAMES+1; i++) durations[i]=0;
+
       mBlurStatus = new boolean[NUM_OBJECTS];
       mMoveDynamic= new Dynamic3D[NUM_OBJECTS];
       mMoveVector = new Static3D[NUM_OBJECTS];
@@ -133,6 +164,8 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
         mScreen.attach(mNode[i]);
         }
 
+      mScreen.attach(fpsTexture,fpsEffects,fpsMesh);
+
       mBlurStatus[0] = true;
       mNode[0].setPostprocessEffects(mPostEffects);
       }
@@ -141,7 +174,16 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
    
     public void onDrawFrame(GL10 glUnused) 
       {
-      mScreen.render( System.currentTimeMillis() );
+      mPaint.setColor(0xffffffff);
+      fpsCanvas.drawRect(0, 0, fpsW, fpsH, mPaint);
+      mPaint.setColor(0xff000000);
+      fpsCanvas.drawText(fpsString, fpsW/2, 5*fpsH/6, mPaint);
+      fpsTexture.setTexture(fpsBitmap);
+
+      long time = System.currentTimeMillis();
+
+      mScreen.render(time);
+      computeFPS(time);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -167,6 +209,13 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
 
       computeMoveVectors();
 
+      fpsW = width/5;
+      fpsH = fpsW/2;
+      mPaint.setTextSize(2*fpsH/3);
+      fpsBitmap = Bitmap.createBitmap(fpsW,fpsH, Bitmap.Config.ARGB_8888);
+      fpsCanvas = new Canvas(fpsBitmap);
+      fpsTexture.setTexture(fpsBitmap);
+
       mScreen.resize(width, height);
       }
 
@@ -208,6 +257,23 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
         }
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private void computeFPS(long currentTime)
+     {
+     if( lastTime!=0 )
+       {
+       currDuration++;
+       if( currDuration>=NUM_FRAMES ) currDuration = 0;
+       durations[NUM_FRAMES] += ((currentTime-lastTime)-durations[currDuration]);
+       durations[currDuration] = currentTime-lastTime;
+
+       fpsString = "" + ((int)(10000.0f*NUM_FRAMES/durations[NUM_FRAMES]))/10.0f;
+       }
+
+     lastTime = currentTime;
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     private void computeMoveVectors()
