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;
};