use real normal-map texture

transpose(inverse(localToWorld)) does not seem to be working, so skipping
it for now.

Change-Id: I7dd5a01020f590dec02b36f54752092643acf3d8
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/265401
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 b5ffcf7..648f2db 100644
--- a/samplecode/Sample3D.cpp
+++ b/samplecode/Sample3D.cpp
@@ -439,54 +439,6 @@
 #include "include/core/SkColorPriv.h"
 #include "include/core/SkSurface.h"
 
-static sk_sp<SkImage> make_bump(sk_sp<SkImage> src) {
-    src = src->makeRasterImage();
-
-    SkPixmap s;
-    SkAssertResult(src->peekPixels(&s));
-
-    SkImageInfo info = SkImageInfo::Make(src->width(), src->height(),
-                                         kR8G8_unorm_SkColorType, kOpaque_SkAlphaType);
-
-    size_t rb = info.minRowBytes();
-    auto data = SkData::MakeUninitialized(rb * info.height());
-    SkPixmap d = { info, data->writable_data(), rb };
-
-    const int W = src->width();
-    const int H = src->height();
-
-    for (int y = 0; y < H; ++y) {
-        int y1 = y == H-1 ? 0 : y + 1;
-        for (int x = 0; x < W; ++x) {
-            int x1 = x == W-1 ? 0 : x + 1;
-
-            auto lum = [](SkPMColor c) {
-                return SkGetPackedR32(c);
-                return (SkGetPackedR32(c) * 2 + SkGetPackedG32(c) * 5 + SkGetPackedB32(c)) >> 3;
-            };
-
-            int s00 = lum(*s.addr32(x,  y)),
-                s01 = lum(*s.addr32(x1, y)),
-                s10 = lum(*s.addr32(x, y1));
-
-            auto delta_lum_to_byte = [](int d) {
-                SkASSERT(d >= -255 && d <= 255);
-                d >>= 1;
-                if (d < 0) {
-                    d += 255;
-                }
-                SkASSERT(d >= 0 && d <= 255);
-                return d;
-            };
-
-            int dx = delta_lum_to_byte(s01 - s00);
-            int dy = delta_lum_to_byte(s10 - s00);
-            *d.writable_addr16(x, y) = (dx << 8) | dy;
-        }
-    }
-    return SkImage::MakeRasterData(info, data, rb);
-}
-
 class SampleBump3D : public Sample3DView {
     SkRRect fRR;
     LightPos fLight = {{200, 200, 800, 1}, 8};
@@ -503,38 +455,33 @@
         fRR = SkRRect::MakeRectXY({20, 20, 380, 380}, 50, 50);
         auto img = GetResourceAsImage("images/brickwork-texture.jpg");
         fImgShader = img->makeShader(SkMatrix::MakeScale(2, 2));
-        fBmpShader = make_bump(img)->makeShader(SkMatrix::MakeScale(2, 2));
+        img = GetResourceAsImage("images/brickwork_normal-map.jpg");
+        fBmpShader = img->makeShader(SkMatrix::MakeScale(2, 2));
 
         const char code[] = R"(
             in fragmentProcessor color_map;
-            in fragmentProcessor bump_map;
+            in fragmentProcessor normal_map;
 
             uniform float4x4 localToWorld;
             uniform float4x4 localToWorldAdjInv;
             uniform float3   lightPos;
 
-            float convert_bump_to_delta(float bump) {
-                if (bump > 0.5) {
-                    bump -= 1;
-                }
-                return bump * 6;
+            float3 convert_normal_sample(half4 c) {
+                float3 n = 2 * c.rgb - 1;
+                n.y = -n.y;
+                return n;
             }
 
             void main(float x, float y, inout half4 color) {
-                half4 bmp = sample(bump_map);
+                float3 norm = convert_normal_sample(sample(normal_map));
+                float3 plane_norm = normalize(localToWorld * float4(norm, 0)).xyz;
 
                 float3 plane_pos = (localToWorld * float4(x, y, 0, 1)).xyz;
-
-                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.1;
+
+                float ambient = 0.2;
                 float dp = dot(plane_norm, light_dir);
-                float scale = min(ambient + max(dp, 0), 2);
+                float scale = min(ambient + max(dp, 0), 1);
 
                 color = sample(color_map) * half4(float4(scale, scale, scale, 1));
             }