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

Unified Diff: samplecode/SampleLitAtlas.cpp

Issue 2032263004: Add ability to rotate light direction in drawLitAtlas Sample slide (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/core/SkLightingShader.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: samplecode/SampleLitAtlas.cpp
diff --git a/samplecode/SampleLitAtlas.cpp b/samplecode/SampleLitAtlas.cpp
index 4f989af1ae026f5fdb7a9511bcf0d24a2cc3668d..f1d67e5c7933b0050e491e51c0d974898e810268 100644
--- a/samplecode/SampleLitAtlas.cpp
+++ b/samplecode/SampleLitAtlas.cpp
@@ -21,7 +21,8 @@ class DrawLitAtlasDrawable : public SkDrawable {
public:
DrawLitAtlasDrawable(const SkRect& r)
: fBounds(r)
- , fUseColors(false) {
+ , fUseColors(false)
+ , fLightDir(SkVector3::Make(1.0f, 0.0f, 0.0f)) {
fAtlas = MakeAtlas();
SkRandom rand;
@@ -31,19 +32,25 @@ public:
fShip.initShip(fBounds, &fDiffTex[kNumAsteroids], &fNormTex[kNumAsteroids]);
- SkLights::Builder builder;
-
- builder.add(SkLights::Light(SkColor3f::Make(1.0f, 1.0f, 1.0f),
- SkVector3::Make(1.0f, 0.0f, 0.0f)));
- builder.add(SkLights::Light(SkColor3f::Make(0.2f, 0.2f, 0.2f)));
-
- fLights = builder.finish();
+ this->updateLights();
}
void toggleUseColors() {
fUseColors = !fUseColors;
}
+ void rotateLight() {
+ SkScalar c;
+ SkScalar s = SkScalarSinCos(SK_ScalarPI/6.0f, &c);
+
+ SkScalar newX = c * fLightDir.fX - s * fLightDir.fY;
+ SkScalar newY = s * fLightDir.fX + c * fLightDir.fY;
+
+ fLightDir.set(newX, newY, 0.0f);
+
+ this->updateLights();
+ }
+
void left() {
SkScalar newRot = SkScalarMod(fShip.rot() + (2*SK_ScalarPI - SK_ScalarPI/32.0f),
2 * SK_ScalarPI);
@@ -91,7 +98,9 @@ protected:
#ifdef SK_DEBUG
canvas->drawBitmap(fAtlas, 0, 0); // just to see the atlas
-#endif
+
+ this->drawLightDir(canvas, fBounds.centerX(), fBounds.centerY());
+#endif
#if 0
// TODO: revitalize when drawLitAtlas API lands
@@ -121,6 +130,7 @@ protected:
// TODO: correctly pull out the pure rotation
SkVector invNormRotation = { m[SkMatrix::kMScaleX], m[SkMatrix::kMSkewY] };
+ SkASSERT(SkScalarNearlyEqual(invNormRotation.lengthSqd(), SK_Scalar1));
paint.setShader(SkLightingShader::Make(fAtlas, fAtlas, fLights,
invNormRotation, &diffMat, &normalMat));
@@ -165,6 +175,36 @@ private:
static const int kObjTypeCount = kLast_ObjType + 1;
+ void updateLights() {
+ SkLights::Builder builder;
+
+ builder.add(SkLights::Light(SkColor3f::Make(1.0f, 1.0f, 1.0f), fLightDir));
+ builder.add(SkLights::Light(SkColor3f::Make(0.2f, 0.2f, 0.2f)));
+
+ fLights = builder.finish();
+ }
+
+#ifdef SK_DEBUG
+ // Draw a vector to the light
+ void drawLightDir(SkCanvas* canvas, SkScalar centerX, SkScalar centerY) {
+ static const int kBgLen = 30;
+ static const int kSmLen = 5;
+
+ // TODO: change the lighting coordinate system to be right handed
+ SkPoint p1 = SkPoint::Make(centerX + kBgLen * fLightDir.fX,
+ centerY - kBgLen * fLightDir.fY);
+ SkPoint p2 = SkPoint::Make(centerX + (kBgLen-kSmLen) * fLightDir.fX,
+ centerY - (kBgLen-kSmLen) * fLightDir.fY);
+
+ SkPaint p;
+ canvas->drawLine(centerX, centerY, p1.fX, p1.fY, p);
+ canvas->drawLine(p1.fX, p1.fY,
+ p2.fX - kSmLen * fLightDir.fY, p2.fY - kSmLen * fLightDir.fX, p);
+ canvas->drawLine(p1.fX, p1.fY,
+ p2.fX + kSmLen * fLightDir.fY, p2.fY + kSmLen * fLightDir.fX, p);
+ }
+#endif
+
// Create the mixed diffuse & normal atlas
//
// big color circle | big normal hemi
@@ -398,6 +438,7 @@ private:
SkRect fNormTex[kNumAsteroids+kNumShips];
SkRect fBounds;
bool fUseColors;
+ SkVector3 fLightDir;
sk_sp<SkLights> fLights;
typedef SkDrawable INHERITED;
@@ -434,6 +475,10 @@ protected:
fDrawable->right();
this->inval(NULL);
return true;
+ case 'o':
+ fDrawable->rotateLight();
+ this->inval(NULL);
+ return true;
default:
break;
}
« no previous file with comments | « no previous file | src/core/SkLightingShader.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698