commit b20e89d2cc25047828268df2831e0ff469dcf36e
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Oct 30 01:46:08 2021 +0200

    Move the main app to the 'J1M1' object creation mode, i.e. create them from the Json files and using the Dmesh fiels as well.
    
    Make it possible for any app descending from the 'objectlib' to use any of the J0M0, J0M1, J1M0, J1M1 modes.

diff --git a/build.gradle b/build.gradle
index 83b73979..2f056741 100644
--- a/build.gradle
+++ b/build.gradle
@@ -42,4 +42,6 @@ dependencies {
     implementation 'com.google.android.play:core:1.10.2'
     implementation 'androidx.appcompat:appcompat:1.3.1'
     implementation 'com.google.android.material:material:1.4.0'
+    implementation project(path: ':distorted-puzzle-jsons')
+    implementation project(path: ':distorted-puzzle-dmesh')
 }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogPattern.java b/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
index 00a0a860..b5a8e436 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
@@ -94,9 +94,9 @@ public class RubikDialogPattern extends AppCompatDialogFragment
 
     for(int i=0; i< RubikPatternList.NUM_OBJECTS; i++)
       {
-      ObjectType list = RubikPatternList.getObject(i);
+      ObjectType type = RubikPatternList.getObject(i);
       int iconSize    = RubikActivity.getDrawableSize();
-      int iconID      = list.getIconID(iconSize);
+      int iconID      = type.getIconID(iconSize);
 
       ImageView imageView = new ImageView(act);
       imageView.setImageResource(iconID);
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogPatternView.java b/src/main/java/org/distorted/dialogs/RubikDialogPatternView.java
index e2774513..2b0cb9d0 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogPatternView.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogPatternView.java
@@ -97,8 +97,7 @@ public class RubikDialogPatternView extends FrameLayout
         RubikPattern pattern = RubikPattern.getInstance();
         int[][] moves   = pattern.reInitialize(mTab, groupPosition, childPosition);
         ObjectType object = RubikPatternList.getObject(mTab);
-
-        control.changeObject(object);
+        ract.changeIfDifferent(object,control);
         control.initializeObject(moves);
 
         ScreenList.switchScreen(ract, ScreenList.PATT);
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index f53192db..e4acfe18 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -19,6 +19,7 @@
 
 package org.distorted.main;
 
+import java.io.InputStream;
 import java.util.Locale;
 
 import android.content.Intent;
@@ -41,6 +42,8 @@ import androidx.appcompat.app.AppCompatActivity;
 
 import com.google.firebase.analytics.FirebaseAnalytics;
 
+import org.distorted.dmesh.ObjectMesh;
+import org.distorted.jsons.ObjectJson;
 import org.distorted.library.main.DistortedLibrary;
 
 import org.distorted.objectlib.main.ObjectControl;
@@ -250,7 +253,7 @@ public class RubikActivity extends AppCompatActivity
 
       RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass();
       ObjectType object = play.getObject();
-      view.getObjectControl().changeObject(object);
+      changeIfDifferent(object,view.getObjectControl());
       
       if( mIsChinese && !mPolicyAccepted ) PrivacyPolicy();
       }
@@ -266,18 +269,18 @@ public class RubikActivity extends AppCompatActivity
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private String getAppVers()
-    {
-    try
+    private String getAppVers()
       {
-      PackageInfo pInfo = getPackageManager().getPackageInfo( getPackageName(), 0);
-      return pInfo.versionName;
-      }
-    catch (PackageManager.NameNotFoundException e)
-      {
-      return "unknown";
+      try
+        {
+        PackageInfo pInfo = getPackageManager().getPackageInfo( getPackageName(), 0);
+        return pInfo.versionName;
+        }
+      catch (PackageManager.NameNotFoundException e)
+        {
+        return "unknown";
+        }
       }
-    }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -435,42 +438,45 @@ public class RubikActivity extends AppCompatActivity
       {
       RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
       ObjectControl control = view.getObjectControl();
+      TwistyObject oldObject = control.getObject();
+      changeIfDifferent(newObject,control);
 
-      if( reportChange )
+      if( reportChange && oldObject!=null )
         {
-        TwistyObject oldObject = control.getObject();
-
-        if( oldObject!=null )
+        float fps = view.getRenderer().getFPS();
+        fps = (int)(fps+0.5f);
+        StringBuilder name = new StringBuilder();
+        name.append(oldObject.getShortName());
+        name.append(' ');
+        name.append(fps);
+        name.append(" --> ");
+        name.append(newObject.name());
+
+        if( BuildConfig.DEBUG )
           {
-          ObjectType oldType = oldObject.getObjectType();
-          float fps = view.getRenderer().getFPS();
-          fps = (int)(fps+0.5f);
-          StringBuilder name = new StringBuilder();
-          name.append(oldType.name());
-          name.append(' ');
-          name.append(fps);
-          name.append(" --> ");
-          name.append(newObject.name());
-
-          if( BuildConfig.DEBUG )
-            {
-            android.util.Log.e("rubik", name.toString());
-            }
-          else
-            {
-            FirebaseAnalytics analytics = getAnalytics();
+          android.util.Log.e("rubik", name.toString());
+          }
+        else
+          {
+          FirebaseAnalytics analytics = getAnalytics();
 
-            if( analytics!=null )
-              {
-              Bundle bundle = new Bundle();
-              bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, name.toString());
-              analytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM, bundle);
-              }
+          if( analytics!=null )
+            {
+            Bundle bundle = new Bundle();
+            bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, name.toString());
+            analytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM, bundle);
             }
           }
         }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
 
-      control.changeObject(newObject);
+    public void changeIfDifferent(ObjectType type,ObjectControl control)
+      {
+      InputStream jsonStream = ObjectJson.getStream(type,this);
+      InputStream meshStream = ObjectMesh.getStream(type,this);
+      control.changeIfDifferent(type.ordinal(),jsonStream,meshStream);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/main/RubikSurfaceView.java b/src/main/java/org/distorted/main/RubikSurfaceView.java
index 78b2ae0d..d305a71a 100644
--- a/src/main/java/org/distorted/main/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/main/RubikSurfaceView.java
@@ -108,7 +108,6 @@ public class RubikSurfaceView extends GLSurfaceView
         RubikObjectLibInterface ref = new RubikObjectLibInterface(act);
         mObjectController = new ObjectControl(act,ref);
         mRenderer = new RubikRenderer(this);
-        ObjectControl.setDmeshMode(true);
 
         final ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
 
diff --git a/src/main/java/org/distorted/screens/RubikScreenSolver.java b/src/main/java/org/distorted/screens/RubikScreenSolver.java
index 4fc3a3e6..441fcba0 100644
--- a/src/main/java/org/distorted/screens/RubikScreenSolver.java
+++ b/src/main/java/org/distorted/screens/RubikScreenSolver.java
@@ -84,8 +84,7 @@ public class RubikScreenSolver extends RubikScreenAbstract
     mSolving = false;
 
     ObjectType currentObject= ImplementedSolversList.getObject(0);
-
-    control.changeObject(currentObject);
+    act.changeIfDifferent(currentObject,control);
     control.solveOnly();
 
     RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass();
diff --git a/src/main/java/org/distorted/tutorials/TutorialActivity.java b/src/main/java/org/distorted/tutorials/TutorialActivity.java
index 19362a54..f1ccdf26 100644
--- a/src/main/java/org/distorted/tutorials/TutorialActivity.java
+++ b/src/main/java/org/distorted/tutorials/TutorialActivity.java
@@ -19,6 +19,8 @@
 
 package org.distorted.tutorials;
 
+import java.io.InputStream;
+
 import android.os.Build;
 import android.os.Bundle;
 import android.util.DisplayMetrics;
@@ -32,8 +34,9 @@ import androidx.appcompat.app.AppCompatActivity;
 
 import com.google.firebase.analytics.FirebaseAnalytics;
 
+import org.distorted.dmesh.ObjectMesh;
+import org.distorted.jsons.ObjectJson;
 import org.distorted.library.main.DistortedLibrary;
-import org.distorted.library.main.DistortedScreen;
 
 import org.distorted.objectlib.main.ObjectControl;
 import org.distorted.objectlib.main.ObjectType;
@@ -196,10 +199,10 @@ public class TutorialActivity extends AppCompatActivity
       if( mObjectOrdinal>=0 && mObjectOrdinal< ObjectType.NUM_OBJECTS )
         {
         ObjectType obj = ObjectType.getObject(mObjectOrdinal);
-        view.getObjectControl().changeObject(obj);
+        changeIfDifferent(obj,view.getObjectControl());
         }
       }
-    
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     @Override
@@ -217,6 +220,15 @@ public class TutorialActivity extends AppCompatActivity
       errDiag.show(getSupportFragmentManager(), null);
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private void changeIfDifferent(ObjectType type,ObjectControl control)
+      {
+      InputStream jsonStream = ObjectJson.getStream(type,this);
+      InputStream meshStream = ObjectMesh.getStream(type,this);
+      control.changeIfDifferent(type.ordinal(),jsonStream,meshStream);
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     TutorialScreen getState()
diff --git a/src/main/java/org/distorted/tutorials/TutorialList.java b/src/main/java/org/distorted/tutorials/TutorialList.java
index 83383850..dfd699bf 100644
--- a/src/main/java/org/distorted/tutorials/TutorialList.java
+++ b/src/main/java/org/distorted/tutorials/TutorialList.java
@@ -515,7 +515,7 @@ public enum TutorialList
 
   public int getIconID()
     {
-    int iconSize  = RubikActivity.getDrawableSize();
+    int iconSize = RubikActivity.getDrawableSize();
     return mObject.getIconID(iconSize);
     }
 
