LightingFP now supports multiple directional lights

BUG=skia:5518
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2239933004

Review-Url: https://codereview.chromium.org/2239933004
diff --git a/gm/lightingshader2.cpp b/gm/lightingshader2.cpp
index 70c9e29..5afe255 100644
--- a/gm/lightingshader2.cpp
+++ b/gm/lightingshader2.cpp
@@ -23,7 +23,7 @@
 namespace skiagm {
 
 // This GM exercises lighting shaders. Specifically, nullptr arguments, scaling when using
-// normal maps, and paint transparency.
+// normal maps, paint transparency, zero directional lights, multiple directional lights.
 class LightingShader2GM : public GM {
 public:
     LightingShader2GM() {
@@ -40,14 +40,30 @@
     }
 
     void onOnceBeforeDraw() override {
-        SkLights::Builder builder;
         const SkVector3 kLightFromUpperRight = SkVector3::Make(0.788f, 0.394f, 0.473f);
+        const SkVector3 kLightFromUpperLeft = SkVector3::Make(-0.788f, 0.394f, 0.473f);
 
+        // Standard set of lights
+        SkLights::Builder builder;
         builder.add(SkLights::Light::MakeDirectional(SkColor3f::Make(1.0f, 1.0f, 1.0f),
                                                      kLightFromUpperRight));
         builder.add(SkLights::Light::MakeAmbient(SkColor3f::Make(0.2f, 0.2f, 0.2f)));
         fLights = builder.finish();
 
+        // No directional lights
+        SkLights::Builder builderNoDir;
+        builderNoDir.add(SkLights::Light::MakeAmbient(SkColor3f::Make(0.2f, 0.2f, 0.2f)));
+        fLightsNoDir = builderNoDir.finish();
+
+        // Two directional lights
+        SkLights::Builder builderTwoDir;
+        builderTwoDir.add(SkLights::Light::MakeDirectional(SkColor3f::Make(1.0f, 0.0f, 1.0f),
+                                                           kLightFromUpperRight));
+        builderTwoDir.add(SkLights::Light::MakeDirectional(SkColor3f::Make(0.0f, 1.0f, 1.0f),
+                                                           kLightFromUpperLeft));
+        builderTwoDir.add(SkLights::Light::MakeAmbient(SkColor3f::Make(0.2f, 0.2f, 0.2f)));
+        fLightsTwoDir = builderTwoDir.finish();
+
         fRect = SkRect::MakeIWH(kTexSize, kTexSize);
         SkMatrix matrix;
         SkRect bitmapBounds = SkRect::MakeIWH(kTexSize, kTexSize);
@@ -87,7 +103,7 @@
     static constexpr int NUM_BOOLEAN_PARAMS = 4;
     void drawRect(SkCanvas* canvas, SkScalar scaleX, SkScalar scaleY,
                   SkScalar rotate, bool useNormalSource, bool useDiffuseShader,
-                  bool useTranslucentPaint, bool useTranslucentShader) {
+                  bool useTranslucentPaint, bool useTranslucentShader, sk_sp<SkLights> lights) {
         canvas->save();
 
         this->positionCTM(canvas, scaleX, scaleY, rotate);
@@ -113,7 +129,7 @@
         }
 
         paint.setShader(SkLightingShader::Make(std::move(diffuseShader), std::move(normalSource),
-                                               fLights));
+                                               std::move(lights)));
         canvas->drawRect(fRect, paint);
 
         canvas->restore();
@@ -147,7 +163,7 @@
 
                         canvas->translate(xPos, yPos);
                         this->drawRect(canvas, 1.0f, 1.0f, 0.f, useNormalSource, useDiffuseShader,
-                                       useTranslucentPaint, useTranslucentShader);
+                                       useTranslucentPaint, useTranslucentShader, fLights);
                         // Drawing labels
                         canvas->translate(0.0f, SkIntToScalar(kTexSize));
                         {
@@ -191,7 +207,7 @@
 
             canvas->save();
             canvas->translate(xPos, yPos);
-            this->drawRect(canvas, 0.6f, 0.6f, 45.0f, true, true, true, true);
+            this->drawRect(canvas, 0.6f, 0.6f, 45.0f, true, true, true, true, fLights);
             canvas->restore();
 
             gridNum++;
@@ -204,7 +220,33 @@
 
             canvas->save();
             canvas->translate(xPos, yPos);
-            this->drawRect(canvas, 0.6f, 0.4f, 30.0f, true, true, true, true);
+            this->drawRect(canvas, 0.6f, 0.4f, 30.0f, true, true, true, true, fLights);
+            canvas->restore();
+
+            gridNum++;
+        }
+
+        // No directional lights test
+        {
+            SkScalar xPos = (gridNum % GRID_COLUMN_NUM) * GRID_CELL_WIDTH;
+            SkScalar yPos = (gridNum / GRID_COLUMN_NUM) * GRID_CELL_WIDTH;
+
+            canvas->save();
+            canvas->translate(xPos, yPos);
+            this->drawRect(canvas, 1.0f, 1.0f, 0.0f, true, true, false, false, fLightsNoDir);
+            canvas->restore();
+
+            gridNum++;
+        }
+
+        // Two directional lights test
+        {
+            SkScalar xPos = (gridNum % GRID_COLUMN_NUM) * GRID_CELL_WIDTH;
+            SkScalar yPos = (gridNum / GRID_COLUMN_NUM) * GRID_CELL_WIDTH;
+
+            canvas->save();
+            canvas->translate(xPos, yPos);
+            this->drawRect(canvas, 1.0f, 1.0f, 0.0f, true, true, false, false, fLightsTwoDir);
             canvas->restore();
 
             gridNum++;
@@ -220,6 +262,8 @@
 
     SkRect fRect;
     sk_sp<SkLights> fLights;
+    sk_sp<SkLights> fLightsNoDir;
+    sk_sp<SkLights> fLightsTwoDir;
 
     typedef GM INHERITED;
 };