commit 217096bfa191a8a1b8ab9d79c7945726140dc782
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Apr 22 14:54:26 2022 +0200

    BandagedCreator: colorful cube.

diff --git a/src/main/java/org/distorted/bandaged/BandagedCubit.java b/src/main/java/org/distorted/bandaged/BandagedCubit.java
index ab4bfbb6..3ace7459 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCubit.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCubit.java
@@ -19,22 +19,38 @@
 
 package org.distorted.bandaged;
 
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
 import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.effect.MatrixEffectQuaternion;
 import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedNode;
 import org.distorted.library.main.DistortedTexture;
+import org.distorted.library.main.QuatHelper;
 import org.distorted.library.mesh.MeshBase;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 import org.distorted.objectlib.helpers.FactoryBandaged3x3Cubit;
+import org.distorted.objectlib.helpers.FactoryCubit;
+
+import static org.distorted.objectlib.main.TwistyObject.COLOR_BLUE;
+import static org.distorted.objectlib.main.TwistyObject.COLOR_GREEN;
+import static org.distorted.objectlib.main.TwistyObject.COLOR_ORANGE;
+import static org.distorted.objectlib.main.TwistyObject.COLOR_RED;
+import static org.distorted.objectlib.main.TwistyObject.COLOR_WHITE;
+import static org.distorted.objectlib.main.TwistyObject.COLOR_YELLOW;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public class BandagedCubit
 {
     private static final Static3D CENTER = new Static3D(0,0,0);
+    private static Bitmap mBitmap;
+    private static Static4D[] mTextureMaps;
+    private static float[] mTmp = new float[4];
 
     private final DistortedNode mNode;
     private final DistortedTexture mTexture;
@@ -45,6 +61,79 @@ public class BandagedCubit
     private float[] mPosition;
     private boolean mIsAttached;
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private static void createBitmap()
+      {
+      final int[] FACE_COLORS = new int[]
+         {
+           COLOR_YELLOW, COLOR_WHITE,
+           COLOR_BLUE  , COLOR_GREEN,
+           COLOR_RED   , COLOR_ORANGE
+         };
+      final int NUM = FACE_COLORS.length;
+      final int SIZE= 32;
+
+      mTextureMaps = new Static4D[NUM];
+
+      Paint paint = new Paint();
+      paint.setStyle(Paint.Style.FILL);
+      mBitmap = Bitmap.createBitmap( NUM*SIZE, SIZE, Bitmap.Config.ARGB_4444);
+      Canvas canvas = new Canvas(mBitmap);
+
+      for(int color=0; color<NUM; color++)
+        {
+        paint.setColor(FACE_COLORS[color]);
+        canvas.drawRect(color*SIZE, 0, (color+1)*SIZE, SIZE, paint);
+        mTextureMaps[color] = new Static4D( ((float)color)/NUM, 0.0f, 1.0f/NUM, 1.0f );
+        }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// (x,y,z) ==
+//
+// ( 1,0,0) --> 0
+// (-1,0,0) --> 1
+// (0, 1,0) --> 2
+// (0,-1,0) --> 3
+// (0,0, 1) --> 4
+// (0,0,-1) --> 5
+
+    private int computeMapsIndex(float x, float y, float z)
+      {
+      int ix = x>0 ? (int)(x+0.5f) : (int)(x-0.5f);
+      int iy = y>0 ? (int)(y+0.5f) : (int)(y-0.5f);
+      int iz = z>0 ? (int)(z+0.5f) : (int)(z-0.5f);
+
+      if( ix== 1 ) return 0;
+      if( ix==-1 ) return 1;
+      if( iy== 1 ) return 2;
+      if( iy==-1 ) return 3;
+      if( iz== 1 ) return 4;
+      if( iz==-1 ) return 5;
+
+      return 0;
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private void resetTextureMaps(MeshBase mesh)
+      {
+      FactoryCubit fact = FactoryCubit.getInstance();
+      int numComponents = mesh.getNumTexComponents();
+      Static4D[] maps = new Static4D[numComponents];
+
+      for(int i=0; i<numComponents; i++)
+        {
+        Static4D q = fact.getQuaternion(i);
+        QuatHelper.rotateVectorByQuat(mTmp,0,0,1,0,q);
+        int index = computeMapsIndex(mTmp[0], mTmp[1], mTmp[2]);
+        maps[i] = mTextureMaps[index];
+        }
+
+      mesh.setTextureMap(maps,0);
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     private void computeMove(float[] position)
@@ -83,7 +172,10 @@ public class BandagedCubit
       MeshBase mesh = factory.createMesh(mPosition,false,mRoundCorners);
 
       mTexture = new DistortedTexture();
-      mTexture.setColorARGB(color);
+      if( mBitmap==null ) createBitmap();
+      mTexture.setTextureAlreadyInverted(mBitmap);
+
+      resetTextureMaps(mesh);
 
       MatrixEffectScale scaleEffect = new MatrixEffectScale(scale);
       MatrixEffectQuaternion quat1Effect = new MatrixEffectQuaternion(quat1, CENTER);
@@ -116,6 +208,7 @@ public class BandagedCubit
 
       FactoryBandaged3x3Cubit factory = FactoryBandaged3x3Cubit.getInstance();
       MeshBase mesh = factory.createMesh(mPosition,false,mRoundCorners);
+      resetTextureMaps(mesh);
       mNode.setMesh(mesh);
       mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
       }
@@ -152,7 +245,7 @@ public class BandagedCubit
 
     public void setTexture(int color)
       {
-      mTexture.setColorARGB(color);
+   //   mTexture.setColorARGB(color);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
