| Index: gm/lightingshader2.cpp
|
| diff --git a/gm/lightingshader2.cpp b/gm/lightingshader2.cpp
|
| index 70c9e29f69cae5ba5b00b603e1fcd7fb83a9ed71..5afe2558b906b9594698699677772b33f9631bfb 100644
|
| --- a/gm/lightingshader2.cpp
|
| +++ b/gm/lightingshader2.cpp
|
| @@ -23,7 +23,7 @@ static SkBitmap make_frustum_normalmap(int texSize) {
|
| 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 @@ protected:
|
| }
|
|
|
| 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 @@ protected:
|
| 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 @@ protected:
|
| }
|
|
|
| paint.setShader(SkLightingShader::Make(std::move(diffuseShader), std::move(normalSource),
|
| - fLights));
|
| + std::move(lights)));
|
| canvas->drawRect(fRect, paint);
|
|
|
| canvas->restore();
|
| @@ -147,7 +163,7 @@ protected:
|
|
|
| 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 @@ protected:
|
|
|
| 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 @@ protected:
|
|
|
| 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 @@ private:
|
|
|
| SkRect fRect;
|
| sk_sp<SkLights> fLights;
|
| + sk_sp<SkLights> fLightsNoDir;
|
| + sk_sp<SkLights> fLightsTwoDir;
|
|
|
| typedef GM INHERITED;
|
| };
|
|
|