commit e61295743dd2d8c49f6134819f74c454bea577f9
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon May 18 22:22:51 2020 +0100

    Progress with the Predeform app; deepCopy for the Meshes; various fixes.

diff --git a/src/main/java/org/distorted/examples/predeform/PredeformActivity.java b/src/main/java/org/distorted/examples/predeform/PredeformActivity.java
index a166558..86fc706 100644
--- a/src/main/java/org/distorted/examples/predeform/PredeformActivity.java
+++ b/src/main/java/org/distorted/examples/predeform/PredeformActivity.java
@@ -34,6 +34,7 @@ import org.distorted.examples.R;
 import org.distorted.library.effect.Effect;
 import org.distorted.library.effect.EffectName;
 import org.distorted.library.effect.EffectType;
+import org.distorted.library.effect.VertexEffect;
 import org.distorted.library.type.Static4D;
 
 import java.util.ArrayList;
@@ -230,7 +231,7 @@ public class PredeformActivity extends Activity implements View.OnClickListener,
 
     Effect effect = eff.createEffect();
 
-    PredeformEffectList.addNew(effect);
+    PredeformEffectList.addNew( (VertexEffect)effect );
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/predeform/PredeformActivity2.java b/src/main/java/org/distorted/examples/predeform/PredeformActivity2.java
index f7e2b3e..9809e56 100644
--- a/src/main/java/org/distorted/examples/predeform/PredeformActivity2.java
+++ b/src/main/java/org/distorted/examples/predeform/PredeformActivity2.java
@@ -119,12 +119,12 @@ public class PredeformActivity2 extends Activity implements SeekBar.OnSeekBarCha
     public void showNormal(View view)
       {
       CheckBox box = (CheckBox)view;
-      boolean showNormal = box.isChecked();
+      boolean show = box.isChecked();
 
-      if ( mMesh!=null )
-        {
-        mMesh.setShowNormals(showNormal);
-        }
+      PredeformSurfaceView v = findViewById(R.id.predeformSurfaceView);
+      PredeformRenderer renderer = v.getRenderer();
+
+      renderer.showNormal(show);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/predeform/PredeformEffectList.java b/src/main/java/org/distorted/examples/predeform/PredeformEffectList.java
index f4565bf..8c95f23 100644
--- a/src/main/java/org/distorted/examples/predeform/PredeformEffectList.java
+++ b/src/main/java/org/distorted/examples/predeform/PredeformEffectList.java
@@ -19,7 +19,7 @@
 
 package org.distorted.examples.predeform;
 
-import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.VertexEffect;
 
 import java.util.ArrayList;
 
@@ -27,11 +27,11 @@ import java.util.ArrayList;
 
 public class PredeformEffectList
   {
-  private static ArrayList<Effect> mList = new ArrayList<>();
+  private static ArrayList<VertexEffect> mList = new ArrayList<>();
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static void addNew(Effect effect)
+  static void addNew(VertexEffect effect)
     {
     mList.add(effect);
     }
@@ -48,7 +48,7 @@ public class PredeformEffectList
   static void remove(long id)
     {
     int size = mList.size();
-    Effect effect;
+    VertexEffect effect;
 
     for (int i=0; i<size; i++)
       {
@@ -64,7 +64,7 @@ public class PredeformEffectList
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static ArrayList<Effect> getEffectList()
+  static ArrayList<VertexEffect> getEffectList()
     {
     return mList;
     }
diff --git a/src/main/java/org/distorted/examples/predeform/PredeformRenderer.java b/src/main/java/org/distorted/examples/predeform/PredeformRenderer.java
index 191683e..0f87055 100644
--- a/src/main/java/org/distorted/examples/predeform/PredeformRenderer.java
+++ b/src/main/java/org/distorted/examples/predeform/PredeformRenderer.java
@@ -21,9 +21,12 @@ package org.distorted.examples.predeform;
 
 import android.opengl.GLSurfaceView;
 
-import org.distorted.library.effect.FragmentEffectAlpha;
+import org.distorted.library.effect.EffectType;
+import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.effect.MatrixEffectQuaternion;
 import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.effect.VertexEffect;
+import org.distorted.library.effect.Effect;
 import org.distorted.library.effect.VertexEffectScale;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedLibrary;
@@ -34,6 +37,8 @@ import org.distorted.library.type.DynamicQuat;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 
+import java.util.ArrayList;
+
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
@@ -46,11 +51,11 @@ class PredeformRenderer implements GLSurfaceView.Renderer
 
     private GLSurfaceView mView;
     private DistortedTexture mTexture;
-    private DistortedEffects mEffects;
-    private MeshBase mMesh;
+    private DistortedEffects mEffects1, mEffects2;
+    private MeshBase mMesh1, mMesh2;
     private DistortedScreen mScreen;
     private float mObjWidth, mObjHeight, mObjDepth;
-    private Static3D mScale;
+    private Static3D mScale, mMove1, mMove2;
 
     Static4D mQuat1, mQuat2;
     int mScreenMin;
@@ -62,13 +67,16 @@ class PredeformRenderer implements GLSurfaceView.Renderer
       mView = v;
 
       mScale= new Static3D(1,1,1);
+      mMove1= new Static3D(0,0,0);
+      mMove2= new Static3D(0,0,0);
 
       Static3D center=new Static3D(0,0,0);
 
       PredeformActivity2 act = (PredeformActivity2)v.getContext();
 
       mTexture = act.getTexture();
-      mMesh    = act.getMesh();
+      mMesh1   = act.getMesh();
+      mMesh2   = mMesh1.deepCopy();
 
       mObjWidth = act.getCols();
       mObjHeight= act.getRows();
@@ -83,11 +91,33 @@ class PredeformRenderer implements GLSurfaceView.Renderer
       quatInt1.add(mQuat1);
       quatInt2.add(mQuat2);
 
-      mEffects = new DistortedEffects();
-      mEffects.apply( new VertexEffectScale(new Static3D(mObjWidth,mObjHeight,mObjDepth) ) );
-      mEffects.apply( new MatrixEffectScale(mScale));
-      mEffects.apply( new MatrixEffectQuaternion(quatInt2, center) );
-      mEffects.apply( new MatrixEffectQuaternion(quatInt1, center) );
+      ArrayList<VertexEffect> effectList = PredeformEffectList.getEffectList();
+      int numEffects = effectList.size();
+
+      for(int i=0; i<numEffects; i++)
+        {
+        mMesh2.apply(effectList.get(i));
+        }
+
+      mEffects1 = new DistortedEffects();
+      mEffects1.apply( new VertexEffectScale(new Static3D(mObjWidth,mObjHeight,mObjDepth) ) );
+
+      for(int i=0; i<numEffects; i++)
+        {
+        mEffects1.apply(effectList.get(i));
+        }
+
+      mEffects1.apply( new MatrixEffectScale(mScale));
+      mEffects1.apply( new MatrixEffectQuaternion(quatInt2, center) );
+      mEffects1.apply( new MatrixEffectQuaternion(quatInt1, center) );
+      mEffects1.apply( new MatrixEffectMove(mMove1));
+
+      mEffects2 = new DistortedEffects();
+      mEffects2.apply( new VertexEffectScale(new Static3D(mObjWidth,mObjHeight,mObjDepth) ) );
+      mEffects2.apply( new MatrixEffectScale(mScale));
+      mEffects2.apply( new MatrixEffectQuaternion(quatInt2, center) );
+      mEffects2.apply( new MatrixEffectQuaternion(quatInt1, center) );
+      mEffects2.apply( new MatrixEffectMove(mMove2));
 
       mScreen = new DistortedScreen();
       mScreen.glClearColor(1.0f,1.0f,1.0f,0.0f);
@@ -105,20 +135,42 @@ class PredeformRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       {
-      final float SCALE = 0.75f;
+      final float SCALE = 0.6f;
+
+      if( width<height )
+        {
+        float factor = SCALE*(Math.min(width/mObjWidth, 0.5f*height/mObjHeight));
+        mScale.set(factor,factor,factor);
+        mMove1.set(0,+height*0.25f,0);
+        mMove2.set(0,-height*0.25f,0);
+        }
+      else
+        {
+        float factor = SCALE*(Math.min( 0.5f*width/mObjWidth, height/mObjHeight));
+        mScale.set(factor,factor,factor);
+        mMove1.set(+width*0.25f,0,0);
+        mMove2.set(-width*0.25f,0,0);
+        }
 
       mScreenMin = Math.min(width, height);
-      float factor = ( width*mObjHeight > height*mObjWidth ) ? (SCALE*height)/mObjHeight :  (SCALE*width)/mObjWidth;
-      mScale.set(factor,factor,factor);
       mScreen.resize(width, height);
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    void showNormal(boolean show)
+      {
+      mMesh1.setShowNormals(show);
+      mMesh2.setShowNormals(show);
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     float setLevel(int level)
       {
       float inflateLevel = (level-50)/50.0f;
-      mMesh.setInflate(inflateLevel);
+      mMesh1.setInflate(inflateLevel);
+      mMesh2.setInflate(inflateLevel);
 
       return inflateLevel;
       }
@@ -131,10 +183,10 @@ class PredeformRenderer implements GLSurfaceView.Renderer
 
       mTexture.setTexture( act.getBitmap() );
       mScreen.detachAll();
-      mScreen.attach(mTexture,mEffects,mMesh);
+      mScreen.attach(mTexture,mEffects1,mMesh1);
+      mScreen.attach(mTexture,mEffects2,mMesh2);
 
-      VertexEffectScale.enable();
-      FragmentEffectAlpha.enable();
+      Effect.enableEffects(EffectType.VERTEX);
 
       try
         {
