commit ef231eba73d02267a2b9ea2c1b2fa583d073c05b
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Apr 9 00:56:26 2021 +0200

    Face cubit creation: progress, a cube rendered almost correctly :)

diff --git a/src/main/java/org/distorted/examples/meshfile/FactoryCubit.java b/src/main/java/org/distorted/examples/meshfile/FactoryCubit.java
index 46a20e3..fa688cf 100644
--- a/src/main/java/org/distorted/examples/meshfile/FactoryCubit.java
+++ b/src/main/java/org/distorted/examples/meshfile/FactoryCubit.java
@@ -262,6 +262,16 @@ class FactoryCubit
     mBuffer[0] = v1y*v2z - v2y*v1z;
     mBuffer[1] = v1z*v2x - v2z*v1x;
     mBuffer[2] = v1x*v2y - v2x*v1y;
+
+android.util.Log.e("D", " buffer: "+mBuffer[0]+" "+mBuffer[1]+" "+mBuffer[2]);
+
+
+    if( mBuffer[2]<0.0f )
+      {
+      mBuffer[0] *= -1.0f;
+      mBuffer[1] *= -1.0f;
+      mBuffer[2] *= -1.0f;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -306,6 +316,7 @@ class FactoryCubit
       }
 
     info.scale = Math.max(maxX-minX,maxY-minY);
+
     int len = vert3D.length;
     info.vertices = new float[2*len];
 
@@ -367,39 +378,45 @@ class FactoryCubit
 
     computeNormalVector(vert3D,0,1,foundIndex);
 
-    // rotate so that the normal vector becomes (0,0,1)
-    float axisX = -mBuffer[1];
-    float axisY =  mBuffer[0];
-    float axisZ = 0.0f;
-
-    float vecLen = mBuffer[0]*mBuffer[0] + mBuffer[1]*mBuffer[1] + mBuffer[2]*mBuffer[2];
-    vecLen = (float)Math.sqrt(vecLen);
-    mBuffer[0] /= vecLen;
-    mBuffer[1] /= vecLen;
-    mBuffer[2] /= vecLen;
-
-    float axiLen = axisX*axisX + axisY*axisY + axisZ*axisZ;
-    axiLen = (float)Math.sqrt(axiLen);
-    axisX /= axiLen;
-    axisY /= axiLen;
-    axisZ /= axiLen;
-
-    float cosTheta = mBuffer[2];
-    float sinTheta = axiLen / vecLen;
-
-    mQuat1[0] = axisX*sinTheta;
-    mQuat1[1] = axisY*sinTheta;
-    mQuat1[2] = axisZ*sinTheta;
-    mQuat1[3] = cosTheta;
-    mQuat2[0] = axisX*sinTheta;
-    mQuat2[1] = axisY*sinTheta;
-    mQuat2[2] = axisZ*sinTheta;
-    mQuat2[3] = -cosTheta;
-
-    for (float[] vert : vert3D)
+    if( mBuffer[0]!=0.0f || mBuffer[1]!=0.0f )
       {
-      quatMultiply(mQuat1, vert, mQuat3);
-      quatMultiply(mQuat3, mQuat2, vert);
+      // rotate so that the normal vector becomes (0,0,1)
+      float axisX = -mBuffer[1];
+      float axisY =  mBuffer[0];
+      float axisZ = 0.0f;
+
+      float vecLen = mBuffer[0]*mBuffer[0] + mBuffer[1]*mBuffer[1] + mBuffer[2]*mBuffer[2];
+      vecLen = (float)Math.sqrt(vecLen);
+      mBuffer[0] /= vecLen;
+      mBuffer[1] /= vecLen;
+      mBuffer[2] /= vecLen;
+
+      float axiLen = axisX*axisX + axisY*axisY + axisZ*axisZ;
+      axiLen = (float)Math.sqrt(axiLen);
+      axisX /= axiLen;
+      axisY /= axiLen;
+      axisZ /= axiLen;
+
+      float cosTheta = mBuffer[2];
+      //float sinTheta = axiLen / vecLen;
+
+      float sinHalfTheta = (float)Math.sqrt(0.5f*(1-cosTheta));
+      float cosHalfTheta = (float)Math.sqrt(0.5f*(1+cosTheta));
+
+      mQuat1[0] = axisX*sinHalfTheta;
+      mQuat1[1] = axisY*sinHalfTheta;
+      mQuat1[2] = axisZ*sinHalfTheta;
+      mQuat1[3] = cosHalfTheta;
+      mQuat2[0] = axisX*sinHalfTheta;
+      mQuat2[1] = axisY*sinHalfTheta;
+      mQuat2[2] = axisZ*sinHalfTheta;
+      mQuat2[3] = -cosHalfTheta;
+
+      for (float[] vert : vert3D)
+        {
+        quatMultiply(mQuat1, vert, mQuat3);
+        quatMultiply(mQuat3, mQuat2, vert);
+        }
       }
 
     // fit the whole thing in a square and remember the scale & 2D vertices
@@ -584,6 +601,26 @@ class FactoryCubit
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void printInfo(FaceInfo info)
+    {
+    android.util.Log.e("D", "vx="+info.vx+" vy="+info.vy+" vz="+info.vz);
+    android.util.Log.e("D", "qx="+info.qx+" qy="+info.qy+" qz="+info.qz+" qw="+info.qw);
+    android.util.Log.e("D", "scale="+info.scale);
+
+    String ver="";
+
+    int len = info.vertices.length/2;
+
+    for(int i =0; i<len; i++)
+      {
+      ver += ("("+info.vertices[2*i]+","+info.vertices[2*i+1]+") ");
+      }
+
+    android.util.Log.e("D", "vertices= "+ver);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   MeshBase createRoundedSolid(final float[][] vertices, final int[][] vertIndexes, final float[][] bands, final int[] bandIndexes)
