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)); |