Chromium Code Reviews| Index: src/core/SkShadowShader.cpp |
| diff --git a/src/core/SkShadowShader.cpp b/src/core/SkShadowShader.cpp |
| index 09d0bcaf5080c2822b3abd9dc4e7cb17bb1efaac..a8834480a3b8ebf3622f80e792759114bccec068 100644 |
| --- a/src/core/SkShadowShader.cpp |
| +++ b/src/core/SkShadowShader.cpp |
| @@ -719,8 +719,9 @@ void SkShadowShaderImpl::ShadowShaderContext::shadeSpan(int x, int y, |
| for (int l = 0; l < lightShader.fLights->numLights(); ++l) { |
| const SkLights::Light& light = lightShader.fLights->light(l); |
| + int pvDepth = SkColorGetB(povDepthColor); // depth stored in blue channel |
| + |
| if (light.type() == SkLights::Light::kDirectional_LightType) { |
| - int pvDepth = SkColorGetB(povDepthColor); // depth stored in blue channel |
| int xOffset = SkScalarRoundToInt(light.dir().fX * pvDepth); |
| int yOffset = SkScalarRoundToInt(light.dir().fY * pvDepth); |
| @@ -765,8 +766,26 @@ void SkShadowShaderImpl::ShadowShaderContext::shadeSpan(int x, int y, |
| totalLight.fX += light.dir().fZ * light.color().fX * lightProb; |
| totalLight.fY += light.dir().fZ * light.color().fY * lightProb; |
| totalLight.fZ += light.dir().fZ * light.color().fZ * lightProb; |
| + |
| } else { |
| - totalLight += light.color(); |
| + // right now we only expect directional and point light types. |
| + SkASSERT(light.type() == SkLights::Light::kPoint_LightType); |
| + |
| + int height = lightShader.fDiffuseHeight; |
| + |
|
robertphillips
2016/08/31 18:02:26
isn't there supposed to be a "+i" somewhere in her
|
| + SkVector3 fragToLight = SkVector3::Make(light.pos().fX - x, |
| + light.pos().fY - (height - y), |
| + light.pos().fZ - pvDepth); |
| + |
| + SkScalar dist = fragToLight.length(); |
| + SkScalar normalizedZ = fragToLight.fZ / dist; |
| + |
| + SkScalar distAttenuation = light.intensity() / (1.0f + dist * dist); |
| + |
| + // assume object normals are pointing straight up |
| + totalLight.fX += normalizedZ * light.color().fX * distAttenuation; |
| + totalLight.fY += normalizedZ * light.color().fY * distAttenuation; |
| + totalLight.fZ += normalizedZ * light.color().fZ * distAttenuation; |
| } |
| } |