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

Side by Side Diff: samplecode/SampleShadowing.cpp

Issue 2224163005: Made shadows blurry (thru implementing variance mapping) (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: rebased off master again! 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"
(...skipping 20 matching lines...) Expand all
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);
42 fSliders[0].fOffset = 0.0f;
43 fSliders[0].fScale = 0.1f;
44
45 fSliders[1].fGeometry = SkRect::MakeLTRB(100, 420, 110, 440);
46 fSliders[1].fOffset = 0.0f;
47 fSliders[1].fScale = 10.0f;
48
49 fSliders[2].fGeometry = SkRect::MakeLTRB(0, 440, 10, 460);
50 fSliders[2].fOffset = 0.0f;
51 fSliders[2].fScale = 0.0025f;
52
41 fSceneChanged = true; 53 fSceneChanged = true;
42 fLightsChanged = true; 54 fLightsChanged = true;
43 55
44 fSelectedRect = -1; 56 fSelectedRect = -1;
57 fSelectedSlider = -1;
45 fMoveLight = false; 58 fMoveLight = false;
46 59
47 fClearShadowMaps = false; 60 fClearShadowMaps = false;
61
62 fShadowParams.fShadowRadius = 2.0f;
63 fShadowParams.fBiasingConstant = 0.3f;
64 fShadowParams.fMinVariance = 1024;
65 fShadowParams.fType = SkShadowParams::kVariance_BlurAlgorithm;
48 } 66 }
49 67
50 protected: 68 protected:
51 bool onQuery(SkEvent *evt) override { 69 bool onQuery(SkEvent *evt) override {
52 if (SampleCode::TitleQ(*evt)) { 70 if (SampleCode::TitleQ(*evt)) {
53 SampleCode::TitleR(evt, "shadowing"); 71 SampleCode::TitleR(evt, "shadowing");
54 return true; 72 return true;
55 } 73 }
56 74
57 SkUnichar uni; 75 SkUnichar uni;
58 if (SampleCode::CharQ(*evt, &uni)) { 76 if (SampleCode::CharQ(*evt, &uni)) {
59 switch (uni) { 77 switch (uni) {
60 case 'L': 78 case 'L':
61 fMoveLight = !fMoveLight; 79 fMoveLight = !fMoveLight;
62 break; 80 break;
63 case 'd': 81 case 'd':
64 // Raster generated shadow maps have their origin in the UL corner 82 // Raster generated shadow maps have their origin in the UL corner
65 // GPU shadow maps can have an arbitrary origin. 83 // GPU shadow maps can have an arbitrary origin.
66 // We override the 'd' keypress so that when the device is c ycled, 84 // We override the 'd' keypress so that when the device is c ycled,
67 // the shadow maps will be re-generated according to the new backend. 85 // the shadow maps will be re-generated according to the new backend.
68 fClearShadowMaps = true; 86 fClearShadowMaps = true;
69 break; 87 break;
88 case 'B':
robertphillips 2016/08/23 17:19:39 Switch the order of these so the writeable one is
vjiaoblack 2016/08/23 18:01:21 Done.
89 if (fShadowParams.fType == SkShadowParams::kVariance_BlurAlg orithm) {
90 fShadowParams.fType = SkShadowParams::kNoBlur_BlurAlgori thm;
91 } else if (fShadowParams.fType ==
92 SkShadowParams::kNoBlur_BlurAlgorithm) {
93 fShadowParams.fType = SkShadowParams::kVariance_BlurAlgo rithm;
94 }
95 fLightsChanged = true;
96 break;
70 default: 97 default:
71 break; 98 break;
72 } 99 }
73 } 100 }
74 return this->INHERITED::onQuery(evt); 101 return this->INHERITED::onQuery(evt);
75 } 102 }
76 103
77 sk_sp<SkPicture> makeTestPicture(int width, int height) { 104 sk_sp<SkPicture> makeTestPicture(int width, int height) {
78 SkPictureRecorder recorder; 105 SkPictureRecorder recorder;
79 106
(...skipping 26 matching lines...) Expand all
106 133
107 void onDrawContent(SkCanvas *canvas) override { 134 void onDrawContent(SkCanvas *canvas) override {
108 if (fSceneChanged) { 135 if (fSceneChanged) {
109 fPicture = this->makeTestPicture(kWidth, kHeight); 136 fPicture = this->makeTestPicture(kWidth, kHeight);
110 } 137 }
111 138
112 if (fSceneChanged || fLightsChanged || fClearShadowMaps) { 139 if (fSceneChanged || fLightsChanged || fClearShadowMaps) {
113 for (int i = 0; i < fLights->numLights(); i++) { 140 for (int i = 0; i < fLights->numLights(); i++) {
114 fLights->light(i).setShadowMap(nullptr); 141 fLights->light(i).setShadowMap(nullptr);
115 } 142 }
143
116 fSceneChanged = false; 144 fSceneChanged = false;
117 fLightsChanged = false; 145 fLightsChanged = false;
118 fClearShadowMaps = false; 146 fClearShadowMaps = false;
119 } 147 }
120 148
121 canvas->setLights(fLights); 149 canvas->setLights(fLights);
122 canvas->drawShadowedPicture(fPicture, nullptr, nullptr); 150 canvas->drawShadowedPicture(fPicture, nullptr, nullptr, fShadowParams);
151
152 for (int i = 0; i < kNumSliders; i++) {
153 SkPaint paint;
154 paint.setColor(SK_ColorBLACK);
155 canvas->drawRect(fSliders[i].fGeometry, paint);
156 }
123 } 157 }
124 158
125 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) ove rride { 159 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) ove rride {
126 return new SkView::Click(this); 160 return new SkView::Click(this);
127 } 161 }
128 162
129 bool onClick(Click *click) override { 163 bool onClick(Click *click) override {
130 SkScalar x = click->fCurr.fX; 164 SkScalar x = click->fCurr.fX;
131 SkScalar y = click->fCurr.fY; 165 SkScalar y = click->fCurr.fY;
132 166
(...skipping 21 matching lines...) Expand all
154 fLights = builder.finish(); 188 fLights = builder.finish();
155 189
156 fLightsChanged = true; 190 fLightsChanged = true;
157 this->inval(nullptr); 191 this->inval(nullptr);
158 } 192 }
159 return true; 193 return true;
160 } 194 }
161 195
162 if (click->fState == Click::State::kUp_State) { 196 if (click->fState == Click::State::kUp_State) {
163 fSelectedRect = -1; 197 fSelectedRect = -1;
198 fSelectedSlider = -1;
164 return true; 199 return true;
165 } 200 }
166 201
167 if (fSelectedRect > -1) { 202 if (fSelectedRect > -1) {
168 fTestRects[fSelectedRect].fGeometry.offset(dx, dy); 203 fTestRects[fSelectedRect].fGeometry.offset(dx, dy);
169 204
170 fSceneChanged = true; 205 fSceneChanged = true;
171 this->inval(nullptr); 206 this->inval(nullptr);
172 return true; 207 return true;
173 } 208 }
174 209
210 if (fSelectedSlider > -1) {
211 fSliders[fSelectedSlider].fGeometry.offset(dx, 0);
212
213 SkScalar newValue = fSliders[fSelectedSlider].fGeometry.fLeft *
214 fSliders[fSelectedSlider].fScale +
215 fSliders[fSelectedSlider].fOffset;
216
217 switch (fSelectedSlider) {
218 case 0:
219 fShadowParams.fShadowRadius = newValue;
220 break;
221 case 1:
222 fShadowParams.fMinVariance = newValue;
223 break;
224 case 2:
225 fShadowParams.fBiasingConstant = newValue;
226 break;
227 default:
228 break;
229 }
230
231 fLightsChanged = true;
232 this->inval(nullptr);
233 return true;
234 }
235
175 // assume last elements are highest 236 // assume last elements are highest
176 for (int i = kNumTestRects - 1; i >= 0; i--) { 237 for (int i = kNumTestRects - 1; i >= 0; i--) {
177 if (fTestRects[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) { 238 if (fTestRects[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) {
178 fSelectedRect = i; 239 fSelectedRect = i;
179 fTestRects[i].fGeometry.offset(dx, dy); 240 fTestRects[i].fGeometry.offset(dx, dy);
180 241
181 fSceneChanged = true; 242 fSceneChanged = true;
182 this->inval(nullptr); 243 this->inval(nullptr);
183 break; 244 break;
184 } 245 }
185 } 246 }
186 247
248 for (int i = 0; i <= kNumSliders; i++) {
249 if (fSliders[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) {
250 fSelectedSlider = i;
robertphillips 2016/08/23 17:19:40 Can we add a subroutine to share this code with th
vjiaoblack 2016/08/23 18:01:21 Done.
251 fSliders[i].fGeometry.offset(dx, dy);
252
253 SkScalar newValue = fSliders[fSelectedSlider].fGeometry.fLeft *
254 fSliders[fSelectedSlider].fScale +
255 fSliders[fSelectedSlider].fOffset;
256
257 switch (fSelectedSlider) {
258 case 0:
259 fShadowParams.fShadowRadius = newValue;
260 break;
261 case 1:
262 fShadowParams.fMinVariance = newValue;
263 break;
264 case 2:
265 fShadowParams.fBiasingConstant = newValue;
266 break;
267 default:
268 break;
269 }
270
271 fLightsChanged = true;
272
273 this->inval(nullptr);
274 break;
275 }
276 }
277
187 return true; 278 return true;
188 } 279 }
189 280
190 private: 281 private:
191 static constexpr int kNumTestRects = 3; 282 static constexpr int kNumTestRects = 3;
283 static constexpr int kNumSliders = 3;
192 284
193 static const int kWidth = 400; 285 static const int kWidth = 400;
194 static const int kHeight = 400; 286 static const int kHeight = 400;
195 bool fClearShadowMaps;
196 287
197 struct { 288 struct {
198 SkRect fGeometry; 289 SkRect fGeometry;
199 int fDepth; 290 int fDepth;
200 SkColor fColor; 291 SkColor fColor;
201 } fTestRects[kNumTestRects]; 292 } fTestRects[kNumTestRects];
293 int fSelectedRect;
202 294
203 int fSelectedRect; 295 struct {
296 SkRect fGeometry;
297 SkScalar fOffset;
298 SkScalar fScale;
299 } fSliders[kNumSliders];
300 int fSelectedSlider;
301
302 bool fClearShadowMaps;
204 bool fMoveLight; 303 bool fMoveLight;
205
206 sk_sp<SkPicture> fPicture;
207
208 bool fSceneChanged; 304 bool fSceneChanged;
209 bool fLightsChanged; 305 bool fLightsChanged;
210 306
307 sk_sp<SkPicture> fPicture;
308 SkShadowParams fShadowParams;
211 sk_sp<SkLights> fLights; 309 sk_sp<SkLights> fLights;
212 310
213 typedef SampleView INHERITED; 311 typedef SampleView INHERITED;
214 }; 312 };
215 313
216 ////////////////////////////////////////////////////////////////////////////// 314 //////////////////////////////////////////////////////////////////////////////
217 static SkView* MyFactory() { return new ShadowingView; } 315 static SkView* MyFactory() { return new ShadowingView; }
218 static SkViewRegister reg(MyFactory); 316 static SkViewRegister reg(MyFactory);
219 317
220 #endif 318 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698