Index: src/core/SkShadowShader.cpp |
diff --git a/src/core/SkShadowShader.cpp b/src/core/SkShadowShader.cpp |
index 09d0bcaf5080c2822b3abd9dc4e7cb17bb1efaac..b4835dabe7eae4873446da641f6ebd2701cf3df6 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; |
+ |
+ SkVector3 fragToLight = SkVector3::Make(light.pos().fX - x - i, |
+ 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; |
} |
} |