commit be42e9899a040bee95b87ad8014dd2411e822e6c
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun Aug 2 23:41:45 2020 +0100

    Fix modifications of normals in VertexEffectScale and VertexEffectShear.

diff --git a/src/main/java/org/distorted/library/effect/VertexEffectScale.java b/src/main/java/org/distorted/library/effect/VertexEffectScale.java
index 4f41413..b6b5bb5 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectScale.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectScale.java
@@ -47,7 +47,13 @@ public class VertexEffectScale extends VertexEffect
 
   static String code()
     {
-    return "v *= vUniforms[effect].xyz;";
+    return
+
+    "v *= vUniforms[effect].xyz;                        \n" +
+    "float X = vUniforms[effect].y*vUniforms[effect].z; \n" +
+    "float Y = vUniforms[effect].x*vUniforms[effect].z; \n" +
+    "float Z = vUniforms[effect].x*vUniforms[effect].y; \n" +
+    "n *= vec3(X,Y,Z);                                  \n";
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/effect/VertexEffectShear.java b/src/main/java/org/distorted/library/effect/VertexEffectShear.java
index c0cabfb..f32c9cf 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectShear.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectShear.java
@@ -45,47 +45,43 @@ public class VertexEffectShear extends VertexEffect
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
+// For explanation (esp. about the way we modify vectors n and i) see MatrixEffectShear.
 
   static String code()
     {
     return
 
-      "float sx = vUniforms[effect].x;               \n"
-    + "float sy = vUniforms[effect].y;               \n"
-    + "float sz = vUniforms[effect].z;               \n"
-    + "vec3 center = vUniforms[effect+1].yzw;        \n"
+      "float sx = vUniforms[effect].x;                  \n"
+    + "float sy = vUniforms[effect].y;                  \n"
+    + "float sz = vUniforms[effect].z;                  \n"
+    + "vec3 center = vUniforms[effect+1].yzw;           \n"
+    + "float tmp   = sx*sy + 1.0;                       \n"
 
-    + "v -= center;                                  \n"
+    + "v -= center;                                     \n"
 
-    + "float new_vx = (1.0+sx*sy)*v.x + sx*v.y;      \n"
-    + "float new_vy = sy*v.x + v.y;                  \n"
-    + "float new_vz = sz*v.y + v.z;                  \n"
+    + "float new_vx = tmp*v.x + sx*v.y;                 \n"
+    + "float new_vy = sy*v.x + v.y;                     \n"
+    + "float new_vz = sz*v.y + v.z;                     \n"
 
-    + "v.x = new_vx;                                 \n"
-    + "v.y = new_vy;                                 \n"
-    + "v.z = new_vz;                                 \n"
+    + "v.x = new_vx;                                    \n"
+    + "v.y = new_vy;                                    \n"
+    + "v.z = new_vz;                                    \n"
 
-    + "v += center;                                  \n"
+    + "v += center;                                     \n"
 
-    + "float new_nx = (1.0+sx*sy)*n.x + sx*n.y;      \n"
-    + "float new_ny = sy*n.x + n.y;                  \n"
-    + "float new_nz = sz*n.y + n.z;                  \n"
+    + "float new_nx = n.x - sy*n.y + sy*sz*n.z;         \n"
+    + "float new_ny =-sx*n.x + tmp*(n.y - sz*n.z);      \n"
+    + "n.x = new_nx;                                    \n"
+    + "n.y = new_ny;                                    \n"
 
-    + "n.x = new_nx;                                 \n"
-    + "n.y = new_ny;                                 \n"
-    + "n.z = new_nz;                                 \n"
+    + "#ifdef PREAPPLY                                  \n"
 
-    + "#ifdef PREAPPLY                               \n"
+    + "float new_ix = inf.x - sy*inf.y + sy*sz*inf.z;   \n"
+    + "float new_iy =-sx*inf.x + tmp*(inf.y - sz*inf.z);\n"
+    + "inf.x = new_ix;                                  \n"
+    + "inf.y = new_iy;                                  \n"
 
-    + "float new_ix = (1.0+sx*sy)*inf.x + sx*inf.y;  \n"
-    + "float new_iy = sy*inf.x + inf.y;              \n"
-    + "float new_iz = sz*inf.y + inf.z;              \n"
-
-    + "inf.x = new_ix;                               \n"
-    + "inf.y = new_iy;                               \n"
-    + "inf.z = new_iz;                               \n"
-
-    + "#endif                                        \n";
+    + "#endif                                           \n";
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
