commit 1af8e1433447148965b5f7cf9e8915d69cfa209b
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Jun 13 15:52:10 2020 +0100

    Reading a mesh from the .dmesh file might work now. Checked on two small meshes.

diff --git a/src/main/java/org/distorted/examples/meshfile/MeshFileActivity.java b/src/main/java/org/distorted/examples/meshfile/MeshFileActivity.java
index 6efb570..c40d302 100644
--- a/src/main/java/org/distorted/examples/meshfile/MeshFileActivity.java
+++ b/src/main/java/org/distorted/examples/meshfile/MeshFileActivity.java
@@ -34,7 +34,7 @@ import org.distorted.library.main.DistortedLibrary;
 
 public class MeshFileActivity extends Activity implements AdapterView.OnItemSelectedListener
 {
-    private String mName;
+    private int mResource;
     private String[] mNames = new String[] { "deferredjob",
                                              "meshjoin"   ,
                                              "predeform"  ,
@@ -101,7 +101,7 @@ public class MeshFileActivity extends Activity implements AdapterView.OnItemSele
       MeshFileSurfaceView view = this.findViewById(R.id.meshfileSurfaceView);
       MeshFileRenderer renderer = view.getRenderer();
 
-      renderer.open(mName);
+      renderer.open(mResource);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -110,7 +110,23 @@ public class MeshFileActivity extends Activity implements AdapterView.OnItemSele
       {
       if( parent.getId()==R.id.meshfileSpinner )
         {
-        mName = mNames[pos];
+        switch(pos)
+          {
+          case  0: mResource = R.raw.deferredjob; break;
+          //case  1: mResource = R.raw.meshjoin   ; break;
+          case  2: mResource = R.raw.predeform  ; break;
+          /*
+          case  3: mResource = R.raw.singlemesh ; break;
+          case  4: mResource = R.raw.cube2      ; break;
+          case  5: mResource = R.raw.cube3      ; break;
+          case  6: mResource = R.raw.cube4      ; break;
+          case  7: mResource = R.raw.cube5      ; break;
+          case  8: mResource = R.raw.pyra3      ; break;
+          case  9: mResource = R.raw.pyra4      ; break;
+          case 10: mResource = R.raw.pyra5      ; break;
+
+           */
+          }
         }
       }
 
diff --git a/src/main/java/org/distorted/examples/meshfile/MeshFileRenderer.java b/src/main/java/org/distorted/examples/meshfile/MeshFileRenderer.java
index 7f8c588..8f037d9 100644
--- a/src/main/java/org/distorted/examples/meshfile/MeshFileRenderer.java
+++ b/src/main/java/org/distorted/examples/meshfile/MeshFileRenderer.java
@@ -19,32 +19,29 @@
 
 package org.distorted.examples.meshfile;
 
+import android.content.Context;
+import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.opengl.GLSurfaceView;
 
-import org.distorted.library.effect.EffectType;
-import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.effect.MatrixEffectQuaternion;
 import org.distorted.library.effect.MatrixEffectScale;
-import org.distorted.library.effect.VertexEffectDeform;
-import org.distorted.library.effect.VertexEffectMove;
-import org.distorted.library.effect.VertexEffectRotate;
-import org.distorted.library.effect.VertexEffectSink;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedLibrary;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshBase;
-import org.distorted.library.mesh.MeshJoined;
-import org.distorted.library.mesh.MeshRectangles;
-import org.distorted.library.type.Dynamic1D;
+import org.distorted.library.mesh.MeshFile;
 import org.distorted.library.type.DynamicQuat;
-import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
@@ -111,6 +108,7 @@ class MeshFileRenderer implements GLSurfaceView.Renderer
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
       if( mTexture==null ) mTexture = new DistortedTexture();
+      mTexture.setTexture( createTexture(0) );
 
       try
         {
@@ -124,10 +122,9 @@ class MeshFileRenderer implements GLSurfaceView.Renderer
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    void open(String name)
+    void open(int resourceID)
       {
-      mTexture.setTexture( createTexture(name) );
-      mMesh = createMesh(name);
+      mMesh = createMesh(resourceID);
 
       mScreen.detachAll();
       mScreen.attach(mTexture,mEffects,mMesh);
@@ -135,19 +132,69 @@ class MeshFileRenderer implements GLSurfaceView.Renderer
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private Bitmap createTexture(String name)
+    private Bitmap createTexture(int resourceID)
       {
-      // TODO
+      final int[] FACE_COLORS = new int[] { 0xffffff00, 0xff00ff00, 0xff0000ff, 0xffff0000 };
+      final int FACES=FACE_COLORS.length;
+      int SIZE = 200;
+      float STROKE = 0.05f*SIZE;
+      float OFF = STROKE/2 -1;
+      float OFF2 = 0.5f*SIZE + OFF;
+      float HEIGHT = SIZE - OFF;
+      float RADIUS = SIZE/12;
+      float ARC1_H = 0.2f*SIZE;
+      float ARC1_W = SIZE*0.5f;
+      float ARC2_W = 0.153f*SIZE;
+      float ARC2_H = 0.905f*SIZE;
+      float ARC3_W = SIZE-ARC2_W;
+
+      Bitmap result = Bitmap.createBitmap(FACES*SIZE,SIZE, Bitmap.Config.ARGB_8888);
+      Canvas canvas = new Canvas(result);
+      Paint paint = new Paint();
+      paint.setAntiAlias(true);
+      paint.setStrokeWidth(STROKE);
+
+      for(int i=0; i<FACES; i++)
+        {
+        paint.setColor(FACE_COLORS[i]);
+        paint.setStyle(Paint.Style.FILL);
+
+        canvas.drawRect(i*SIZE,0,(i+1)*SIZE,SIZE,paint);
+
+        paint.setColor(0xff000000);
+        paint.setStyle(Paint.Style.STROKE);
+
+        canvas.drawLine(           i*SIZE, HEIGHT,  SIZE       +i*SIZE, HEIGHT, paint);
+        canvas.drawLine(      OFF +i*SIZE,   SIZE,       OFF2  +i*SIZE,      0, paint);
+        canvas.drawLine((SIZE-OFF)+i*SIZE,   SIZE, (SIZE-OFF2) +i*SIZE,      0, paint);
+
+        canvas.drawArc( ARC1_W-RADIUS+i*SIZE, ARC1_H-RADIUS, ARC1_W+RADIUS+i*SIZE, ARC1_H+RADIUS, 225, 90, false, paint);
+        canvas.drawArc( ARC2_W-RADIUS+i*SIZE, ARC2_H-RADIUS, ARC2_W+RADIUS+i*SIZE, ARC2_H+RADIUS, 105, 90, false, paint);
+        canvas.drawArc( ARC3_W-RADIUS+i*SIZE, ARC2_H-RADIUS, ARC3_W+RADIUS+i*SIZE, ARC2_H+RADIUS, 345, 90, false, paint);
+        }
 
-      return null;
+      return result;
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private MeshBase createMesh(String name)
+    private MeshBase createMesh(int resourceID)
       {
-      // TODO
+      Context con = mView.getContext();
+      Resources res = con.getResources();
+      InputStream is = res.openRawResource(resourceID);
+      DataInputStream dos = new DataInputStream(is);
+      MeshBase mesh = new MeshFile(dos);
+
+      try
+        {
+        is.close();
+        }
+      catch(IOException e)
+        {
+        android.util.Log.e("meshFile", "Error closing InputStream: "+e.toString());
+        }
 
-      return null;
+      return mesh;
       }
 }
