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

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: Made req changes; added some sliders Created 4 years, 4 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.fShadowType = 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':
89 if (fShadowParams.fShadowType == SkShadowParams::kVariance_B lurAlgorithm) {
90 fShadowParams.fShadowType = SkShadowParams::kNoBlur_Blur Algorithm;
91 } else if (fShadowParams.fShadowType ==
92 SkShadowParams::kNoBlur_BlurAlgorithm) {
93 fShadowParams.fShadowType = SkShadowParams::kVariance_Bl urAlgorithm;
94 }
95 fLightsChanged = true;
70 default: 96 default:
71 break; 97 break;
72 } 98 }
73 } 99 }
74 return this->INHERITED::onQuery(evt); 100 return this->INHERITED::onQuery(evt);
75 } 101 }
76 102
77 sk_sp<SkPicture> makeTestPicture(int width, int height) { 103 sk_sp<SkPicture> makeTestPicture(int width, int height) {
78 SkPictureRecorder recorder; 104 SkPictureRecorder recorder;
79 105
(...skipping 26 matching lines...) Expand all
106 132
107 void onDrawContent(SkCanvas *canvas) override { 133 void onDrawContent(SkCanvas *canvas) override {
108 if (fSceneChanged) { 134 if (fSceneChanged) {
109 fPicture = this->makeTestPicture(kWidth, kHeight); 135 fPicture = this->makeTestPicture(kWidth, kHeight);
110 } 136 }
111 137
112 if (fSceneChanged || fLightsChanged || fClearShadowMaps) { 138 if (fSceneChanged || fLightsChanged || fClearShadowMaps) {
113 for (int i = 0; i < fLights->numLights(); i++) { 139 for (int i = 0; i < fLights->numLights(); i++) {
114 fLights->light(i).setShadowMap(nullptr); 140 fLights->light(i).setShadowMap(nullptr);
115 } 141 }
142
116 fSceneChanged = false; 143 fSceneChanged = false;
117 fLightsChanged = false; 144 fLightsChanged = false;
118 fClearShadowMaps = false; 145 fClearShadowMaps = false;
146 }
119 147
120 canvas->setLights(fLights); 148 canvas->setLights(fLights);
121 canvas->drawShadowedPicture(fPicture, nullptr, nullptr); 149 canvas->drawShadowedPicture(fPicture, nullptr, nullptr, fShadowParams);
150
151 for (int i = 0; i < kNumSliders; i++) {
152 SkPaint paint;
153 paint.setColor(SK_ColorBLACK);
154 canvas->drawRect(fSliders[i].fGeometry, paint);
122 } 155 }
123 } 156 }
124 157
125 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) ove rride { 158 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) ove rride {
126 return new SkView::Click(this); 159 return new SkView::Click(this);
127 } 160 }
128 161
129 bool onClick(Click *click) override { 162 bool onClick(Click *click) override {
130 SkScalar x = click->fCurr.fX; 163 SkScalar x = click->fCurr.fX;
131 SkScalar y = click->fCurr.fY; 164 SkScalar y = click->fCurr.fY;
(...skipping 19 matching lines...) Expand all
151 fLights = builder.finish(); 184 fLights = builder.finish();
152 185
153 fLightsChanged = true; 186 fLightsChanged = true;
154 this->inval(nullptr); 187 this->inval(nullptr);
155 } 188 }
156 return true; 189 return true;
157 } 190 }
158 191
159 if (click->fState == Click::State::kUp_State) { 192 if (click->fState == Click::State::kUp_State) {
160 fSelectedRect = -1; 193 fSelectedRect = -1;
194 fSelectedSlider = -1;
161 return true; 195 return true;
162 } 196 }
163 197
164 if (fSelectedRect > -1) { 198 if (fSelectedRect > -1) {
165 fTestRects[fSelectedRect].fGeometry.offset(dx, dy); 199 fTestRects[fSelectedRect].fGeometry.offset(dx, dy);
166 200
167 fSceneChanged = true; 201 fSceneChanged = true;
168 this->inval(nullptr); 202 this->inval(nullptr);
169 return true; 203 return true;
170 } 204 }
171 205
206 if (fSelectedSlider > -1) {
207 fSliders[fSelectedSlider].fGeometry.offset(dx, 0);
208
209 SkScalar newValue = fSliders[fSelectedSlider].fGeometry.fLeft *
210 fSliders[fSelectedSlider].fScale +
211 fSliders[fSelectedSlider].fOffset;
212
213 switch (fSelectedSlider) {
214 case 0:
215 fShadowParams.fShadowRadius = newValue;
216 break;
217 case 1:
218 fShadowParams.fMinVariance = newValue;
219 break;
220 case 2:
221 fShadowParams.fBiasingConstant = newValue;
222 break;
223 default:
224 break;
225 }
226
227 fLightsChanged = true;
228 this->inval(nullptr);
229 return true;
230 }
231
172 // assume last elements are highest 232 // assume last elements are highest
173 for (int i = kNumTestRects - 1; i >= 0; i--) { 233 for (int i = kNumTestRects - 1; i >= 0; i--) {
174 if (fTestRects[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) { 234 if (fTestRects[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) {
175 fSelectedRect = i; 235 fSelectedRect = i;
176 fTestRects[i].fGeometry.offset(dx, dy); 236 fTestRects[i].fGeometry.offset(dx, dy);
177 237
178 fSceneChanged = true; 238 fSceneChanged = true;
179 this->inval(nullptr); 239 this->inval(nullptr);
180 break; 240 break;
181 } 241 }
182 } 242 }
183 243
244 for (int i = 0; i <= kNumSliders; i++) {
245 if (fSliders[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) {
246 fSelectedSlider = i;
247 fSliders[i].fGeometry.offset(dx, dy);
248
249 SkScalar newValue = fSliders[fSelectedSlider].fGeometry.fLeft *
250 fSliders[fSelectedSlider].fScale +
251 fSliders[fSelectedSlider].fOffset;
252
253 switch (fSelectedSlider) {
254 case 0:
255 fShadowParams.fShadowRadius = newValue;
256 break;
257 case 1:
258 fShadowParams.fMinVariance = newValue;
259 break;
260 case 2:
261 fShadowParams.fBiasingConstant = newValue;
262 break;
263 default:
264 break;
265 }
266
267 fLightsChanged = true;
268
269 this->inval(nullptr);
270 break;
271 }
272 }
273
184 return true; 274 return true;
185 } 275 }
186 276
187 private: 277 private:
188 static constexpr int kNumTestRects = 3; 278 static constexpr int kNumTestRects = 3;
279 static constexpr int kNumSliders = 3;
189 280
190 static const int kWidth = 400; 281 static const int kWidth = 400;
191 static const int kHeight = 400; 282 static const int kHeight = 400;
192 bool fClearShadowMaps;
193 283
194 struct { 284 struct {
195 SkRect fGeometry; 285 SkRect fGeometry;
196 int fDepth; 286 int fDepth;
197 SkColor fColor; 287 SkColor fColor;
198 } fTestRects[kNumTestRects]; 288 } fTestRects[kNumTestRects];
289 int fSelectedRect;
199 290
200 int fSelectedRect; 291 struct {
292 SkRect fGeometry;
293 SkScalar fOffset;
294 SkScalar fScale;
295 } fSliders[kNumSliders];
296 int fSelectedSlider;
297
298 bool fClearShadowMaps;
201 bool fMoveLight; 299 bool fMoveLight;
202
203 sk_sp<SkPicture> fPicture;
204
205 bool fSceneChanged; 300 bool fSceneChanged;
206 bool fLightsChanged; 301 bool fLightsChanged;
207 302
303 sk_sp<SkPicture> fPicture;
304 SkShadowParams fShadowParams;
208 sk_sp<SkLights> fLights; 305 sk_sp<SkLights> fLights;
209 306
210 typedef SampleView INHERITED; 307 typedef SampleView INHERITED;
211 }; 308 };
212 309
213 ////////////////////////////////////////////////////////////////////////////// 310 //////////////////////////////////////////////////////////////////////////////
214 static SkView* MyFactory() { return new ShadowingView; } 311 static SkView* MyFactory() { return new ShadowingView; }
215 static SkViewRegister reg(MyFactory); 312 static SkViewRegister reg(MyFactory);
216 313
217 #endif 314 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698