blob: 0e68135b9dab48459b38bde8c88a8a4d69ec0925 [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
8#include "DecodeFile.h"
9#include "SampleCode.h"
10#include "Resources.h"
11#include "SkCanvas.h"
12#include "SkLightingShader.h"
13#include "SkNormalSource.h"
14#include "SkPoint3.h"
15
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
32class LightingView : public SampleView {
33public:
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
41 fDiffuseShader = SkShader::MakeBitmapShader(diffuseBitmap,
42 SkShader::kClamp_TileMode,
43 SkShader::kClamp_TileMode,
44 nullptr);
45 }
46
47 {
48 SkBitmap normalBitmap;
49 SkAssertResult(GetResourceAsBitmap("images/brickwork_normal-map.jpg", &normalBitmap));
50
51 sk_sp<SkShader> normalMap = SkShader::MakeBitmapShader(normalBitmap,
52 SkShader::kClamp_TileMode,
53 SkShader::kClamp_TileMode,
54 nullptr);
55 fNormalSource = SkNormalSource::MakeFromNormalMap(std::move(normalMap), SkMatrix::I());
56 }
57 }
58
59protected:
60 // overrides from SkEventSink
61 bool onQuery(SkEvent* evt) override {
62 if (SampleCode::TitleQ(*evt)) {
63 SampleCode::TitleR(evt, "Lighting");
64 return true;
65 }
66 return this->INHERITED::onQuery(evt);
67 }
68
69 void onDrawContent(SkCanvas* canvas) override {
70 sk_sp<SkLights> lights(create_lights(fLightAngle, fColorFactor));
71
72 SkPaint paint;
73 paint.setShader(SkLightingShader::Make(fDiffuseShader,
74 fNormalSource,
75 std::move(lights)));
76 paint.setColor(SK_ColorBLACK);
77
78 canvas->drawRect(fRect, paint);
79 }
80
81 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
82 return this->INHERITED::onFindClickHandler(x, y, modi);
83 }
84
85 bool onAnimate(const SkAnimTimer& timer) override {
86 fLightAngle += 0.015f;
87 fColorFactor += 0.01f;
88 if (fColorFactor > 1.0f) {
89 fColorFactor = 0.0f;
90 }
91
92 return true;
93 }
94
95private:
96 SkRect fRect;
97 sk_sp<SkShader> fDiffuseShader;
98 sk_sp<SkNormalSource> fNormalSource;
99
100 SkScalar fLightAngle;
101 SkScalar fColorFactor;
102
103 typedef SampleView INHERITED;
104};
105
106//////////////////////////////////////////////////////////////////////////////
107
108static SkView* MyFactory() { return new LightingView; }
109static SkViewRegister reg(MyFactory);