|  | /* | 
|  | * Copyright 2015 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "DecodeFile.h" | 
|  | #include "Sample.h" | 
|  | #include "Resources.h" | 
|  | #include "SkCanvas.h" | 
|  | #include "SkLightingShader.h" | 
|  | #include "SkNormalSource.h" | 
|  | #include "SkPoint3.h" | 
|  |  | 
|  | static sk_sp<SkLights> create_lights(SkScalar angle, SkScalar blue) { | 
|  |  | 
|  | const SkVector3 dir = SkVector3::Make(SkScalarSin(angle)*SkScalarSin(SK_ScalarPI*0.25f), | 
|  | SkScalarCos(angle)*SkScalarSin(SK_ScalarPI*0.25f), | 
|  | SkScalarCos(SK_ScalarPI*0.25f)); | 
|  |  | 
|  | SkLights::Builder builder; | 
|  |  | 
|  | builder.add(SkLights::Light::MakeDirectional(SkColor3f::Make(1.0f, 1.0f, blue), dir)); | 
|  | builder.setAmbientLightColor(SkColor3f::Make(0.1f, 0.1f, 0.1f)); | 
|  |  | 
|  | return builder.finish(); | 
|  | } | 
|  |  | 
|  | //////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | class LightingView : public Sample { | 
|  | public: | 
|  | LightingView() : fLightAngle(0.0f) , fColorFactor(0.0f) { | 
|  | { | 
|  | SkBitmap diffuseBitmap; | 
|  | SkAssertResult(GetResourceAsBitmap("images/brickwork-texture.jpg", &diffuseBitmap)); | 
|  |  | 
|  | fRect = SkRect::MakeIWH(diffuseBitmap.width(), diffuseBitmap.height()); | 
|  |  | 
|  | fDiffuseShader = SkShader::MakeBitmapShader(diffuseBitmap, | 
|  | SkShader::kClamp_TileMode, | 
|  | SkShader::kClamp_TileMode, | 
|  | nullptr); | 
|  | } | 
|  |  | 
|  | { | 
|  | SkBitmap normalBitmap; | 
|  | SkAssertResult(GetResourceAsBitmap("images/brickwork_normal-map.jpg", &normalBitmap)); | 
|  |  | 
|  | sk_sp<SkShader> normalMap = SkShader::MakeBitmapShader(normalBitmap, | 
|  | SkShader::kClamp_TileMode, | 
|  | SkShader::kClamp_TileMode, | 
|  | nullptr); | 
|  | fNormalSource = SkNormalSource::MakeFromNormalMap(std::move(normalMap), SkMatrix::I()); | 
|  | } | 
|  | } | 
|  |  | 
|  | protected: | 
|  | bool onQuery(Sample::Event* evt) override { | 
|  | if (Sample::TitleQ(*evt)) { | 
|  | Sample::TitleR(evt, "Lighting"); | 
|  | return true; | 
|  | } | 
|  | return this->INHERITED::onQuery(evt); | 
|  | } | 
|  |  | 
|  | void onDrawContent(SkCanvas* canvas) override { | 
|  | sk_sp<SkLights> lights(create_lights(fLightAngle, fColorFactor)); | 
|  |  | 
|  | SkPaint paint; | 
|  | paint.setShader(SkLightingShader::Make(fDiffuseShader, | 
|  | fNormalSource, | 
|  | std::move(lights))); | 
|  | paint.setColor(SK_ColorBLACK); | 
|  |  | 
|  | canvas->drawRect(fRect, paint); | 
|  | } | 
|  |  | 
|  | Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override { | 
|  | return this->INHERITED::onFindClickHandler(x, y, modi); | 
|  | } | 
|  |  | 
|  | bool onAnimate(const SkAnimTimer& timer) override { | 
|  | fLightAngle += 0.015f; | 
|  | fColorFactor += 0.01f; | 
|  | if (fColorFactor > 1.0f) { | 
|  | fColorFactor = 0.0f; | 
|  | } | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | private: | 
|  | SkRect                fRect; | 
|  | sk_sp<SkShader>       fDiffuseShader; | 
|  | sk_sp<SkNormalSource> fNormalSource; | 
|  |  | 
|  | SkScalar              fLightAngle; | 
|  | SkScalar              fColorFactor; | 
|  |  | 
|  | typedef Sample INHERITED; | 
|  | }; | 
|  |  | 
|  | ////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | DEF_SAMPLE( return new LightingView(); ) |