commit 5d5ed37656e8a19db927102aa9fd2ec598623a90
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Apr 9 23:21:53 2022 +0200

    On OpenGL ES 3.0, some drivers are veeeery slow linking a program which includes transform feedback - and such program is needed to apply vertex effects to meshes - which is needed to round corners of puzzle cubits.
    
    Thus on 3.0 we switch off rounding corners of the meshes in the Creator mode, otherwise we'd need to wait about 24 seconds for the screen to appear!

diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java b/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
index 1df08e53..8af82ec8 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
@@ -100,9 +100,9 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
    private final BandagedCreatorView mView;
    private final DistortedScreen mScreen;
    private final Static3D mScale;
-   private final BandagedCubit[] mCubits;
    private final Static4D mQuatT, mQuatA;
 
+   private BandagedCubit[] mCubits;
    private boolean mInitialPhase;
    private long mStartTime;
    private float mScaleValue;
@@ -130,7 +130,6 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
      mScreen = new DistortedScreen();
      mScreen.glClearColor(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS, 1.0f);
      mScale = new Static3D(1,1,1);
-     mCubits= createCubits();
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -157,12 +156,13 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
 
    private BandagedCubit[] createCubits()
      {
+     boolean roundCorners = DistortedLibrary.getGLSL()>300;
      int len = POSITIONS.length;
      BandagedCubit[] cubits = new BandagedCubit[len];
 
      for(int c=0; c<len; c++)
        {
-       cubits[c] = new BandagedCubit(POSITIONS[c],mQuatT,mQuatA,mScale,COLOR_DEFAULT);
+       cubits[c] = new BandagedCubit(POSITIONS[c],mQuatT,mQuatA,mScale,COLOR_DEFAULT,roundCorners);
        }
 
      return cubits;
@@ -284,6 +284,9 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
 
       DistortedLibrary.onSurfaceCreated(mView.getContext(),this,1);
       DistortedLibrary.setCull(true);
+
+      mCubits= createCubits();
+      mView.setCubits(mCubits);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorTouchControl.java b/src/main/java/org/distorted/bandaged/BandagedCreatorTouchControl.java
index 7644a32f..3a35c21a 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorTouchControl.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorTouchControl.java
@@ -32,14 +32,15 @@ public class BandagedCreatorTouchControl
   private static final float DIST2D = 0.5f;
 
   private final Static4D CAMERA_POINT;
-  private final BandagedCubit[] mCubits;
-  private final int mNumCubits;
   private final float[] mPoint, mCamera, mTouch, mPos;
   private final float[] mPoint2D;
   private float mObjectRatio;
-  private int mLastTouchedFace;
   private final Static3D[] mFaceAxis;
 
+  private BandagedCubit[] mCubits;
+  private int mNumCubits;
+  private int mLastTouchedFace;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private boolean isInsideFace(float[] p)
@@ -207,10 +208,8 @@ public class BandagedCreatorTouchControl
 // PUBLIC API
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public BandagedCreatorTouchControl(BandagedCubit[] cubits, float ratio, float fov)
+  public BandagedCreatorTouchControl(float ratio, float fov)
     {
-    mCubits = cubits;
-    mNumCubits = cubits.length;
     mPoint = new float[3];
     mCamera= new float[3];
     mTouch = new float[3];
@@ -226,6 +225,14 @@ public class BandagedCreatorTouchControl
     CAMERA_POINT = new Static4D(0,0,dist,0);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void setCubits(BandagedCubit[] cubits)
+    {
+    mCubits = cubits;
+    mNumCubits = cubits.length;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void setObjectRatio(float ratio)
diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorView.java b/src/main/java/org/distorted/bandaged/BandagedCreatorView.java
index 9edaa004..8b082b11 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorView.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorView.java
@@ -61,9 +61,8 @@ public class BandagedCreatorView extends GLSurfaceView
         {
         BandagedCreatorActivity act = (BandagedCreatorActivity)context;
         mRenderer = new BandagedCreatorRenderer(this);
-        BandagedCubit[] cubits = mRenderer.getCubits();
         DistortedScreen screen = mRenderer.getScreen();
-        mTouchControl = new BandagedCreatorTouchControl(cubits, BandagedCreatorRenderer.SCREEN_RATIO, screen.getFOV() );
+        mTouchControl = new BandagedCreatorTouchControl(BandagedCreatorRenderer.SCREEN_RATIO, screen.getFOV() );
 
         final ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
 
@@ -107,6 +106,13 @@ public class BandagedCreatorView extends GLSurfaceView
       return mRenderer;
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void setCubits(BandagedCubit[] cubits)
+      {
+      mTouchControl.setCubits(cubits);
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void resetCubits()
diff --git a/src/main/java/org/distorted/bandaged/BandagedCubit.java b/src/main/java/org/distorted/bandaged/BandagedCubit.java
index b52f0e54..ab4bfbb6 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCubit.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCubit.java
@@ -38,8 +38,8 @@ public class BandagedCubit
 
     private final DistortedNode mNode;
     private final DistortedTexture mTexture;
-    private final DistortedEffects mEffects;
     private final Static3D mMove;
+    private final boolean mRoundCorners;
 
     private float mUnscaledX, mUnscaledY, mUnscaledZ;
     private float[] mPosition;
@@ -70,8 +70,9 @@ public class BandagedCubit
 // PUBLIC API
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public BandagedCubit(float[] position, Static4D quat1, Static4D quat2, Static3D scale, int color)
+    public BandagedCubit(float[] position, Static4D quat1, Static4D quat2, Static3D scale, int color, boolean roundCorners)
       {
+      mRoundCorners = roundCorners;
       mPosition = position;
       mIsAttached = true;
 
@@ -79,7 +80,7 @@ public class BandagedCubit
       mMove = new Static3D(0,0,0);
 
       FactoryBandaged3x3Cubit factory = FactoryBandaged3x3Cubit.getInstance();
-      MeshBase mesh = factory.createMesh(mPosition,false);
+      MeshBase mesh = factory.createMesh(mPosition,false,mRoundCorners);
 
       mTexture = new DistortedTexture();
       mTexture.setColorARGB(color);
@@ -89,13 +90,13 @@ public class BandagedCubit
       MatrixEffectQuaternion quat2Effect = new MatrixEffectQuaternion(quat2, CENTER);
       MatrixEffectMove moveEffect = new MatrixEffectMove(mMove);
 
-      mEffects = new DistortedEffects();
-      mEffects.apply(scaleEffect);
-      mEffects.apply(moveEffect);
-      mEffects.apply(quat2Effect);
-      mEffects.apply(quat1Effect);
+      DistortedEffects effects = new DistortedEffects();
+      effects.apply(scaleEffect);
+      effects.apply(moveEffect);
+      effects.apply(quat2Effect);
+      effects.apply(quat1Effect);
 
-      mNode = new DistortedNode(mTexture,mEffects,mesh);
+      mNode = new DistortedNode(mTexture,effects,mesh);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -114,7 +115,7 @@ public class BandagedCubit
       mPosition = tmpPosition;
 
       FactoryBandaged3x3Cubit factory = FactoryBandaged3x3Cubit.getInstance();
-      MeshBase mesh = factory.createMesh(mPosition,false);
+      MeshBase mesh = factory.createMesh(mPosition,false,mRoundCorners);
       mNode.setMesh(mesh);
       mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
       }
@@ -135,7 +136,7 @@ public class BandagedCubit
       computeMove(mPosition);
 
       FactoryBandaged3x3Cubit factory = FactoryBandaged3x3Cubit.getInstance();
-      MeshBase mesh = factory.createMesh(mPosition,false);
+      MeshBase mesh = factory.createMesh(mPosition,false,mRoundCorners);
       mNode.setMesh(mesh);
       mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
       }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogAbout.java b/src/main/java/org/distorted/dialogs/RubikDialogAbout.java
index 0ee8aef1..4a7484a2 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogAbout.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogAbout.java
@@ -104,9 +104,13 @@ public class RubikDialogAbout extends AppCompatDialogFragment
       {
       text4.setVisibility(View.GONE);
       /*
-      text4.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
       String version = DistortedLibrary.getDriverVersion();
-      text4.setText(version);
+      String vendor  = DistortedLibrary.getDriverVendor();
+      String renderer= DistortedLibrary.getDriverRenderer();
+
+      String mess = "Version: " + version + "\nVendor: "+vendor+"\nRenderer: "+renderer;
+      text4.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
+      text4.setText(mess);
       */
       }
 
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index f20d0b82..8a89b179 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -66,18 +66,13 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
   public static final int NUM_COLUMNS  = 5;
   public static final int LEVELS_SHOWN = 10;
 
-  private static final int[] BUTTON_LABELS_FULL = { R.string.scores,
-                                                    R.string.patterns,
-                                                    R.string.solver,
-                                                    R.string.tutorials,
-                                                    R.string.bandaged,
-                                                    R.string.about };
-
-  private static final int[] BUTTON_LABELS_LEAN = { R.string.scores,
-                                                    R.string.patterns,
-                                                    R.string.solver,
-                                                    R.string.tutorials,
-                                                    R.string.about };
+  private static final int[] BUTTON_LABELS = { R.string.scores,
+                                               R.string.patterns,
+                                               R.string.solver,
+                                               R.string.tutorials,
+                                               R.string.bandaged,
+                                               R.string.about };
+  private static final int NUM_BUTTONS = BUTTON_LABELS.length;
 
   private static final float LAST_BUTTON = 1.5f;
   private static final int[] mLocation = new int[2];
@@ -96,8 +91,6 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
   private int mBottomHeight;
   private float mScreenWidth;
   private WeakReference<RubikActivity> mWeakAct;
-  private boolean mDisplayBandaged;
-  private int mNumButtons;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -110,9 +103,6 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
 
   void enterScreen(final RubikActivity act)
     {
-    mDisplayBandaged = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;
-    mNumButtons = mDisplayBandaged ? BUTTON_LABELS_FULL.length : BUTTON_LABELS_LEAN.length;
-
     mWeakAct = new WeakReference<>(act);
     int numObjects = RubikObjectList.getNumObjects();
     mScreenWidth = act.getScreenWidthInPixels();
@@ -403,18 +393,16 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
     int padding = (int)(width*RubikActivity.PADDING);
 
     mMenuLayoutWidth = (int)(width/2);
-    mMenuLayoutHeight= (int)(2*margin + mNumButtons*(mMenuItemSize+margin));
+    mMenuLayoutHeight= (int)(2*margin + NUM_BUTTONS*(mMenuItemSize+margin));
 
     LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( mMenuLayoutWidth - 2*padding, (int)mMenuItemSize);
 
-    int[] labels = mDisplayBandaged ? BUTTON_LABELS_FULL : BUTTON_LABELS_LEAN;
-
-    for(int i=0; i<mNumButtons; i++)
+    for(int i=0; i<NUM_BUTTONS; i++)
       {
       final int but = i;
       Button button = new Button(act);
       button.setLayoutParams(p);
-      button.setText(labels[i]);
+      button.setText(BUTTON_LABELS[i]);
       button.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
 
       button.setOnClickListener( new View.OnClickListener()
@@ -470,11 +458,8 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
       case 3: RubikDialogTutorial tDiag = new RubikDialogTutorial();
               tDiag.show( act.getSupportFragmentManager(), RubikDialogTutorial.getDialogTag() );
               break;
-      case 4: if( mDisplayBandaged )
-                {
-                act.switchToBandagedCreator();
-                break;
-                }
+      case 4: act.switchToBandagedCreator();
+              break;
       case 5: RubikDialogAbout aDiag = new RubikDialogAbout();
               aDiag.show(act.getSupportFragmentManager(), null);
               break;
