Chromium Code Reviews| Index: src/core/SkShadowShader.cpp |
| diff --git a/src/core/SkShadowShader.cpp b/src/core/SkShadowShader.cpp |
| index 49f1b01b32bed14bec12782e514cbe5fa02f3a40..9055fa058db5a717d3a5bb4e3c29f03f5e1fa7bb 100644 |
| --- a/src/core/SkShadowShader.cpp |
| +++ b/src/core/SkShadowShader.cpp |
| @@ -111,38 +111,26 @@ public: |
| const SkShadowParams& params, |
| GrContext* context) { |
| - // fuse all ambient lights into a single one |
| - fAmbientColor.set(0.0f, 0.0f, 0.0f); |
| + fAmbientColor = lights->ambientLightColor(); |
|
robertphillips
2016/08/26 17:31:28
the old name was more descriptive of what is going
vjiaoblack
2016/08/26 18:10:38
Done.
|
| - fNumNonAmbLights = 0; // count of non-ambient lights |
| + fNumLights = 0; // count of non-ambient lights |
| for (int i = 0; i < lights->numLights(); ++i) { |
| - if (SkLights::Light::kAmbient_LightType == lights->light(i).type()) { |
| - fAmbientColor += lights->light(i).color(); |
| - } else if (fNumNonAmbLights < SkShadowShader::kMaxNonAmbientLights) { |
| - fLightColor[fNumNonAmbLights] = lights->light(i).color(); |
| - if (lights->light(i).type() == SkLights::Light::kPoint_LightType) { |
| - fLightDirOrPos[fNumNonAmbLights] = lights->light(i).pos(); |
| - fLightIntensity[fNumNonAmbLights] = lights->light(i).intensity(); |
| - } else { |
| - fLightDirOrPos[fNumNonAmbLights] = lights->light(i).dir(); |
| - fLightIntensity[fNumNonAmbLights] = 0.0f; |
| - } |
| - fIsPointLight[fNumNonAmbLights] = |
| - SkLights::Light::kPoint_LightType == lights->light(i).type(); |
| - |
| + if (fNumLights < SkShadowShader::kMaxLights) { |
| + fLightColor[fNumLights] = lights->light(i).color(); |
|
robertphillips
2016/08/26 17:31:29
Won't this fail an assert ?
vjiaoblack
2016/08/26 18:10:38
Done.
|
| + fLightDirOrPos[fNumLights] = lights->light(i).dir(); |
| SkImage_Base* shadowMap = ((SkImage_Base*)lights->light(i).getShadowMap()); |
| // gets deleted when the ShadowFP is destroyed, and frees the GrTexture* |
| - fTexture[fNumNonAmbLights] = sk_sp<GrTexture>(shadowMap->asTextureRef(context, |
| + fTexture[fNumLights] = sk_sp<GrTexture>(shadowMap->asTextureRef(context, |
| GrTextureParams::ClampNoFilter(), |
| SkSourceGammaTreatment::kIgnore)); |
| - fDepthMapAccess[fNumNonAmbLights].reset(fTexture[fNumNonAmbLights].get()); |
| - this->addTextureAccess(&fDepthMapAccess[fNumNonAmbLights]); |
| + fDepthMapAccess[fNumLights].reset(fTexture[fNumLights].get()); |
| + this->addTextureAccess(&fDepthMapAccess[fNumLights]); |
| - fDepthMapHeight[fNumNonAmbLights] = shadowMap->height(); |
| - fDepthMapWidth[fNumNonAmbLights] = shadowMap->width(); |
| + fDepthMapHeight[fNumLights] = shadowMap->height(); |
| + fDepthMapWidth[fNumLights] = shadowMap->width(); |
| - fNumNonAmbLights++; |
| + fNumLights++; |
| } |
| } |
| @@ -165,22 +153,22 @@ public: |
| GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
| const ShadowFP& shadowFP = args.fFp.cast<ShadowFP>(); |
| - SkASSERT(shadowFP.fNumNonAmbLights <= SkShadowShader::kMaxNonAmbientLights); |
| + SkASSERT(shadowFP.fNumLights <= SkShadowShader::kMaxLights); |
| // add uniforms |
| - int32_t numLights = shadowFP.fNumNonAmbLights; |
| - SkASSERT(numLights <= SkShadowShader::kMaxNonAmbientLights); |
| + int32_t numLights = shadowFP.fNumLights; |
| + SkASSERT(numLights <= SkShadowShader::kMaxLights); |
| int blurAlgorithm = shadowFP.fShadowParams.fType; |
| - const char* lightDirOrPosUniName[SkShadowShader::kMaxNonAmbientLights] = {nullptr}; |
| - const char* lightColorUniName[SkShadowShader::kMaxNonAmbientLights] = {nullptr}; |
| - const char* lightIntensityUniName[SkShadowShader::kMaxNonAmbientLights] = {nullptr}; |
| + const char* lightDirOrPosUniName[SkShadowShader::kMaxLights] = {nullptr}; |
| + const char* lightColorUniName[SkShadowShader::kMaxLights] = {nullptr}; |
| + const char* lightIntensityUniName[SkShadowShader::kMaxLights] = {nullptr}; |
| - const char* depthMapWidthUniName[SkShadowShader::kMaxNonAmbientLights] = {nullptr}; |
| - const char* depthMapHeightUniName[SkShadowShader::kMaxNonAmbientLights] = {nullptr}; |
| + const char* depthMapWidthUniName[SkShadowShader::kMaxLights] = {nullptr}; |
| + const char* depthMapHeightUniName[SkShadowShader::kMaxLights] = {nullptr}; |
| - for (int i = 0; i < shadowFP.fNumNonAmbLights; i++) { |
| + for (int i = 0; i < shadowFP.fNumLights; i++) { |
| SkString lightDirOrPosUniNameStr("lightDir"); |
| lightDirOrPosUniNameStr.appendf("%d", i); |
| SkString lightColorUniNameStr("lightColor"); |
| @@ -252,7 +240,7 @@ public: |
| SkString diffuseColor("inDiffuseColor"); |
| this->emitChild(1, nullptr, &diffuseColor, args); |
| - SkString depthMaps[SkShadowShader::kMaxNonAmbientLights]; |
| + SkString depthMaps[SkShadowShader::kMaxLights]; |
| // Multiply by 255 to transform from sampler coordinates to world |
| // coordinates (since 1 channel is 0xFF) |
| @@ -261,7 +249,7 @@ public: |
| widthUniName, heightUniName, povDepth.c_str()); |
| // Applies the offset indexing that goes from our view space into the light's space. |
| - for (int i = 0; i < shadowFP.fNumNonAmbLights; i++) { |
| + for (int i = 0; i < shadowFP.fNumLights; i++) { |
| SkString povCoord("povCoord"); |
| povCoord.appendf("%d", i); |
| @@ -399,9 +387,9 @@ public: |
| static void GenKey(const GrProcessor& proc, const GrGLSLCaps&, |
| GrProcessorKeyBuilder* b) { |
| const ShadowFP& shadowFP = proc.cast<ShadowFP>(); |
| - b->add32(shadowFP.fNumNonAmbLights); |
| + b->add32(shadowFP.fNumLights); |
| int isPL = 0; |
| - for (int i = 0; i < SkShadowShader::kMaxNonAmbientLights; i++) { |
| + for (int i = 0; i < SkShadowShader::kMaxLights; i++) { |
| isPL = isPL | ((shadowFP.fIsPointLight[i] ? 1 : 0) << i); |
| } |
| b->add32(isPL); |
| @@ -474,25 +462,25 @@ public: |
| } |
| private: |
| - SkVector3 fLightDirOrPos[SkShadowShader::kMaxNonAmbientLights]; |
| + SkVector3 fLightDirOrPos[SkShadowShader::kMaxLights]; |
| GrGLSLProgramDataManager::UniformHandle |
| - fLightDirOrPosUni[SkShadowShader::kMaxNonAmbientLights]; |
| + fLightDirOrPosUni[SkShadowShader::kMaxLights]; |
| - SkColor3f fLightColor[SkShadowShader::kMaxNonAmbientLights]; |
| + SkColor3f fLightColor[SkShadowShader::kMaxLights]; |
| GrGLSLProgramDataManager::UniformHandle |
| - fLightColorUni[SkShadowShader::kMaxNonAmbientLights]; |
| + fLightColorUni[SkShadowShader::kMaxLights]; |
| - SkScalar fLightIntensity[SkShadowShader::kMaxNonAmbientLights]; |
| + SkScalar fLightIntensity[SkShadowShader::kMaxLights]; |
| GrGLSLProgramDataManager::UniformHandle |
| - fLightIntensityUni[SkShadowShader::kMaxNonAmbientLights]; |
| + fLightIntensityUni[SkShadowShader::kMaxLights]; |
| - int fDepthMapWidth[SkShadowShader::kMaxNonAmbientLights]; |
| + int fDepthMapWidth[SkShadowShader::kMaxLights]; |
| GrGLSLProgramDataManager::UniformHandle |
| - fDepthMapWidthUni[SkShadowShader::kMaxNonAmbientLights]; |
| + fDepthMapWidthUni[SkShadowShader::kMaxLights]; |
| - int fDepthMapHeight[SkShadowShader::kMaxNonAmbientLights]; |
| + int fDepthMapHeight[SkShadowShader::kMaxLights]; |
| GrGLSLProgramDataManager::UniformHandle |
| - fDepthMapHeightUni[SkShadowShader::kMaxNonAmbientLights]; |
| + fDepthMapHeightUni[SkShadowShader::kMaxLights]; |
| int fWidth; |
| GrGLSLProgramDataManager::UniformHandle fWidthUni; |
| @@ -517,31 +505,31 @@ public: |
| void onComputeInvariantOutput(GrInvariantOutput* inout) const override { |
| inout->mulByUnknownFourComponents(); |
| } |
| - int32_t numLights() const { return fNumNonAmbLights; } |
| + int32_t numLights() const { return fNumLights; } |
| const SkColor3f& ambientColor() const { return fAmbientColor; } |
| bool isPointLight(int i) const { |
| - SkASSERT(i < fNumNonAmbLights); |
| + SkASSERT(i < fNumLights); |
| return fIsPointLight[i]; |
| } |
| const SkVector3& lightDirOrPos(int i) const { |
| - SkASSERT(i < fNumNonAmbLights); |
| + SkASSERT(i < fNumLights); |
| return fLightDirOrPos[i]; |
| } |
| const SkVector3& lightColor(int i) const { |
| - SkASSERT(i < fNumNonAmbLights); |
| + SkASSERT(i < fNumLights); |
| return fLightColor[i]; |
| } |
| SkScalar lightIntensity(int i) const { |
| - SkASSERT(i < fNumNonAmbLights); |
| + SkASSERT(i < fNumLights); |
| return fLightIntensity[i]; |
| } |
| int depthMapWidth(int i) const { |
| - SkASSERT(i < fNumNonAmbLights); |
| + SkASSERT(i < fNumLights); |
| return fDepthMapWidth[i]; |
| } |
| int depthMapHeight(int i) const { |
| - SkASSERT(i < fNumNonAmbLights); |
| + SkASSERT(i < fNumLights); |
| return fDepthMapHeight[i]; |
| } |
| int width() const {return fWidth; } |
| @@ -555,7 +543,7 @@ private: |
| bool onIsEqual(const GrFragmentProcessor& proc) const override { |
| const ShadowFP& shadowFP = proc.cast<ShadowFP>(); |
| if (fAmbientColor != shadowFP.fAmbientColor || |
| - fNumNonAmbLights != shadowFP.fNumNonAmbLights) { |
| + fNumLights != shadowFP.fNumLights) { |
| return false; |
| } |
| @@ -563,7 +551,7 @@ private: |
| return false; |
| } |
| - for (int i = 0; i < fNumNonAmbLights; i++) { |
| + for (int i = 0; i < fNumLights; i++) { |
| if (fLightDirOrPos[i] != shadowFP.fLightDirOrPos[i] || |
| fLightColor[i] != shadowFP.fLightColor[i] || |
| fLightIntensity[i] != shadowFP.fLightIntensity[i] || |
| @@ -580,17 +568,17 @@ private: |
| return true; |
| } |
| - int fNumNonAmbLights; |
| + int fNumLights; |
| - bool fIsPointLight[SkShadowShader::kMaxNonAmbientLights]; |
| - SkVector3 fLightDirOrPos[SkShadowShader::kMaxNonAmbientLights]; |
| - SkColor3f fLightColor[SkShadowShader::kMaxNonAmbientLights]; |
| - SkScalar fLightIntensity[SkShadowShader::kMaxNonAmbientLights]; |
| - GrTextureAccess fDepthMapAccess[SkShadowShader::kMaxNonAmbientLights]; |
| - sk_sp<GrTexture> fTexture[SkShadowShader::kMaxNonAmbientLights]; |
| + bool fIsPointLight[SkShadowShader::kMaxLights]; |
| + SkVector3 fLightDirOrPos[SkShadowShader::kMaxLights]; |
| + SkColor3f fLightColor[SkShadowShader::kMaxLights]; |
| + SkScalar fLightIntensity[SkShadowShader::kMaxLights]; |
| + GrTextureAccess fDepthMapAccess[SkShadowShader::kMaxLights]; |
| + sk_sp<GrTexture> fTexture[SkShadowShader::kMaxLights]; |
| - int fDepthMapWidth[SkShadowShader::kMaxNonAmbientLights]; |
| - int fDepthMapHeight[SkShadowShader::kMaxNonAmbientLights]; |
| + int fDepthMapWidth[SkShadowShader::kMaxLights]; |
| + int fDepthMapHeight[SkShadowShader::kMaxLights]; |
| int fHeight; |
| int fWidth; |
| @@ -697,27 +685,18 @@ void SkShadowShaderImpl::ShadowShaderContext::shadeSpan(int x, int y, |
|
robertphillips
2016/08/26 17:31:29
Again, where does the ambient contribution get add
vjiaoblack
2016/08/26 18:10:38
right at the beginning?
|
| SkColor3f accum = SkColor3f::Make(0.0f, 0.0f, 0.0f); |
| // This is all done in linear unpremul color space (each component 0..255.0f though) |
| + |
| + accum.fX += lightShader.fLights->ambientLightColor().fX * SkColorGetR(diffColor); |
| + accum.fY += lightShader.fLights->ambientLightColor().fY * SkColorGetG(diffColor); |
| + accum.fZ += lightShader.fLights->ambientLightColor().fZ * SkColorGetB(diffColor); |
| + |
| for (int l = 0; l < lightShader.fLights->numLights(); ++l) { |
| const SkLights::Light& light = lightShader.fLights->light(l); |
| - if (SkLights::Light::kAmbient_LightType == light.type()) { |
| - accum.fX += light.color().fX * SkColorGetR(diffColor); |
| - accum.fY += light.color().fY * SkColorGetG(diffColor); |
| - accum.fZ += light.color().fZ * SkColorGetB(diffColor); |
| - } else if (SkLights::Light::kDirectional_LightType == light.type()) { |
| - // scaling by fZ accounts for lighting direction |
| - accum.fX += light.color().makeScale(light.dir().fZ).fX * |
| - SkColorGetR(diffColor); |
| - accum.fY += light.color().makeScale(light.dir().fZ).fY * |
| - SkColorGetG(diffColor); |
| - accum.fZ += light.color().makeScale(light.dir().fZ).fZ * |
| - SkColorGetB(diffColor); |
| - } else { |
| - // TODO: do point lights for raster, currently treated like ambient |
| - accum.fX += light.color().fX * SkColorGetR(diffColor); |
| - accum.fY += light.color().fY * SkColorGetG(diffColor); |
| - accum.fZ += light.color().fZ * SkColorGetB(diffColor); |
| - } |
| + // scaling by fZ accounts for lighting direction |
| + accum.fX += light.color().makeScale(light.dir().fZ).fX * SkColorGetR(diffColor); |
| + accum.fY += light.color().makeScale(light.dir().fZ).fY * SkColorGetG(diffColor); |
| + accum.fZ += light.color().makeScale(light.dir().fZ).fZ * SkColorGetB(diffColor); |
| } |
| result[i] = convert(accum, SkColorGetA(diffColor)); |