Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(414)

Side by Side Diff: samplecode/SampleShadowing.cpp

Issue 2246463004: Added distance attenuation and diffuse shading to PointLights (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: rebased off of master (with variance shadow mapping) Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SampleCode.h" 8 #include "SampleCode.h"
9 #include "SkPictureRecorder.h" 9 #include "SkPictureRecorder.h"
10 #include "SkShadowPaintFilterCanvas.h" 10 #include "SkShadowPaintFilterCanvas.h"
11 #include "SkShadowShader.h" 11 #include "SkShadowShader.h"
12 #include "SkSurface.h" 12 #include "SkSurface.h"
13 13
14 #ifdef SK_EXPERIMENTAL_SHADOWING 14 #ifdef SK_EXPERIMENTAL_SHADOWING
15 15
16 class ShadowingView : public SampleView { 16 class ShadowingView : public SampleView {
17 public: 17 public:
18 ShadowingView() { 18 ShadowingView()
19 : fSceneChanged(true)
20 , fLightsChanged(true)
21 , fMoveLight(false)
22 , fClearShadowMaps(false)
23 , fSelectedRectID(-1)
24 , fLightDepth(300.0f) {
25 this->setBGColor(0xFFCCCCCC);
19 26
20 this->setBGColor(0xFFCCCCCC); 27 this->updateLights(200, 200);
21 SkLights::Builder builder;
22 builder.add(SkLights::Light::MakeDirectional(SkColor3f::Make(0.2f, 0.3f, 0.4f),
23 SkVector3::Make(0.2f, 0.05f , 1.0f)));
24 builder.add(SkLights::Light::MakeDirectional(SkColor3f::Make(0.4f, 0.3f, 0.2f),
25 SkVector3::Make(0.05f, 0.2f , 1.0f)));
26 builder.add(SkLights::Light::MakeAmbient(SkColor3f::Make(0.4f, 0.4f, 0.4 f)));
27 fLights = builder.finish();
28 28
29 fTestRects[0].fColor = 0xFFEE8888; 29 fTestRects[0].fColor = 0xFFEE8888;
30 fTestRects[0].fDepth = 80; 30 fTestRects[0].fDepth = 80;
31 fTestRects[0].fGeometry = SkRect::MakeLTRB(200,150,350,300); 31 fTestRects[0].fGeometry = SkRect::MakeLTRB(200,150,350,300);
32 32
33 fTestRects[1].fColor = 0xFF88EE88; 33 fTestRects[1].fColor = 0xFF88EE88;
34 fTestRects[1].fDepth = 160; 34 fTestRects[1].fDepth = 160;
35 fTestRects[1].fGeometry = SkRect::MakeLTRB(150,200,300,350); 35 fTestRects[1].fGeometry = SkRect::MakeLTRB(150,200,300,350);
36 36
37 fTestRects[2].fColor = 0xFF8888EE; 37 fTestRects[2].fColor = 0xFF8888EE;
38 fTestRects[2].fDepth = 240; 38 fTestRects[2].fDepth = 240;
39 fTestRects[2].fGeometry = SkRect::MakeLTRB(100,100,250,250); 39 fTestRects[2].fGeometry = SkRect::MakeLTRB(100,100,250,250);
40 40
41 fSliders[0].fGeometry = SkRect::MakeLTRB(20, 400, 30, 420); 41 fSliders[0].fGeometry = SkRect::MakeLTRB(20, 400, 30, 420);
42 fSliders[0].fOffset = 0.0f; 42 fSliders[0].fOffset = 0.0f;
43 fSliders[0].fScale = 0.1f; 43 fSliders[0].fScale = 0.1f;
44 44
45 fSliders[1].fGeometry = SkRect::MakeLTRB(100, 420, 110, 440); 45 fSliders[1].fGeometry = SkRect::MakeLTRB(100, 420, 110, 440);
46 fSliders[1].fOffset = 0.0f; 46 fSliders[1].fOffset = 0.0f;
47 fSliders[1].fScale = 10.0f; 47 fSliders[1].fScale = 10.0f;
48 48
49 fSliders[2].fGeometry = SkRect::MakeLTRB(0, 440, 10, 460); 49 fSliders[2].fGeometry = SkRect::MakeLTRB(0, 440, 10, 460);
50 fSliders[2].fOffset = 0.0f; 50 fSliders[2].fOffset = 0.0f;
51 fSliders[2].fScale = 0.0025f; 51 fSliders[2].fScale = 0.0025f;
52 52
robertphillips 2016/08/25 17:41:43 These are now set in ctor list
vjiaoblack 2016/08/26 12:37:22 Done.
53 fSceneChanged = true; 53 fSceneChanged = true;
54 fLightsChanged = true; 54 fLightsChanged = true;
55 55
robertphillips 2016/08/25 17:41:43 this too
vjiaoblack 2016/08/26 12:37:22 Done.
56 fSelectedRect = -1; 56 fSelectedRectID = -1;
57 fSelectedSlider = -1; 57 fSelectedSlider = -1;
robertphillips 2016/08/25 17:41:43 this too
vjiaoblack 2016/08/26 12:37:22 Done.
58 fMoveLight = false; 58 fMoveLight = false;
59 59
robertphillips 2016/08/25 17:41:43 these too
vjiaoblack 2016/08/26 12:37:22 Done.
60 fLightDepth = 300.0f;
60 fClearShadowMaps = false; 61 fClearShadowMaps = false;
61 62
62 fShadowParams.fShadowRadius = 2.0f; 63 fShadowParams.fShadowRadius = 4.0f;
63 fShadowParams.fBiasingConstant = 0.3f; 64 fShadowParams.fBiasingConstant = 0.3f;
64 fShadowParams.fMinVariance = 1024; 65 fShadowParams.fMinVariance = 1024;
65 fShadowParams.fType = SkShadowParams::kVariance_ShadowType; 66 fShadowParams.fType = SkShadowParams::kVariance_ShadowType;
66 } 67 }
67 68
68 protected: 69 protected:
69 bool onQuery(SkEvent *evt) override { 70 bool onQuery(SkEvent *evt) override {
70 if (SampleCode::TitleQ(*evt)) { 71 if (SampleCode::TitleQ(*evt)) {
71 SampleCode::TitleR(evt, "shadowing"); 72 SampleCode::TitleR(evt, "shadowing");
72 return true; 73 return true;
73 } 74 }
74 75
75 SkUnichar uni; 76 SkUnichar uni;
76 if (SampleCode::CharQ(*evt, &uni)) { 77 if (SampleCode::CharQ(*evt, &uni)) {
77 switch (uni) { 78 switch (uni) {
78 case 'L': 79 case 'L':
79 fMoveLight = !fMoveLight; 80 fMoveLight = !fMoveLight;
80 break; 81 break;
81 case 'd': 82 case 'd':
82 // Raster generated shadow maps have their origin in the UL corner 83 // Raster generated shadow maps have their origin in the UL corner
83 // GPU shadow maps can have an arbitrary origin. 84 // GPU shadow maps can have an arbitrary origin.
84 // We override the 'd' keypress so that when the device is c ycled, 85 // We override the 'd' keypress so that when the device is c ycled,
85 // the shadow maps will be re-generated according to the new backend. 86 // the shadow maps will be re-generated according to the new backend.
86 fClearShadowMaps = true; 87 fClearShadowMaps = true;
87 break; 88 break;
89 case 'q':
90 fLightDepth += 5.0f;
91 fMoveLight = true;
88 case 'B': 92 case 'B':
89 if (SkShadowParams::kVariance_ShadowType == fShadowParams.fT ype) { 93 if (SkShadowParams::kVariance_ShadowType == fShadowParams.fT ype) {
90 fShadowParams.fType = SkShadowParams::kNoBlur_ShadowType ; 94 fShadowParams.fType = SkShadowParams::kNoBlur_ShadowType ;
91 } else if (SkShadowParams::kNoBlur_ShadowType == 95 } else if (SkShadowParams::kNoBlur_ShadowType ==
92 fShadowParams.fType) { 96 fShadowParams.fType) {
93 fShadowParams.fType = SkShadowParams::kVariance_ShadowTy pe; 97 fShadowParams.fType = SkShadowParams::kVariance_ShadowTy pe;
94 } 98 }
95 fLightsChanged = true; 99 fLightsChanged = true;
96 break; 100 break;
101 case 'w':
102 fLightDepth -= 5.0f;
103 fMoveLight = true;
104 break;
97 default: 105 default:
98 break; 106 break;
99 } 107 }
100 } 108 }
101 return this->INHERITED::onQuery(evt); 109 return this->INHERITED::onQuery(evt);
102 } 110 }
103 111
104 sk_sp<SkPicture> makeTestPicture(int width, int height) { 112 sk_sp<SkPicture> makeTestPicture(int width, int height) {
105 SkPictureRecorder recorder; 113 SkPictureRecorder recorder;
106 114
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 fClearShadowMaps = false; 154 fClearShadowMaps = false;
147 } 155 }
148 156
149 canvas->setLights(fLights); 157 canvas->setLights(fLights);
150 canvas->drawShadowedPicture(fPicture, nullptr, nullptr, fShadowParams); 158 canvas->drawShadowedPicture(fPicture, nullptr, nullptr, fShadowParams);
151 159
152 for (int i = 0; i < kNumSliders; i++) { 160 for (int i = 0; i < kNumSliders; i++) {
153 SkPaint paint; 161 SkPaint paint;
154 paint.setColor(SK_ColorBLACK); 162 paint.setColor(SK_ColorBLACK);
155 canvas->drawRect(fSliders[i].fGeometry, paint); 163 canvas->drawRect(fSliders[i].fGeometry, paint);
156 } 164 }
robertphillips 2016/08/25 17:41:43 ?? we're doing this above
vjiaoblack 2016/08/26 12:37:22 Done.
vjiaoblack 2016/08/26 12:37:22 Done.
165 canvas->setLights(fLights);
166 canvas->drawShadowedPicture(fPicture, nullptr, nullptr, fShadowParams);
157 } 167 }
158 168
159 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) ove rride { 169 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) ove rride {
160 return new SkView::Click(this); 170 return new SkView::Click(this);
161 } 171 }
162 172
173 void updateLights(int x, int y) {
174 SkLights::Builder builder;
175 builder.add(SkLights::Light::MakePoint(SkColor3f::Make(0.2f, 0.4f, 0.6f) ,
176 SkVector3::Make(x - 50,
177 350 - y,
178 fLightDepth),
179 1024));
180
181 builder.add(SkLights::Light::MakePoint(SkColor3f::Make(0.6f, 0.4f, 0.2f) ,
182 SkVector3::Make(x + 50,
183 450 - y,
184 fLightDepth),
185 1024));
186 builder.add(SkLights::Light::MakeDirectional(SkColor3f::Make(0.2f, 0.2f, 0.2f),
187 SkVector3::Make(0.2f, 0.2f, 1.0f)));
188 fLights = builder.finish();
189 }
190
163 void updateFromSelectedSlider() { 191 void updateFromSelectedSlider() {
164 SkScalar newValue = fSliders[fSelectedSlider].fGeometry.fLeft * 192 SkScalar newValue = fSliders[fSelectedSlider].fGeometry.fLeft *
165 fSliders[fSelectedSlider].fScale + 193 fSliders[fSelectedSlider].fScale +
166 fSliders[fSelectedSlider].fOffset; 194 fSliders[fSelectedSlider].fOffset;
167 195
168 switch (fSelectedSlider) { 196 switch (fSelectedSlider) {
169 case 0: 197 case 0:
170 fShadowParams.fShadowRadius = newValue; 198 fShadowParams.fShadowRadius = newValue;
171 break; 199 break;
172 case 1: 200 case 1:
173 fShadowParams.fMinVariance = newValue; 201 fShadowParams.fMinVariance = newValue;
174 break; 202 break;
175 case 2: 203 case 2:
176 fShadowParams.fBiasingConstant = newValue; 204 fShadowParams.fBiasingConstant = newValue;
177 break; 205 break;
178 default: 206 default:
179 break; 207 break;
180 } 208 }
181 } 209 }
182 210
183 bool onClick(Click *click) override { 211 bool onClick(Click *click) override {
184 SkScalar x = click->fCurr.fX; 212 SkScalar x = click->fCurr.fX;
185 SkScalar y = click->fCurr.fY; 213 SkScalar y = click->fCurr.fY;
186 214
187 SkScalar dx = x - click->fPrev.fX; 215 SkScalar dx = x - click->fPrev.fX;
188 SkScalar dy = y - click->fPrev.fY; 216 SkScalar dy = y - click->fPrev.fY;
189 217
190 if (fMoveLight) { 218 if (fMoveLight) {
191 if (dx != 0 || dy != 0) { 219 if (dx != 0 || dy != 0) {
192 float recipX = 1.0f / kWidth; 220 this->updateLights(x, y);
193 float recipY = 1.0f / kHeight;
194
195 SkLights::Builder builder;
196 builder.add(SkLights::Light::MakeDirectional(
197 SkColor3f::Make(0.2f, 0.3f, 0.4f),
198 SkVector3::Make(0.2f + (200.0f - x) * recipX,
199 0.05f + (200.0f - y) * recipY,
200 1.0f)));
201 builder.add(SkLights::Light::MakeDirectional(
202 SkColor3f::Make(0.4f, 0.3f, 0.2f),
203 SkVector3::Make(0.05f + (200.0f - x) * recipX,
204 0.2f + (200.0f - y) * recipY,
205 1.0f)));
206 builder.add(SkLights::Light::MakeAmbient(
207 SkColor3f::Make(0.4f, 0.4f, 0.4f)));
208 fLights = builder.finish();
209
210 fLightsChanged = true; 221 fLightsChanged = true;
211 this->inval(nullptr); 222 this->inval(nullptr);
212 } 223 }
213 return true; 224 return true;
214 } 225 }
215 226
216 if (click->fState == Click::State::kUp_State) { 227 if (click->fState == Click::State::kUp_State) {
217 fSelectedRect = -1; 228 fSelectedRectID = -1;
218 fSelectedSlider = -1; 229 fSelectedSlider = -1;
219 return true; 230 return true;
220 } 231 }
221 232
222 if (fSelectedRect > -1) { 233 if (fSelectedRectID > -1) {
223 fTestRects[fSelectedRect].fGeometry.offset(dx, dy); 234 fTestRects[fSelectedRectID].fGeometry.offset(dx, dy);
224 235
225 fSceneChanged = true; 236 fSceneChanged = true;
226 this->inval(nullptr); 237 this->inval(nullptr);
227 return true; 238 return true;
228 } 239 }
229 240
230 if (fSelectedSlider > -1) { 241 if (fSelectedSlider > -1) {
231 fSliders[fSelectedSlider].fGeometry.offset(dx, 0); 242 fSliders[fSelectedSlider].fGeometry.offset(dx, 0);
232 243
233 this->updateFromSelectedSlider(); 244 this->updateFromSelectedSlider();
234 245
235 fLightsChanged = true; 246 fLightsChanged = true;
236 this->inval(nullptr); 247 this->inval(nullptr);
237 return true; 248 return true;
238 } 249 }
239 250
240 // assume last elements are highest 251 // assume last elements are highest
241 for (int i = kNumTestRects - 1; i >= 0; i--) { 252 for (int i = kNumTestRects - 1; i >= 0; i--) {
242 if (fTestRects[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) { 253 if (fTestRects[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) {
243 fSelectedRect = i; 254 fSelectedRectID = i;
244 fTestRects[i].fGeometry.offset(dx, dy); 255 fTestRects[i].fGeometry.offset(dx, dy);
245 256
246 fSceneChanged = true; 257 fSceneChanged = true;
247 this->inval(nullptr); 258 this->inval(nullptr);
248 break; 259 break;
249 } 260 }
250 } 261 }
251 262
252 for (int i = 0; i <= kNumSliders; i++) { 263 for (int i = 0; i <= kNumSliders; i++) {
253 if (fSliders[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) { 264 if (fSliders[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) {
(...skipping 12 matching lines...) Expand all
266 return true; 277 return true;
267 } 278 }
268 279
269 private: 280 private:
270 static constexpr int kNumTestRects = 3; 281 static constexpr int kNumTestRects = 3;
271 static constexpr int kNumSliders = 3; 282 static constexpr int kNumSliders = 3;
272 283
273 static const int kWidth = 400; 284 static const int kWidth = 400;
274 static const int kHeight = 400; 285 static const int kHeight = 400;
275 286
287 bool fSceneChanged;
288 bool fLightsChanged;
289 bool fMoveLight;
290 bool fClearShadowMaps;
291
276 struct { 292 struct {
277 SkRect fGeometry; 293 SkRect fGeometry;
278 int fDepth; 294 int fDepth;
279 SkColor fColor; 295 SkColor fColor;
280 } fTestRects[kNumTestRects]; 296 } fTestRects[kNumTestRects];
281 int fSelectedRect; 297 int fSelectedRectID;
282 298
283 struct { 299 struct {
284 SkRect fGeometry; 300 SkRect fGeometry;
285 SkScalar fOffset; 301 SkScalar fOffset;
286 SkScalar fScale; 302 SkScalar fScale;
287 } fSliders[kNumSliders]; 303 } fSliders[kNumSliders];
288 int fSelectedSlider; 304 int fSelectedSlider;
289 305
290 bool fClearShadowMaps; 306 SkScalar fLightDepth;
291 bool fMoveLight;
292 bool fSceneChanged;
293 bool fLightsChanged;
294 307
295 sk_sp<SkPicture> fPicture; 308 sk_sp<SkPicture> fPicture;
296 SkShadowParams fShadowParams; 309 SkShadowParams fShadowParams;
297 sk_sp<SkLights> fLights; 310 sk_sp<SkLights> fLights;
298 311
299 typedef SampleView INHERITED; 312 typedef SampleView INHERITED;
300 }; 313 };
301 314
302 ////////////////////////////////////////////////////////////////////////////// 315 //////////////////////////////////////////////////////////////////////////////
303 static SkView* MyFactory() { return new ShadowingView; } 316 static SkView* MyFactory() { return new ShadowingView; }
304 static SkViewRegister reg(MyFactory); 317 static SkViewRegister reg(MyFactory);
305 318
306 #endif 319 #endif
OLDNEW
« no previous file with comments | « include/core/SkLights.h ('k') | src/core/SkLights.cpp » ('j') | src/core/SkShadowShader.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698