commit e0b71e6e5bbd0257e542d487c4ac0173409d6f1c
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Mar 25 22:47:15 2022 +0100

    Bandaged 3x3: implement object reset.

diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java b/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
index d6b526a9..7f1730b1 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
@@ -35,6 +35,8 @@ import org.distorted.library.type.Static4D;
 
 public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, DistortedLibrary.ExceptionListener
 {
+   private static final int DURATION = 1000;
+
    static final int COLOR_DEFAULT = 0xffffff55;
    static final int COLOR_MARKED  = 0xffff0000;
 
@@ -76,10 +78,12 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
    private final Static3D mScale;
    private final BandagedCubit[] mCubits;
    private final Static4D mQuatT, mQuatA;
-   private float mScaleValue;
 
+   private boolean mInitialPhase;
+   private long mStartTime;
+   private float mScaleValue;
    private float mX, mY, mZ, mW;
-   private boolean mResetQuats, mSetQuatT;
+   private boolean mResetQuats, mSetQuatT, mResettingObject;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -92,8 +96,9 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
 
      mView = v;
 
-     mResetQuats = false;
-     mSetQuatT   = false;
+     mResetQuats     = false;
+     mSetQuatT       = false;
+     mResettingObject= false;
 
      mScreen = new DistortedScreen();
      mScreen.glClearColor(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS, 1.0f);
@@ -101,6 +106,26 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
      mCubits= createCubits();
      }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private boolean isAdjacent(float[] pos1, float[] pos2)
+     {
+     int len1 = pos1.length/3;
+     int len2 = pos2.length/3;
+
+     for(int i=0; i<len1; i++)
+       for(int j=0; j<len2; j++)
+         {
+         float d0 = pos1[3*i  ] - pos2[3*j  ];
+         float d1 = pos1[3*i+1] - pos2[3*j+1];
+         float d2 = pos1[3*i+2] - pos2[3*j+2];
+
+         if( d0*d0 + d1*d1 + d2*d2 == 1 ) return true;
+         }
+
+     return false;
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    private BandagedCubit[] createCubits()
@@ -116,6 +141,28 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
      return cubits;
      }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private void resetObject()
+     {
+     mView.resetCubits();
+
+     int len = POSITIONS.length;
+
+     for(int c=0; c<len; c++)
+       {
+       if( !mCubits[c].isAttached() )
+         {
+         mCubits[c].attach();
+         mScreen.attach(mCubits[c].getNode());
+         }
+       if( mCubits[c].getPosition().length>3 )
+         {
+         mCubits[c].reset(mScaleValue);
+         }
+       }
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    @Override
@@ -152,6 +199,12 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
        mQuatT.set(0f, 0f, 0f, 1f);
        mQuatA.set(tx, ty, tz, tw);
        }
+
+     if( mResettingObject )
+       {
+       boolean done = continueResetting(time);
+       if( done ) mResettingObject = false;
+       }
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -208,26 +261,6 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
      return mScreen;
      }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-   private boolean isAdjacent(float[] pos1, float[] pos2)
-     {
-     int len1 = pos1.length/3;
-     int len2 = pos2.length/3;
-
-     for(int i=0; i<len1; i++)
-       for(int j=0; j<len2; j++)
-         {
-         float d0 = pos1[3*i  ] - pos2[3*j  ];
-         float d1 = pos1[3*i+1] - pos2[3*j+1];
-         float d2 = pos1[3*i+2] - pos2[3*j+2];
-
-         if( d0*d0 + d1*d1 + d2*d2 == 1 ) return true;
-         }
-
-     return false;
-     }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    public void tryConnectingCubits(int index1, int index2)
@@ -274,8 +307,47 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   public void reset()
+   public boolean isBusy()
      {
+     return mResettingObject;
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void saveObject()
+     {
+
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void setupReset()
+     {
+     mResettingObject = true;
+     mInitialPhase    = true;
+     mStartTime       = System.currentTimeMillis();
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public boolean continueResetting(long time)
+     {
+     long diff = time-mStartTime;
+     float quotient = ((float)diff)/DURATION;
+
+     if( mInitialPhase && quotient>0.5f )
+       {
+       mInitialPhase=false;
+       resetObject();
+       }
+
+     double angle = 2*Math.PI*quotient*quotient*(3-2*quotient);
+
+     float sinA = (float)Math.sin(angle);
+     float cosA = (float)Math.cos(angle);
+
+     mQuatT.set(0, -sinA, 0, cosA);
 
+     return quotient>1.0f;
      }
 }
diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorScreen.java b/src/main/java/org/distorted/bandaged/BandagedCreatorScreen.java
index f4fca105..1861e172 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorScreen.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorScreen.java
@@ -72,7 +72,8 @@ public class BandagedCreatorScreen
       @Override
       public void onClick(View v)
         {
-
+        BandagedCreatorRenderer renderer = act.getRenderer();
+        if( !renderer.isBusy() ) renderer.saveObject();
         }
       });
     }
@@ -91,7 +92,7 @@ public class BandagedCreatorScreen
       public void onClick(View v)
         {
         BandagedCreatorRenderer renderer = act.getRenderer();
-        renderer.reset();
+        if( !renderer.isBusy() ) renderer.setupReset();
         }
       });
     }
diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorView.java b/src/main/java/org/distorted/bandaged/BandagedCreatorView.java
index 14b3bc53..de021d1b 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorView.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorView.java
@@ -100,6 +100,17 @@ public class BandagedCreatorView extends GLSurfaceView
       return mRenderer;
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void resetCubits()
+      {
+      if( mTouchedIndex1>=0 ) mTouchControl.markCubit(mTouchedIndex1, BandagedCreatorRenderer.COLOR_DEFAULT);
+      if( mTouchedIndex2>=0 ) mTouchControl.markCubit(mTouchedIndex2, BandagedCreatorRenderer.COLOR_DEFAULT);
+
+      mTouchedIndex1 = -1;
+      mTouchedIndex2 = -1;
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void setScreenSize(int width, int height)
@@ -114,6 +125,8 @@ public class BandagedCreatorView extends GLSurfaceView
     @Override
     public boolean onTouchEvent(MotionEvent event)
       {
+      if( mRenderer.isBusy() ) return true;
+
       int action = event.getAction();
       int x = (int)event.getX();
       int y = (int)event.getY();
diff --git a/src/main/java/org/distorted/bandaged/BandagedCubit.java b/src/main/java/org/distorted/bandaged/BandagedCubit.java
index 355132db..b730de1a 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCubit.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCubit.java
@@ -119,6 +119,27 @@ public class BandagedCubit
       mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void reset(float scale)
+      {
+      float x0 = mPosition[0];
+      float x1 = mPosition[1];
+      float x2 = mPosition[2];
+
+      mPosition = new float[3];
+      mPosition[0] = x0;
+      mPosition[1] = x1;
+      mPosition[2] = x2;
+
+      computeMove(mPosition);
+
+      FactoryBandaged3x3Cubit factory = FactoryBandaged3x3Cubit.getInstance();
+      MeshBase mesh = factory.createMesh(mPosition);
+      mNode.setMesh(mesh);
+      mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void scaleMove(float scale)
@@ -140,6 +161,13 @@ public class BandagedCubit
       mIsAttached = false;
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void attach()
+      {
+      mIsAttached = true;
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public boolean isAttached()
