commit 936333aa9aec0670d78dd359c959aa998728ea92
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Mar 3 15:36:49 2020 +0000

    Port Cat and Dog to the new setStretch-less API.

diff --git a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
index 462b8f4..567d4f0 100644
--- a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
+++ b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
@@ -35,7 +35,7 @@ import org.distorted.library.main.DistortedLibrary;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.DistortedTexture;
-import org.distorted.library.mesh.MeshRectangles;
+import org.distorted.library.mesh.MeshQuad;
 import org.distorted.library.type.Dynamic;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
@@ -50,69 +50,77 @@ import android.opengl.GLSurfaceView;
 
 class CatAndDogRenderer implements GLSurfaceView.Renderer
 {
-    private static final int DURATION_CHROMA_ALPHA   =  3000;
-    private static final int DURATION_MATRIX_EFFECTS = 10000;
-
     private GLSurfaceView mView;
-    private DistortedEffects mEffects;
-    private MeshRectangles mMesh;
     private DistortedTexture mTexture;
     private DistortedScreen mScreen;
-    private int mObjHeight, mObjWidth;
-    private Static3D mMoveStartingPoint, mMoveEndPoint;
+    private Static3D mScaleStart, mScaleEnd, mMoveStart, mMoveEnd;
+    private float mBmpRatio;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     CatAndDogRenderer(GLSurfaceView v)
-      {   
-      mView = v;
-
-      mMesh = new MeshRectangles(1,1);  // no vertex effects, grid can be a (1x1) quad.
-
-      Dynamic3D moveDyn= new Dynamic3D(DURATION_MATRIX_EFFECTS,0.0f);
-
-      mMoveStartingPoint = new Static3D(0,0,0);
-      mMoveEndPoint      = new Static3D(0,0,0);
+      {
+      final int DURATION_CHROMA_ALPHA   =  3000;
+      final int DURATION_MATRIX_EFFECTS = 10000;
 
-      moveDyn.add(mMoveStartingPoint);
-      moveDyn.add(mMoveEndPoint);
+      mView = v;
 
-      Static3D chromaCenter= new Static3D( 130,  50, 0   );
-      Static3D chromaRegion= new Static3D( 100, 100, 100 );
-      Static3D alphaCenter = new Static3D(-170,  50, 0   );
-      Static3D alphaRegion = new Static3D( 100, 100, 100 );
+      DistortedEffects effects = new DistortedEffects();
 
-      Dynamic1D chromaDyn = new Dynamic1D(DURATION_CHROMA_ALPHA,0.0f);
-      chromaDyn.add(new Static1D(1));
-      chromaDyn.add(new Static1D(0));
-      Dynamic1D alphaDyn = new Dynamic1D(DURATION_CHROMA_ALPHA,0.0f);
-      alphaDyn.add(new Static1D(1));
-      alphaDyn.add(new Static1D(0));
+      mScaleStart= new Static3D(1,1,1);
+      mScaleEnd  = new Static3D(1,1,1);
       Dynamic3D diScale = new Dynamic3D(DURATION_MATRIX_EFFECTS,0.0f);
-      diScale.add(new Static3D(1,1,1));
-      diScale.add(new Static3D(0.33f,0.33f,1));
-      diScale.add(new Static3D(1,1,1));
+      diScale.add(mScaleStart);
+      diScale.add(mScaleEnd  );
+      diScale.add(mScaleStart);
       diScale.setMode(Dynamic.MODE_PATH);
+      effects.apply( new MatrixEffectScale( diScale ));
+
       Dynamic1D diRotate = new Dynamic1D(DURATION_MATRIX_EFFECTS,0.0f);
       diRotate.add(new Static1D(  0));
       diRotate.add(new Static1D(360));
-
-      mEffects = new DistortedEffects();
-      mEffects.apply( new FragmentEffectChroma( chromaDyn, new Static3D(1,0,0), chromaCenter, chromaRegion ,true) );
-      mEffects.apply( new FragmentEffectAlpha(alphaDyn, alphaCenter, alphaRegion, false) );
-      mEffects.apply( new MatrixEffectMove(moveDyn));
-      mEffects.apply( new MatrixEffectScale(diScale));
-      mEffects.apply( new MatrixEffectRotate( diRotate, new Static3D(0,0,1), new Static3D(0,0,0)) );
-
-      mScreen = new DistortedScreen();
+      effects.apply( new MatrixEffectRotate( diRotate, new Static3D(0,0,1), new Static3D(0,0,0)) );
+
+      mMoveStart= new Static3D(0,0,0);
+      mMoveEnd  = new Static3D(0,0,0);
+      Dynamic3D diMove= new Dynamic3D(DURATION_MATRIX_EFFECTS,0.0f);
+      diMove.add( mMoveStart );
+      diMove.add( mMoveEnd   );
+      effects.apply( new MatrixEffectMove( diMove ));
+
+      Dynamic1D diChroma = new Dynamic1D(DURATION_CHROMA_ALPHA,0.0f);
+      diChroma.add(new Static1D(1));
+      diChroma.add(new Static1D(0));
+      Static3D chromaCenter= new Static3D( -0.25f, 0, 0 );
+      Static3D chromaRegion= new Static3D( 0.2f, 0.3f, 0.2f );
+      effects.apply( new FragmentEffectChroma( diChroma, new Static3D(1,0,0), chromaCenter, chromaRegion ,true) );
+
+      Dynamic1D diAlpha = new Dynamic1D(DURATION_CHROMA_ALPHA,0.0f);
+      diAlpha.add(new Static1D(1));
+      diAlpha.add(new Static1D(0));
+      Static3D alphaCenter = new Static3D( +0.25f, 0, 0 );
+      Static3D alphaRegion = new Static3D( 0.2f, 0.3f, 0.2f );
+      effects.apply( new FragmentEffectAlpha( diAlpha, alphaCenter, alphaRegion, false) );
+
+      mTexture = new DistortedTexture();
+      mScreen  = new DistortedScreen();
+
+      mScreen.attach(mTexture,effects,new MeshQuad());
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void onSurfaceChanged(GL10 glUnused, int width, int height)
       {
-      mMoveStartingPoint.set( (width-mObjWidth)/2, (height-mObjHeight)/2, 0);
-      mMoveEndPoint     .set(-(width-mObjWidth)/2,-(height-mObjHeight)/2, 0);
+      final float SCALE_START = 0.3f;
+      final float SCALE_END   = 0.6f;
+      float min= (width>height ? height : width);
+
+      mScaleStart.set( SCALE_START*min, SCALE_START*min*mBmpRatio, 1 );
+      mScaleEnd  .set( SCALE_END  *min, SCALE_END  *min*mBmpRatio, 1 );
+
+      mMoveStart.set( 0.5f*width - (SCALE_START/2)*min ,  0.5f*height - SCALE_START/2*min*mBmpRatio, 0);
+      mMoveEnd  .set(-0.5f*width + (SCALE_START/2)*min , -0.5f*height + SCALE_START/2*min*mBmpRatio, 0);
 
       mScreen.resize(width, height);
       }
@@ -143,17 +151,9 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
         catch(IOException e) { }
         }  
       
-      mObjHeight = bitmap.getHeight();
-      mObjWidth  = bitmap.getWidth();
-
-      mMesh.setStretch(mObjWidth,mObjHeight,0);
-
-      if( mTexture==null ) mTexture = new DistortedTexture();
+      mBmpRatio = (float)bitmap.getHeight()/bitmap.getWidth();
       mTexture.setTexture(bitmap);
 
-      mScreen.detachAll();
-      mScreen.attach(mTexture,mEffects,mMesh);
-
       FragmentEffectChroma.enable();
       FragmentEffectAlpha.enable();
 
