commit 826abd8033768b7997c49c54c47313626f091a37
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Apr 27 22:50:39 2022 +0200

    Bandaged: progress.

diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java b/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
index 96e9d42e..37a414dc 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
@@ -65,36 +65,6 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
    static final float SCREEN_RATIO = 0.5f;
    static final float OBJECT_SIZE  = 3.0f;
 
-   private final float[][] POSITIONS = new float[][]
-        {
-          {-1,  1,  1},
-          {-1,  1,  0},
-          {-1,  1, -1},
-          {-1,  0,  1},
-          {-1,  0,  0},
-          {-1,  0, -1},
-          {-1, -1,  1},
-          {-1, -1,  0},
-          {-1, -1, -1},
-          { 0, -1,  1},
-          { 0, -1,  0},
-          { 0,  1,  1},
-          { 0,  1,  0},
-          { 0,  1, -1},
-          { 0,  0,  1},
-          { 0,  0, -1},
-          { 1,  1,  1},
-          { 1,  1,  0},
-          { 1,  1, -1},
-          { 1,  0,  1},
-          { 1,  0,  0},
-          { 1, -1,  1},
-          { 1,  0, -1},
-          { 1, -1, -1},
-          { 1, -1,  0},
-          { 0, -1, -1},
-        };
-
    private final BandagedCreatorView mView;
    private final DistortedScreen mScreen;
    private final Static3D mScale;
@@ -105,7 +75,7 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
    private long mStartTime;
    private float mScaleValue;
    private float mQuatX, mQuatY, mQuatZ, mQuatW;
-   private int mX, mY, mZ;
+   private int mX, mY, mZ, mNumCubits;
    private boolean mResetQuats, mSetQuatT, mResettingObject, mConnectingCubits;
    private int mIndex1, mIndex2;
    private int mSaveIcon;
@@ -155,19 +125,31 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
      return false;
      }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private int computeNumCubits(int x, int y, int z)
+     {
+     return ( x<=1 || y<=1 || z<=1 ) ? x*y*z : x*y*z-(x-2)*(y-2)*(z-2);
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    private void createCubits()
      {
      android.util.Log.e("D", "creating cubits : "+mX+" "+mY+" "+mZ);
 
-     int len = POSITIONS.length;
-     mCubits = new BandagedCubit[len];
+     mCubits = new BandagedCubit[mNumCubits];
+     int c=0;
 
-     for(int c=0; c<len; c++)
-       {
-       mCubits[c] = new BandagedCubit(POSITIONS[c],mQuatT,mQuatA,mScale,false);
-       }
+     for(int x=0; x<mX; x++)
+       for(int y=0; y<mY; y++)
+          for(int z=0; z<mZ; z++)
+            if( x==0 || x==mX-1 || y==0 || y==mY-1 || z==0 || z==mZ-1 )
+              {
+              float[] pos = new float[] { 0.5f*(1-mX)+x,0.5f*(1-mY)+y,0.5f*(1-mZ)+z };
+              mCubits[c] = new BandagedCubit(pos,mX,mY,mZ,mQuatT,mQuatA,mScale,false);
+              c++;
+              }
 
      mView.setCubits(mCubits);
      }
@@ -178,9 +160,7 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
      {
      mView.resetCubits();
 
-     int len = POSITIONS.length;
-
-     for(int c=0; c<len; c++)
+     for(int c=0; c<mNumCubits; c++)
        {
        if( !mCubits[c].isAttached() )
          {
@@ -265,10 +245,9 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
       mScaleValue = width<height ? Q*width : Q*height;
 
       mScreen.detachAll();
-      int len = POSITIONS.length;
       int touched = mView.getTouched();
 
-      for(int i=0; i<len; i++)
+      for(int i=0; i<mNumCubits; i++)
         if( mCubits[i].isAttached() )
           {
           mCubits[i].scaleMove(mScaleValue);
@@ -386,16 +365,15 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
 
    public void saveObject()
      {
-     int len = POSITIONS.length;
      int numAttached=0;
 
-     for(int i=0; i<len; i++)
+     for(int i=0; i<mNumCubits; i++)
        if( mCubits[i].isAttached() ) numAttached++;
 
      float[][] pos = new float[numAttached][];
      int attached=0;
 
-     for(int i=0; i<len; i++)
+     for(int i=0; i<mNumCubits; i++)
        if( mCubits[i].isAttached() )
          {
          pos[attached++] = mCubits[i].getPosition();
@@ -545,16 +523,16 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
        mX = x;
        mY = y;
        mZ = z;
+       mNumCubits = computeNumCubits(mX,mY,mZ);
 
        if( mCubitsCreated )
          {
          createCubits();
 
          mScreen.detachAll();
-         int len = POSITIONS.length;
          mView.resetCubits();
 
-         for(int i=0; i<len; i++)
+         for(int i=0; i<mNumCubits; i++)
            {
            mCubits[i].scaleMove(mScaleValue);
            DistortedNode node = mCubits[i].getNode();
diff --git a/src/main/java/org/distorted/bandaged/BandagedCubit.java b/src/main/java/org/distorted/bandaged/BandagedCubit.java
index 869c1cfc..00cb864a 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCubit.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCubit.java
@@ -59,6 +59,7 @@ public class BandagedCubit
     private final DistortedEffects mEffects;
     private final Static3D mMove;
     private final boolean mRoundCorners;
+    private final int mX, mY, mZ;
 
     private float mUnscaledX, mUnscaledY, mUnscaledZ;
     private float[] mPosition;
@@ -163,8 +164,12 @@ public class BandagedCubit
 // PUBLIC API
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public BandagedCubit(float[] position, Static4D quat1, Static4D quat2, Static3D scale, boolean roundCorners)
+    public BandagedCubit(float[] position, int x, int y, int z, Static4D quat1,
+                         Static4D quat2, Static3D scale, boolean roundCorners)
       {
+      mX = x;
+      mY = y;
+      mZ = z;
       mRoundCorners = roundCorners;
       mPosition = position;
       mIsAttached = true;
@@ -174,7 +179,7 @@ public class BandagedCubit
       mMove = new Static3D(0,0,0);
 
       FactoryBandagedCubit factory = FactoryBandagedCubit.getInstance();
-      MeshBase mesh = factory.createMesh(mPosition,false,mRoundCorners);
+      MeshBase mesh = factory.createMesh(mPosition,mX,mY,mZ,false,mRoundCorners);
 
       DistortedTexture texture = new DistortedTexture();
       if( mBitmap==null ) createBitmap();
@@ -212,7 +217,7 @@ public class BandagedCubit
       mPosition = tmpPosition;
 
       FactoryBandagedCubit factory = FactoryBandagedCubit.getInstance();
-      MeshBase mesh = factory.createMesh(mPosition,false,mRoundCorners);
+      MeshBase mesh = factory.createMesh(mPosition,mX,mY,mZ,false,mRoundCorners);
       resetTextureMaps(mesh);
       mNode.setMesh(mesh);
       mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
@@ -234,7 +239,7 @@ public class BandagedCubit
       computeMove(mPosition);
 
       FactoryBandagedCubit factory = FactoryBandagedCubit.getInstance();
-      MeshBase mesh = factory.createMesh(mPosition,false,mRoundCorners);
+      MeshBase mesh = factory.createMesh(mPosition,mX,mY,mZ,false,mRoundCorners);
       resetTextureMaps(mesh);
       mNode.setMesh(mesh);
       mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
