use transpose of inverse for transforming normals

Change-Id: I16d5167dcaed215a8009225765cd53c3620790dc
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/265338
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/samplecode/Sample3D.cpp b/samplecode/Sample3D.cpp
index 0108741..b5ffcf7 100644
--- a/samplecode/Sample3D.cpp
+++ b/samplecode/Sample3D.cpp
@@ -510,6 +510,7 @@
             in fragmentProcessor bump_map;
 
             uniform float4x4 localToWorld;
+            uniform float4x4 localToWorldAdjInv;
             uniform float3   lightPos;
 
             float convert_bump_to_delta(float bump) {
@@ -524,14 +525,14 @@
 
                 float3 plane_pos = (localToWorld * float4(x, y, 0, 1)).xyz;
 
-                float3 plane_norm = (localToWorld * float4(
+                float3 plane_norm = (localToWorldAdjInv * float4(
                      convert_bump_to_delta(bmp.r),
                      convert_bump_to_delta(bmp.g),
                      1, 0)).xyz;
                 plane_norm = normalize(plane_norm);
 
                 float3 light_dir = normalize(lightPos - plane_pos);
-                float ambient = 0.4;
+                float ambient = 0.1;
                 float dp = dot(plane_norm, light_dir);
                 float scale = min(ambient + max(dp, 0), 2);
 
@@ -564,11 +565,19 @@
             return;
         }
 
+        auto adj_inv = [](const SkM44& m) {
+            SkM44 inv;
+            SkAssertResult(m.invert(&inv));
+            return inv.transpose();
+        };
+
         struct Uniforms {
             SkM44  fLocalToWorld;
+            SkM44  fLocalToWorldAdjInv;
             SkV3   fLightPos;
         } uni;
         uni.fLocalToWorld = canvas->experimental_getLocalToWorld();
+        uni.fLocalToWorldAdjInv = adj_inv(uni.fLocalToWorld);
         uni.fLightPos     = {fLight.fPos.x, fLight.fPos.y, fLight.fPos.z};
         sk_sp<SkData> data = SkData::MakeWithCopy(&uni, sizeof(uni));
         sk_sp<SkShader> children[] = { fImgShader, fBmpShader };