blob: a8bd72e78f92aeba957b385302827ad90a25977a [file] [log] [blame]
Robert Phillipsa8cdbd72018-07-17 12:30:40 -04001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkCanvas.h"
9#include "include/core/SkPoint3.h"
10#include "samplecode/DecodeFile.h"
11#include "samplecode/Sample.h"
12#include "src/core/SkNormalSource.h"
13#include "src/shaders/SkLightingShader.h"
14#include "tools/Resources.h"
Robert Phillipsa8cdbd72018-07-17 12:30:40 -040015
16static sk_sp<SkLights> create_lights(SkScalar angle, SkScalar blue) {
17
18 const SkVector3 dir = SkVector3::Make(SkScalarSin(angle)*SkScalarSin(SK_ScalarPI*0.25f),
19 SkScalarCos(angle)*SkScalarSin(SK_ScalarPI*0.25f),
20 SkScalarCos(SK_ScalarPI*0.25f));
21
22 SkLights::Builder builder;
23
24 builder.add(SkLights::Light::MakeDirectional(SkColor3f::Make(1.0f, 1.0f, blue), dir));
25 builder.setAmbientLightColor(SkColor3f::Make(0.1f, 0.1f, 0.1f));
26
27 return builder.finish();
28}
29
30////////////////////////////////////////////////////////////////////////////
31
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040032class LightingView : public Sample {
Robert Phillipsa8cdbd72018-07-17 12:30:40 -040033public:
34 LightingView() : fLightAngle(0.0f) , fColorFactor(0.0f) {
35 {
36 SkBitmap diffuseBitmap;
37 SkAssertResult(GetResourceAsBitmap("images/brickwork-texture.jpg", &diffuseBitmap));
38
39 fRect = SkRect::MakeIWH(diffuseBitmap.width(), diffuseBitmap.height());
40
Mike Reed50acf8f2019-04-08 13:20:23 -040041 fDiffuseShader = diffuseBitmap.makeShader();
Robert Phillipsa8cdbd72018-07-17 12:30:40 -040042 }
43
44 {
45 SkBitmap normalBitmap;
46 SkAssertResult(GetResourceAsBitmap("images/brickwork_normal-map.jpg", &normalBitmap));
47
Mike Reed50acf8f2019-04-08 13:20:23 -040048 sk_sp<SkShader> normalMap = normalBitmap.makeShader();
Robert Phillipsa8cdbd72018-07-17 12:30:40 -040049 fNormalSource = SkNormalSource::MakeFromNormalMap(std::move(normalMap), SkMatrix::I());
50 }
51 }
52
53protected:
Hal Canary8a027312019-07-03 10:55:44 -040054 SkString name() override { return SkString("Lighting"); }
Robert Phillipsa8cdbd72018-07-17 12:30:40 -040055
56 void onDrawContent(SkCanvas* canvas) override {
57 sk_sp<SkLights> lights(create_lights(fLightAngle, fColorFactor));
58
59 SkPaint paint;
60 paint.setShader(SkLightingShader::Make(fDiffuseShader,
61 fNormalSource,
62 std::move(lights)));
63 paint.setColor(SK_ColorBLACK);
64
65 canvas->drawRect(fRect, paint);
66 }
67
Hal Canary3a85ed12019-07-08 16:07:57 -040068 Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, ModifierKey modi) override {
Robert Phillipsa8cdbd72018-07-17 12:30:40 -040069 return this->INHERITED::onFindClickHandler(x, y, modi);
70 }
71
Hal Canary41248072019-07-11 16:32:53 -040072 bool onAnimate(double nanos) override {
Robert Phillipsa8cdbd72018-07-17 12:30:40 -040073 fLightAngle += 0.015f;
74 fColorFactor += 0.01f;
75 if (fColorFactor > 1.0f) {
76 fColorFactor = 0.0f;
77 }
78
79 return true;
80 }
81
82private:
83 SkRect fRect;
84 sk_sp<SkShader> fDiffuseShader;
85 sk_sp<SkNormalSource> fNormalSource;
86
87 SkScalar fLightAngle;
88 SkScalar fColorFactor;
89
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040090 typedef Sample INHERITED;
Robert Phillipsa8cdbd72018-07-17 12:30:40 -040091};
92
93//////////////////////////////////////////////////////////////////////////////
94
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040095DEF_SAMPLE( return new LightingView(); )