commit 1ad1c158e5eb375be26fdb7e043a4c0818253326
Author: leszek <leszek@koltunski.pl>
Date:   Fri Jul 21 23:19:02 2023 +0200

    Initial support for scrambling a bandaged pyraminx.

diff --git a/src/main/java/org/distorted/library/mesh/MeshMultigon.java b/src/main/java/org/distorted/library/mesh/MeshMultigon.java
index 119010c..2d6be59 100644
--- a/src/main/java/org/distorted/library/mesh/MeshMultigon.java
+++ b/src/main/java/org/distorted/library/mesh/MeshMultigon.java
@@ -305,13 +305,43 @@ public class MeshMultigon extends MeshBase
       int outerL = belongsToOuter(vL[0],vL[1]);
       int outerR = belongsToOuter(vR[0],vR[1]);
 
-      float[] vl = mOuterVectors[outerL];
-      float[] vr = mOuterVectors[outerR];
+      if( outerL>=0 && outerR>=0 )
+        {
+        float[] vl =mOuterVectors[outerL];
+        normL[0] = -vl[0];
+        normL[1] = -vl[1];
+        float[] vr =mOuterVectors[outerR];
+        normR[0] = -vr[0];
+        normR[1] = -vr[1];
+        }
+      else
+        {
+        int eupp = edges[prev];
+        int eupn = edges[next];
 
-      normL[0] = -vl[0];
-      normL[1] = -vl[1];
-      normR[0] = -vr[0];
-      normR[1] = -vr[1];
+        if( eupp<0 )
+          {
+          normL[0]=vL[0]-vT[0];
+          normL[1]=vL[1]-vT[1];
+          }
+        else
+          {
+          normL[0]= v[2*curr  ] - v[2*prev  ];
+          normL[1]= v[2*curr+1] - v[2*prev+1];
+          }
+
+        if( eupn<0 )
+          {
+          normR[0]=vR[0]-vT[0];
+          normR[1]=vR[1]-vT[1];
+          }
+        else
+          {
+          int nnxt= next==len-1 ? 0 : next+1;
+          normR[0]= v[2*next  ] - v[2*nnxt  ];
+          normR[1]= v[2*next+1] - v[2*nnxt+1];
+          }
+        }
 
       return MeshBandedTriangle.MODE_NORMAL;
       }
@@ -338,14 +368,24 @@ public class MeshMultigon extends MeshBase
       else
         {
         int outerT = belongsToOuter(vT[0],vT[1]);
-        float[] vt = mOuterVectors[outerT];
-        float dx = vt[0];
-        float dy = vt[1];
-
-        normL[0]=dx;
-        normL[1]=dy;
-        normR[0]=dx;
-        normR[1]=dy;
+
+        if( outerT>=0 )
+          {
+          float[] vt =mOuterVectors[outerT];
+          normL[0]= vt[0];
+          normL[1]= vt[1];
+          normR[0]= vt[0];
+          normR[1]= vt[1];
+          }
+        else
+          {
+          float dx = v[2*next  ]-v[2*curr  ];
+          float dy = v[2*next+1]-v[2*curr+1];
+          normL[0]= dx;
+          normL[1]= dy;
+          normR[0]= dx;
+          normR[1]= dy;
+          }
 
         return MeshBandedTriangle.MODE_INVERTED;
         }
