blob: fff2f94a3bde3a7de9574e86dc6a112e3855477a [file] [log] [blame]
jvanverthe1a3bc62016-08-12 10:40:38 -07001
2/*
3 * Copyright 2016 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
Ben Wagnerb2c4ea62018-08-08 11:36:17 -04008#include "Sample.h"
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -05009#include "SkAnimTimer.h"
jvanverthe1a3bc62016-08-12 10:40:38 -070010#include "SkBlurMask.h"
11#include "SkBlurMaskFilter.h"
Jim Van Verth2aa535e2017-02-06 14:36:01 -050012#include "SkColorFilter.h"
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -050013#include "SkCamera.h"
jvanverthe1a3bc62016-08-12 10:40:38 -070014#include "SkCanvas.h"
15#include "SkPath.h"
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -050016#include "SkPathOps.h"
jvanverthe1a3bc62016-08-12 10:40:38 -070017#include "SkPoint3.h"
Jim Van Verth43475ad2017-01-13 14:37:37 -050018#include "SkShadowUtils.h"
Hal Canaryea60b952018-08-21 11:45:46 -040019#include "SkUTF.h"
jvanverthe1a3bc62016-08-12 10:40:38 -070020#include "sk_tool_utils.h"
21
jvanverth6c177a12016-08-17 07:59:41 -070022////////////////////////////////////////////////////////////////////////////
23
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040024class ShadowsView : public Sample {
jvanverthe1a3bc62016-08-12 10:40:38 -070025 SkPath fRectPath;
26 SkPath fRRPath;
27 SkPath fCirclePath;
Jim Van Verthbce74962017-01-25 09:39:46 -050028 SkPath fFunkyRRPath;
29 SkPath fCubicPath;
Jim Van Verth872da6b2018-04-10 11:24:11 -040030 SkPath fStarPath;
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -050031 SkPath fSquareRRectPath;
32 SkPath fWideRectPath;
33 SkPath fWideOvalPath;
Jim Van Verth872da6b2018-04-10 11:24:11 -040034 SkPath fNotchPath;
35 SkPath fTabPath;
36
jvanverthe1a3bc62016-08-12 10:40:38 -070037 SkPoint3 fLightPos;
Jim Van Verth2aa535e2017-02-06 14:36:01 -050038 SkScalar fZDelta;
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -050039 SkScalar fAnimTranslate;
Jim Van Verthda965502017-04-11 15:29:14 -040040 SkScalar fAnimAngle;
Jim Van Verth744cbb32017-12-19 13:02:38 -050041 SkScalar fAnimAlpha;
jvanverthe1a3bc62016-08-12 10:40:38 -070042
43 bool fShowAmbient;
44 bool fShowSpot;
jvanverthd7315f912016-08-17 10:06:18 -070045 bool fUseAlt;
jvanverthe1a3bc62016-08-12 10:40:38 -070046 bool fShowObject;
Robert Phillips95304e32016-10-07 14:44:07 -040047 bool fIgnoreShadowAlpha;
Jim Van Verth744cbb32017-12-19 13:02:38 -050048 bool fDoAlphaAnimation;
jvanverthe1a3bc62016-08-12 10:40:38 -070049
50public:
Jim Van Verth2aa535e2017-02-06 14:36:01 -050051 ShadowsView()
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -050052 : fZDelta(0)
53 , fAnimTranslate(0)
Jim Van Verthda965502017-04-11 15:29:14 -040054 , fAnimAngle(0)
Jim Van Verth744cbb32017-12-19 13:02:38 -050055 , fAnimAlpha(1)
Jim Van Verth2aa535e2017-02-06 14:36:01 -050056 , fShowAmbient(true)
jvanverthe1a3bc62016-08-12 10:40:38 -070057 , fShowSpot(true)
Jim Van Verthb6069df2017-04-28 11:00:35 -040058 , fUseAlt(false)
Robert Phillips95304e32016-10-07 14:44:07 -040059 , fShowObject(true)
Jim Van Verth744cbb32017-12-19 13:02:38 -050060 , fIgnoreShadowAlpha(false)
61 , fDoAlphaAnimation(false) {}
jvanverthe1a3bc62016-08-12 10:40:38 -070062
63protected:
64 void onOnceBeforeDraw() override {
65 fCirclePath.addCircle(0, 0, 50);
66 fRectPath.addRect(SkRect::MakeXYWH(-100, -50, 200, 100));
67 fRRPath.addRRect(SkRRect::MakeRectXY(SkRect::MakeXYWH(-100, -50, 200, 100), 4, 4));
Jim Van Verthbce74962017-01-25 09:39:46 -050068 fFunkyRRPath.addRoundRect(SkRect::MakeXYWH(-50, -50, SK_Scalar1 * 100, SK_Scalar1 * 100),
69 40 * SK_Scalar1, 20 * SK_Scalar1,
70 SkPath::kCW_Direction);
71 fCubicPath.cubicTo(100 * SK_Scalar1, 50 * SK_Scalar1,
72 20 * SK_Scalar1, 100 * SK_Scalar1,
73 0 * SK_Scalar1, 0 * SK_Scalar1);
Jim Van Verth872da6b2018-04-10 11:24:11 -040074 fStarPath.moveTo(0.0f, -50.0f);
75 fStarPath.lineTo(14.43f, -25.0f);
76 fStarPath.lineTo(43.30f, -25.0f);
77 fStarPath.lineTo(28.86f, 0.0f);
78 fStarPath.lineTo(43.30f, 25.0f);
79 fStarPath.lineTo(14.43f, 25.0f);
80 fStarPath.lineTo(0.0f, 50.0f);
81 fStarPath.lineTo(-14.43f, 25.0f);
82 fStarPath.lineTo(-43.30f, 25.0f);
83 fStarPath.lineTo(-28.86f, 0.0f);
84 fStarPath.lineTo(-43.30f, -25.0f);
85 fStarPath.lineTo(-14.43f, -25.0f);
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -050086 fSquareRRectPath.addRRect(SkRRect::MakeRectXY(SkRect::MakeXYWH(-50, -50, 100, 100),
87 10, 10));
88 fWideRectPath.addRect(SkRect::MakeXYWH(0, 0, 630, 70));
89 fWideOvalPath.addOval(SkRect::MakeXYWH(0, 0, 630, 70));
Jim Van Verthbce74962017-01-25 09:39:46 -050090
Jim Van Verth872da6b2018-04-10 11:24:11 -040091 fNotchPath.moveTo(0, 80);
92 fNotchPath.arcTo(SkRect::MakeLTRB(-20, 80, 20, 120), -90, -90, false);
93 fNotchPath.lineTo(-75, 100);
94 fNotchPath.lineTo(-75, -100);
95 fNotchPath.lineTo(75, -100);
96 fNotchPath.lineTo(75, 100);
97 fNotchPath.arcTo(SkRect::MakeLTRB(-20, 80, 20, 120), 0, -90, false);
98
99 fTabPath.moveTo(-75, -100);
100 fTabPath.lineTo(75, -100);
101 fTabPath.lineTo(75, 100);
102 fTabPath.arcTo(SkRect::MakeLTRB(-20, 80, 20, 120), 0, 90, false);
103 fTabPath.arcTo(SkRect::MakeLTRB(-20, 80, 20, 120), 90, 90, false);
104 fTabPath.lineTo(-75, 100);
105
Jim Van Verthb6069df2017-04-28 11:00:35 -0400106 fLightPos = SkPoint3::Make(350, 0, 600);
jvanverthe1a3bc62016-08-12 10:40:38 -0700107 }
108
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400109 bool onQuery(Sample::Event* evt) override {
110 if (Sample::TitleQ(*evt)) {
111 Sample::TitleR(evt, "AndroidShadows");
jvanverthe1a3bc62016-08-12 10:40:38 -0700112 return true;
113 }
114
115 SkUnichar uni;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400116 if (Sample::CharQ(*evt, &uni)) {
Jim Van Verth6f449692017-02-14 15:16:46 -0500117 bool handled = false;
jvanverthe1a3bc62016-08-12 10:40:38 -0700118 switch (uni) {
Jim Van Verth2aa535e2017-02-06 14:36:01 -0500119 case 'W':
jvanverthe1a3bc62016-08-12 10:40:38 -0700120 fShowAmbient = !fShowAmbient;
Jim Van Verth6f449692017-02-14 15:16:46 -0500121 handled = true;
jvanverthe1a3bc62016-08-12 10:40:38 -0700122 break;
123 case 'S':
124 fShowSpot = !fShowSpot;
Jim Van Verth6f449692017-02-14 15:16:46 -0500125 handled = true;
jvanverthe1a3bc62016-08-12 10:40:38 -0700126 break;
jvanverthd7315f912016-08-17 10:06:18 -0700127 case 'T':
128 fUseAlt = !fUseAlt;
Jim Van Verth6f449692017-02-14 15:16:46 -0500129 handled = true;
jvanverthd7315f912016-08-17 10:06:18 -0700130 break;
jvanverthe1a3bc62016-08-12 10:40:38 -0700131 case 'O':
132 fShowObject = !fShowObject;
Jim Van Verth6f449692017-02-14 15:16:46 -0500133 handled = true;
jvanverthe1a3bc62016-08-12 10:40:38 -0700134 break;
Jim Van Verth744cbb32017-12-19 13:02:38 -0500135 case 'N':
136 fDoAlphaAnimation = !fDoAlphaAnimation;
137 if (!fDoAlphaAnimation) {
138 fAnimAlpha = 1;
139 }
140 handled = true;
141 break;
jvanverthe1a3bc62016-08-12 10:40:38 -0700142 case '>':
Jim Van Verth2aa535e2017-02-06 14:36:01 -0500143 fZDelta += 0.5f;
Jim Van Verth6f449692017-02-14 15:16:46 -0500144 handled = true;
jvanverthe1a3bc62016-08-12 10:40:38 -0700145 break;
146 case '<':
Jim Van Verth2aa535e2017-02-06 14:36:01 -0500147 fZDelta -= 0.5f;
Jim Van Verth6f449692017-02-14 15:16:46 -0500148 handled = true;
jvanverthe1a3bc62016-08-12 10:40:38 -0700149 break;
Robert Phillips95304e32016-10-07 14:44:07 -0400150 case '?':
151 fIgnoreShadowAlpha = !fIgnoreShadowAlpha;
Jim Van Verth6f449692017-02-14 15:16:46 -0500152 handled = true;
Robert Phillips95304e32016-10-07 14:44:07 -0400153 break;
jvanverthe1a3bc62016-08-12 10:40:38 -0700154 default:
155 break;
156 }
Jim Van Verth6f449692017-02-14 15:16:46 -0500157 if (handled) {
Jim Van Verth6f449692017-02-14 15:16:46 -0500158 return true;
159 }
jvanverthe1a3bc62016-08-12 10:40:38 -0700160 }
161 return this->INHERITED::onQuery(evt);
162 }
163
164 void drawBG(SkCanvas* canvas) {
165 canvas->drawColor(0xFFDDDDDD);
166 }
167
Jim Van Verthda965502017-04-11 15:29:14 -0400168 void drawShadowedPath(SkCanvas* canvas, const SkPath& path,
Jim Van Verthe308a122017-05-08 14:19:30 -0400169 const SkPoint3& zPlaneParams,
jvanverthd7315f912016-08-17 10:06:18 -0700170 const SkPaint& paint, SkScalar ambientAlpha,
171 const SkPoint3& lightPos, SkScalar lightWidth, SkScalar spotAlpha) {
Jim Van Verthe7705782017-05-04 14:00:59 -0400172 if (fIgnoreShadowAlpha) {
Jim Van Verth872da6b2018-04-10 11:24:11 -0400173 ambientAlpha = 1;
174 spotAlpha = 1;
Jim Van Verthe7705782017-05-04 14:00:59 -0400175 }
Jim Van Verth060d9822017-05-04 09:58:17 -0400176 if (!fShowAmbient) {
177 ambientAlpha = 0;
178 }
179 if (!fShowSpot) {
180 spotAlpha = 0;
181 }
182 uint32_t flags = 0;
Jim Van Verth3c1b7db2016-10-31 16:06:51 -0400183 if (fUseAlt) {
Jim Van Verth060d9822017-05-04 09:58:17 -0400184 flags |= SkShadowFlags::kGeometricOnly_ShadowFlag;
Jim Van Verth3c1b7db2016-10-31 16:06:51 -0400185 }
Jim Van Verth34d6e4b2017-06-09 11:09:03 -0400186
Jim Van Vertha5566842018-02-22 10:58:34 -0500187 SkColor ambientColor = SkColorSetARGB(ambientAlpha * 255, 0, 0, 0);
188 SkColor spotColor = SkColorSetARGB(spotAlpha * 255, 0, 0, 0);
189 SkShadowUtils::DrawShadow(canvas, path, zPlaneParams, lightPos, lightWidth,
190 ambientColor, spotColor, flags);
Jim Van Verth3c1b7db2016-10-31 16:06:51 -0400191
jvanverthe1a3bc62016-08-12 10:40:38 -0700192 if (fShowObject) {
193 canvas->drawPath(path, paint);
Robert Phillips95304e32016-10-07 14:44:07 -0400194 } else {
195 SkPaint strokePaint;
196
197 strokePaint.setColor(paint.getColor());
198 strokePaint.setStyle(SkPaint::kStroke_Style);
199
200 canvas->drawPath(path, strokePaint);
jvanverthe1a3bc62016-08-12 10:40:38 -0700201 }
202 }
203
204 void onDrawContent(SkCanvas* canvas) override {
205 this->drawBG(canvas);
Jim Van Verthb6069df2017-04-28 11:00:35 -0400206 const SkScalar kLightWidth = 800;
Jim Van Verth4c8c1e82018-04-23 17:14:48 -0400207 const SkScalar kAmbientAlpha = 0.039f;
208 const SkScalar kSpotAlpha = 0.19f;
jvanverthe1a3bc62016-08-12 10:40:38 -0700209
210 SkPaint paint;
211 paint.setAntiAlias(true);
212
jvanverthd7315f912016-08-17 10:06:18 -0700213 SkPoint3 lightPos = fLightPos;
Jim Van Verthe308a122017-05-08 14:19:30 -0400214 SkPoint3 zPlaneParams = SkPoint3::Make(0, 0, 0);
jvanverthd7315f912016-08-17 10:06:18 -0700215
jvanverthe1a3bc62016-08-12 10:40:38 -0700216 paint.setColor(SK_ColorWHITE);
217 canvas->translate(200, 90);
Jim Van Verthe308a122017-05-08 14:19:30 -0400218 zPlaneParams.fZ = SkTMax(1.0f, 2 + fZDelta);
Jim Van Verth744cbb32017-12-19 13:02:38 -0500219 this->drawShadowedPath(canvas, fRRPath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
220 lightPos, kLightWidth, fAnimAlpha*kSpotAlpha);
jvanverthe1a3bc62016-08-12 10:40:38 -0700221
222 paint.setColor(SK_ColorRED);
223 canvas->translate(250, 0);
Jim Van Verthe308a122017-05-08 14:19:30 -0400224 zPlaneParams.fZ = SkTMax(1.0f, 8 + fZDelta);
Jim Van Verth744cbb32017-12-19 13:02:38 -0500225 this->drawShadowedPath(canvas, fRectPath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
226 lightPos, kLightWidth, fAnimAlpha*kSpotAlpha);
jvanverthe1a3bc62016-08-12 10:40:38 -0700227
228 paint.setColor(SK_ColorBLUE);
229 canvas->translate(-250, 110);
Jim Van Verthe308a122017-05-08 14:19:30 -0400230 zPlaneParams.fZ = SkTMax(1.0f, 12 + fZDelta);
Jim Van Verth744cbb32017-12-19 13:02:38 -0500231 this->drawShadowedPath(canvas, fCirclePath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
232 lightPos, kLightWidth, fAnimAlpha*0.5f);
jvanverth6c177a12016-08-17 07:59:41 -0700233
234 paint.setColor(SK_ColorGREEN);
235 canvas->translate(250, 0);
Jim Van Verthe308a122017-05-08 14:19:30 -0400236 zPlaneParams.fZ = SkTMax(1.0f, 64 + fZDelta);
Jim Van Verth744cbb32017-12-19 13:02:38 -0500237 this->drawShadowedPath(canvas, fRRPath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
238 lightPos, kLightWidth, fAnimAlpha*kSpotAlpha);
Jim Van Verthbce74962017-01-25 09:39:46 -0500239
240 paint.setColor(SK_ColorYELLOW);
241 canvas->translate(-250, 110);
Jim Van Verthe308a122017-05-08 14:19:30 -0400242 zPlaneParams.fZ = SkTMax(1.0f, 8 + fZDelta);
Jim Van Verth744cbb32017-12-19 13:02:38 -0500243 this->drawShadowedPath(canvas, fFunkyRRPath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
244 lightPos, kLightWidth, fAnimAlpha*kSpotAlpha);
Jim Van Verthbce74962017-01-25 09:39:46 -0500245
246 paint.setColor(SK_ColorCYAN);
247 canvas->translate(250, 0);
Jim Van Verthe308a122017-05-08 14:19:30 -0400248 zPlaneParams.fZ = SkTMax(1.0f, 16 + fZDelta);
Jim Van Verth744cbb32017-12-19 13:02:38 -0500249 this->drawShadowedPath(canvas, fCubicPath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
250 lightPos, kLightWidth, fAnimAlpha*kSpotAlpha);
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500251
Jim Van Verth872da6b2018-04-10 11:24:11 -0400252 paint.setColor(SK_ColorWHITE);
253 canvas->translate(250, -180);
254 zPlaneParams.fZ = SkTMax(1.0f, 8 + fZDelta);
255 this->drawShadowedPath(canvas, fStarPath, zPlaneParams, paint,
256 kAmbientAlpha, lightPos, kLightWidth, kSpotAlpha);
257
258 paint.setColor(SK_ColorWHITE);
259 canvas->translate(150, 0);
260 zPlaneParams.fZ = SkTMax(1.0f, 2 + fZDelta);
261 this->drawShadowedPath(canvas, fNotchPath, zPlaneParams, paint,
262 kAmbientAlpha, lightPos, kLightWidth, kSpotAlpha);
263
264 paint.setColor(SK_ColorWHITE);
265 canvas->translate(200, 0);
266 zPlaneParams.fZ = SkTMax(1.0f, 16 + fZDelta);
267 this->drawShadowedPath(canvas, fTabPath, zPlaneParams, paint,
268 kAmbientAlpha, lightPos, kLightWidth, kSpotAlpha);
269
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500270 // circular reveal
271 SkPath tmpPath;
272 SkPath tmpClipPath;
273 tmpClipPath.addCircle(fAnimTranslate, 0, 60);
274 Op(fSquareRRectPath, tmpClipPath, kIntersect_SkPathOp, &tmpPath);
275
276 paint.setColor(SK_ColorMAGENTA);
Jim Van Verth872da6b2018-04-10 11:24:11 -0400277 canvas->translate(-725, 240);
Jim Van Verthe308a122017-05-08 14:19:30 -0400278 zPlaneParams.fZ = SkTMax(1.0f, 32 + fZDelta);
279 this->drawShadowedPath(canvas, tmpPath, zPlaneParams, paint, .1f,
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500280 lightPos, kLightWidth, .5f);
281
Jim Van Verthf507c282018-05-11 10:48:20 -0400282 // path ops bug
283 SkPath tmpClipPathBug;
284 tmpClipPathBug.addCircle(88.0344925f, 0, 60);
285 Op(fSquareRRectPath, tmpClipPathBug, kIntersect_SkPathOp, &tmpPath);
286
287 canvas->translate(250, 0);
288 zPlaneParams.fZ = SkTMax(1.0f, 32 + fZDelta);
289 this->drawShadowedPath(canvas, tmpPath, zPlaneParams, paint, .1f,
290 lightPos, kLightWidth, .5f);
291
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500292 // perspective paths
293 SkPoint pivot = SkPoint::Make(fWideRectPath.getBounds().width()/2,
294 fWideRectPath.getBounds().height()/2);
Jim Van Verthda965502017-04-11 15:29:14 -0400295 SkPoint translate = SkPoint::Make(100, 450);
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500296 paint.setColor(SK_ColorWHITE);
297 Sk3DView view;
298 view.save();
Jim Van Verthda965502017-04-11 15:29:14 -0400299 view.rotateX(fAnimAngle);
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500300 SkMatrix persp;
301 view.getMatrix(&persp);
302 persp.preTranslate(-pivot.fX, -pivot.fY);
303 persp.postTranslate(pivot.fX + translate.fX, pivot.fY + translate.fY);
304 canvas->setMatrix(persp);
Jim Van Verthda965502017-04-11 15:29:14 -0400305 SkScalar radians = SkDegreesToRadians(fAnimAngle);
Jim Van Verthe308a122017-05-08 14:19:30 -0400306 zPlaneParams = SkPoint3::Make(0,
Jim Van Verth0b7645f2018-08-31 12:36:52 -0400307 SkScalarSin(radians),
308 SkTMax(1.0f, 16 + fZDelta) - SkScalarSin(radians)*pivot.fY);
Jim Van Verthe308a122017-05-08 14:19:30 -0400309 this->drawShadowedPath(canvas, fWideRectPath, zPlaneParams, paint, .1f,
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500310 lightPos, kLightWidth, .5f);
311
312 pivot = SkPoint::Make(fWideOvalPath.getBounds().width() / 2,
313 fWideOvalPath.getBounds().height() / 2);
Jim Van Verthda965502017-04-11 15:29:14 -0400314 translate = SkPoint::Make(100, 600);
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500315 view.restore();
Jim Van Verthe39bc9f2018-06-14 14:43:00 -0400316 view.save();
Jim Van Verthda965502017-04-11 15:29:14 -0400317 view.rotateY(fAnimAngle);
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500318 view.getMatrix(&persp);
319 persp.preTranslate(-pivot.fX, -pivot.fY);
320 persp.postTranslate(pivot.fX + translate.fX, pivot.fY + translate.fY);
321 canvas->setMatrix(persp);
Jim Van Verthe308a122017-05-08 14:19:30 -0400322 zPlaneParams = SkPoint3::Make(-SkScalarSin(radians),
323 0,
324 SkTMax(1.0f, 32 + fZDelta) + SkScalarSin(radians)*pivot.fX);
325 this->drawShadowedPath(canvas, fWideOvalPath, zPlaneParams, paint, .1f,
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500326 lightPos, kLightWidth, .5f);
Jim Van Verthe39bc9f2018-06-14 14:43:00 -0400327
328 pivot = SkPoint::Make(fStarPath.getBounds().width() / 2,
329 fStarPath.getBounds().height() / 2);
330 translate = SkPoint::Make(700, 250);
331 view.restore();
332 view.rotateY(fAnimAngle);
333 view.getMatrix(&persp);
334 persp.preTranslate(-pivot.fX, -pivot.fY);
335 persp.postTranslate(pivot.fX + translate.fX, pivot.fY + translate.fY);
336 canvas->setMatrix(persp);
337 zPlaneParams = SkPoint3::Make(-SkScalarSin(radians),
338 0,
339 SkTMax(1.0f, 8 + fZDelta) + SkScalarSin(radians)*pivot.fX);
340 this->drawShadowedPath(canvas, fStarPath, zPlaneParams, paint, .1f,
341 lightPos, kLightWidth, .5f);
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500342 }
343
344 bool onAnimate(const SkAnimTimer& timer) override {
Jim Van Verthf507c282018-05-11 10:48:20 -0400345 fAnimTranslate = timer.pingPong(30, 0, 125, -125);
Jim Van Verthda965502017-04-11 15:29:14 -0400346 fAnimAngle = timer.pingPong(15, 0, 0, 20);
Jim Van Verth744cbb32017-12-19 13:02:38 -0500347 if (fDoAlphaAnimation) {
348 fAnimAlpha = timer.pingPong(5, 0, 1, 0);
349 }
Jim Van Verth2c1cd6d2017-03-10 14:34:51 -0500350 return true;
jvanverthe1a3bc62016-08-12 10:40:38 -0700351 }
352
jvanverthe1a3bc62016-08-12 10:40:38 -0700353private:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400354 typedef Sample INHERITED;
jvanverthe1a3bc62016-08-12 10:40:38 -0700355};
356
357//////////////////////////////////////////////////////////////////////////////
358
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400359DEF_SAMPLE( return new ShadowsView(); )