| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 The Android Open Source Project | 2 * Copyright 2012 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkLightingImageFilter.h" | 8 #include "SkLightingImageFilter.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| (...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 void emitLightColorUniform(GrGLShaderBuilder*); | 408 void emitLightColorUniform(GrGLShaderBuilder*); |
| 409 | 409 |
| 410 /** | 410 /** |
| 411 * These two functions are called from GrGLLightingEffect's emitCode() funct
ion. | 411 * These two functions are called from GrGLLightingEffect's emitCode() funct
ion. |
| 412 * emitSurfaceToLight places an expression in param out that is the vector f
rom the surface to | 412 * emitSurfaceToLight places an expression in param out that is the vector f
rom the surface to |
| 413 * the light. The expression will be used in the FS. emitLightColor writes a
n expression into | 413 * the light. The expression will be used in the FS. emitLightColor writes a
n expression into |
| 414 * the FS that is the color of the light. Either function may add functions
and/or uniforms to | 414 * the FS that is the color of the light. Either function may add functions
and/or uniforms to |
| 415 * the FS. The default of emitLightColor appends the name of the constant li
ght color uniform | 415 * the FS. The default of emitLightColor appends the name of the constant li
ght color uniform |
| 416 * and so this function only needs to be overridden if the light color varie
s spatially. | 416 * and so this function only needs to be overridden if the light color varie
s spatially. |
| 417 */ | 417 */ |
| 418 virtual void emitSurfaceToLight(GrGLShaderBuilder*, SkString* out, const cha
r* z) = 0; | 418 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) = 0; |
| 419 virtual void emitLightColor(GrGLShaderBuilder*, const char *surfaceToLight); | 419 virtual void emitLightColor(GrGLShaderBuilder*, const char *surfaceToLight); |
| 420 | 420 |
| 421 // This is called from GrGLLightingEffect's setData(). Subclasses of GrGLLig
ht must call | 421 // This is called from GrGLLightingEffect's setData(). Subclasses of GrGLLig
ht must call |
| 422 // INHERITED::setData(). | 422 // INHERITED::setData(). |
| 423 virtual void setData(const GrGLUniformManager&, const SkLight* light) const; | 423 virtual void setData(const GrGLUniformManager&, const SkLight* light) const; |
| 424 | 424 |
| 425 protected: | 425 protected: |
| 426 /** | 426 /** |
| 427 * Gets the constant light color uniform. Subclasses can use this in their e
mitLightColor | 427 * Gets the constant light color uniform. Subclasses can use this in their e
mitLightColor |
| 428 * function. | 428 * function. |
| 429 */ | 429 */ |
| 430 UniformHandle lightColorUni() const { return fColorUni; } | 430 UniformHandle lightColorUni() const { return fColorUni; } |
| 431 | 431 |
| 432 private: | 432 private: |
| 433 UniformHandle fColorUni; | 433 UniformHandle fColorUni; |
| 434 | 434 |
| 435 typedef SkRefCnt INHERITED; | 435 typedef SkRefCnt INHERITED; |
| 436 }; | 436 }; |
| 437 | 437 |
| 438 /////////////////////////////////////////////////////////////////////////////// | 438 /////////////////////////////////////////////////////////////////////////////// |
| 439 | 439 |
| 440 class GrGLDistantLight : public GrGLLight { | 440 class GrGLDistantLight : public GrGLLight { |
| 441 public: | 441 public: |
| 442 virtual ~GrGLDistantLight() {} | 442 virtual ~GrGLDistantLight() {} |
| 443 virtual void setData(const GrGLUniformManager&, const SkLight* light) const
SK_OVERRIDE; | 443 virtual void setData(const GrGLUniformManager&, const SkLight* light) const
SK_OVERRIDE; |
| 444 virtual void emitSurfaceToLight(GrGLShaderBuilder*, SkString* out, const ch
ar* z) SK_OVERRIDE; | 444 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI
DE; |
| 445 private: | 445 private: |
| 446 typedef GrGLLight INHERITED; | 446 typedef GrGLLight INHERITED; |
| 447 UniformHandle fDirectionUni; | 447 UniformHandle fDirectionUni; |
| 448 }; | 448 }; |
| 449 | 449 |
| 450 /////////////////////////////////////////////////////////////////////////////// | 450 /////////////////////////////////////////////////////////////////////////////// |
| 451 | 451 |
| 452 class GrGLPointLight : public GrGLLight { | 452 class GrGLPointLight : public GrGLLight { |
| 453 public: | 453 public: |
| 454 virtual ~GrGLPointLight() {} | 454 virtual ~GrGLPointLight() {} |
| 455 virtual void setData(const GrGLUniformManager&, const SkLight* light) const
SK_OVERRIDE; | 455 virtual void setData(const GrGLUniformManager&, const SkLight* light) const
SK_OVERRIDE; |
| 456 virtual void emitSurfaceToLight(GrGLShaderBuilder*, SkString* out, const cha
r* z) SK_OVERRIDE; | 456 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI
DE; |
| 457 private: | 457 private: |
| 458 typedef GrGLLight INHERITED; | 458 typedef GrGLLight INHERITED; |
| 459 SkPoint3 fLocation; | 459 SkPoint3 fLocation; |
| 460 UniformHandle fLocationUni; | 460 UniformHandle fLocationUni; |
| 461 }; | 461 }; |
| 462 | 462 |
| 463 /////////////////////////////////////////////////////////////////////////////// | 463 /////////////////////////////////////////////////////////////////////////////// |
| 464 | 464 |
| 465 class GrGLSpotLight : public GrGLLight { | 465 class GrGLSpotLight : public GrGLLight { |
| 466 public: | 466 public: |
| 467 virtual ~GrGLSpotLight() {} | 467 virtual ~GrGLSpotLight() {} |
| 468 virtual void setData(const GrGLUniformManager&, const SkLight* light) const
SK_OVERRIDE; | 468 virtual void setData(const GrGLUniformManager&, const SkLight* light) const
SK_OVERRIDE; |
| 469 virtual void emitSurfaceToLight(GrGLShaderBuilder*, SkString* out, const cha
r* z) SK_OVERRIDE; | 469 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI
DE; |
| 470 virtual void emitLightColor(GrGLShaderBuilder*, const char *surfaceToLight)
SK_OVERRIDE; | 470 virtual void emitLightColor(GrGLShaderBuilder*, const char *surfaceToLight)
SK_OVERRIDE; |
| 471 private: | 471 private: |
| 472 typedef GrGLLight INHERITED; | 472 typedef GrGLLight INHERITED; |
| 473 | 473 |
| 474 SkString fLightColorFunc; | 474 SkString fLightColorFunc; |
| 475 UniformHandle fLocationUni; | 475 UniformHandle fLocationUni; |
| 476 UniformHandle fExponentUni; | 476 UniformHandle fExponentUni; |
| 477 UniformHandle fCosOuterConeAngleUni; | 477 UniformHandle fCosOuterConeAngleUni; |
| 478 UniformHandle fCosInnerConeAngleUni; | 478 UniformHandle fCosInnerConeAngleUni; |
| 479 UniformHandle fConeScaleUni; | 479 UniformHandle fConeScaleUni; |
| (...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1115 const char* coords; | 1115 const char* coords; |
| 1116 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords); | 1116 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords); |
| 1117 | 1117 |
| 1118 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader
Type, | 1118 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader
Type, |
| 1119 kVec2f_GrSLType, | 1119 kVec2f_GrSLType, |
| 1120 "ImageIncrement"); | 1120 "ImageIncrement"); |
| 1121 fSurfaceScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderTy
pe, | 1121 fSurfaceScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderTy
pe, |
| 1122 kFloat_GrSLType, | 1122 kFloat_GrSLType, |
| 1123 "SurfaceScale"); | 1123 "SurfaceScale"); |
| 1124 fLight->emitLightColorUniform(builder); | 1124 fLight->emitLightColorUniform(builder); |
| 1125 SkString* code = &builder->fFSCode; | |
| 1126 SkString lightFunc; | 1125 SkString lightFunc; |
| 1127 this->emitLightFunc(builder, &lightFunc); | 1126 this->emitLightFunc(builder, &lightFunc); |
| 1128 static const GrGLShaderVar gSobelArgs[] = { | 1127 static const GrGLShaderVar gSobelArgs[] = { |
| 1129 GrGLShaderVar("a", kFloat_GrSLType), | 1128 GrGLShaderVar("a", kFloat_GrSLType), |
| 1130 GrGLShaderVar("b", kFloat_GrSLType), | 1129 GrGLShaderVar("b", kFloat_GrSLType), |
| 1131 GrGLShaderVar("c", kFloat_GrSLType), | 1130 GrGLShaderVar("c", kFloat_GrSLType), |
| 1132 GrGLShaderVar("d", kFloat_GrSLType), | 1131 GrGLShaderVar("d", kFloat_GrSLType), |
| 1133 GrGLShaderVar("e", kFloat_GrSLType), | 1132 GrGLShaderVar("e", kFloat_GrSLType), |
| 1134 GrGLShaderVar("f", kFloat_GrSLType), | 1133 GrGLShaderVar("f", kFloat_GrSLType), |
| 1135 GrGLShaderVar("scale", kFloat_GrSLType), | 1134 GrGLShaderVar("scale", kFloat_GrSLType), |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1169 sobelFuncName.c_str()); | 1168 sobelFuncName.c_str()); |
| 1170 SkString interiorNormalName; | 1169 SkString interiorNormalName; |
| 1171 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, | 1170 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, |
| 1172 kVec3f_GrSLType, | 1171 kVec3f_GrSLType, |
| 1173 "interiorNormal", | 1172 "interiorNormal", |
| 1174 SK_ARRAY_COUNT(gInteriorNormalArgs), | 1173 SK_ARRAY_COUNT(gInteriorNormalArgs), |
| 1175 gInteriorNormalArgs, | 1174 gInteriorNormalArgs, |
| 1176 interiorNormalBody.c_str(), | 1175 interiorNormalBody.c_str(), |
| 1177 &interiorNormalName); | 1176 &interiorNormalName); |
| 1178 | 1177 |
| 1179 code->appendf("\t\tvec2 coord = %s;\n", coords); | 1178 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords); |
| 1180 code->appendf("\t\tfloat m[9];\n"); | 1179 builder->fsCodeAppend("\t\tfloat m[9];\n"); |
| 1181 | 1180 |
| 1182 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); | 1181 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); |
| 1183 const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni); | 1182 const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni); |
| 1184 | 1183 |
| 1185 int index = 0; | 1184 int index = 0; |
| 1186 for (int dy = -1; dy <= 1; dy++) { | 1185 for (int dy = -1; dy <= 1; dy++) { |
| 1187 for (int dx = -1; dx <= 1; dx++) { | 1186 for (int dx = -1; dx <= 1; dx++) { |
| 1188 SkString texCoords; | 1187 SkString texCoords; |
| 1189 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); | 1188 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); |
| 1190 code->appendf("\t\tm[%d] = ", index++); | 1189 builder->fsCodeAppendf("\t\tm[%d] = ", index++); |
| 1191 builder->appendTextureLookup(code, samplers[0], texCoords.c_str()); | 1190 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType
, |
| 1192 code->appendf(".a;\n"); | 1191 samplers[0], |
| 1192 texCoords.c_str()); |
| 1193 builder->fsCodeAppend(".a;\n"); |
| 1193 } | 1194 } |
| 1194 } | 1195 } |
| 1195 code->appendf("\t\tvec3 surfaceToLight = "); | 1196 builder->fsCodeAppend("\t\tvec3 surfaceToLight = "); |
| 1196 SkString arg; | 1197 SkString arg; |
| 1197 arg.appendf("%s * m[4]", surfScale); | 1198 arg.appendf("%s * m[4]", surfScale); |
| 1198 fLight->emitSurfaceToLight(builder, code, arg.c_str()); | 1199 fLight->emitSurfaceToLight(builder, arg.c_str()); |
| 1199 code->append(";\n"); | 1200 builder->fsCodeAppend(";\n"); |
| 1200 code->appendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", | 1201 builder->fsCodeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", |
| 1201 outputColor, lightFunc.c_str(), interiorNormalName.c_str(), su
rfScale); | 1202 outputColor, lightFunc.c_str(), interiorNormalName.c_
str(), surfScale); |
| 1202 fLight->emitLightColor(builder, "surfaceToLight"); | 1203 fLight->emitLightColor(builder, "surfaceToLight"); |
| 1203 code->append(");\n"); | 1204 builder->fsCodeAppend(");\n"); |
| 1204 GrGLSLMulVarBy4f(code, 2, outputColor, inputColor); | 1205 SkString modulate; |
| 1206 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); |
| 1207 builder->fsCodeAppend(modulate.c_str()); |
| 1205 } | 1208 } |
| 1206 | 1209 |
| 1207 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrEffectStage& s, | 1210 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrEffectStage& s, |
| 1208 const GrGLCaps& caps) { | 1211 const GrGLCaps& caps) { |
| 1209 const GrLightingEffect& effect = GetEffectFromStage<GrLightingEffect>(s); | 1212 const GrLightingEffect& effect = GetEffectFromStage<GrLightingEffect>(s); |
| 1210 EffectKey key = effect.light()->type(); | 1213 EffectKey key = effect.light()->type(); |
| 1211 key <<= GrGLEffectMatrix::kKeyBits; | 1214 key <<= GrGLEffectMatrix::kKeyBits; |
| 1212 EffectKey matrixKey = GrGLEffectMatrix::GenKey(effect.getMatrix(), | 1215 EffectKey matrixKey = GrGLEffectMatrix::GenKey(effect.getMatrix(), |
| 1213 s.getCoordChangeMatrix(), | 1216 s.getCoordChangeMatrix(), |
| 1214 effect.texture(0)); | 1217 effect.texture(0)); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1347 } | 1350 } |
| 1348 | 1351 |
| 1349 /////////////////////////////////////////////////////////////////////////////// | 1352 /////////////////////////////////////////////////////////////////////////////// |
| 1350 void GrGLLight::emitLightColorUniform(GrGLShaderBuilder* builder) { | 1353 void GrGLLight::emitLightColorUniform(GrGLShaderBuilder* builder) { |
| 1351 fColorUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 1354 fColorUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
| 1352 kVec3f_GrSLType, "LightColor"); | 1355 kVec3f_GrSLType, "LightColor"); |
| 1353 } | 1356 } |
| 1354 | 1357 |
| 1355 void GrGLLight::emitLightColor(GrGLShaderBuilder* builder, | 1358 void GrGLLight::emitLightColor(GrGLShaderBuilder* builder, |
| 1356 const char *surfaceToLight) { | 1359 const char *surfaceToLight) { |
| 1357 builder->fFSCode.append(builder->getUniformCStr(this->lightColorUni())); | 1360 builder->fsCodeAppend(builder->getUniformCStr(this->lightColorUni())); |
| 1358 } | 1361 } |
| 1359 | 1362 |
| 1360 void GrGLLight::setData(const GrGLUniformManager& uman, | 1363 void GrGLLight::setData(const GrGLUniformManager& uman, |
| 1361 const SkLight* light) const { | 1364 const SkLight* light) const { |
| 1362 setUniformPoint3(uman, fColorUni, light->color() * SkScalarInvert(SkIntToSca
lar(255))); | 1365 setUniformPoint3(uman, fColorUni, light->color() * SkScalarInvert(SkIntToSca
lar(255))); |
| 1363 } | 1366 } |
| 1364 | 1367 |
| 1365 /////////////////////////////////////////////////////////////////////////////// | 1368 /////////////////////////////////////////////////////////////////////////////// |
| 1366 | 1369 |
| 1367 void GrGLDistantLight::setData(const GrGLUniformManager& uman, const SkLight* li
ght) const { | 1370 void GrGLDistantLight::setData(const GrGLUniformManager& uman, const SkLight* li
ght) const { |
| 1368 INHERITED::setData(uman, light); | 1371 INHERITED::setData(uman, light); |
| 1369 SkASSERT(light->type() == SkLight::kDistant_LightType); | 1372 SkASSERT(light->type() == SkLight::kDistant_LightType); |
| 1370 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh
t); | 1373 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh
t); |
| 1371 setUniformNormal3(uman, fDirectionUni, distantLight->direction()); | 1374 setUniformNormal3(uman, fDirectionUni, distantLight->direction()); |
| 1372 } | 1375 } |
| 1373 | 1376 |
| 1374 void GrGLDistantLight::emitSurfaceToLight(GrGLShaderBuilder* builder, | 1377 void GrGLDistantLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char
* z) { |
| 1375 SkString* out, | |
| 1376 const char* z) { | |
| 1377 const char* dir; | 1378 const char* dir; |
| 1378 fDirectionUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
kVec3f_GrSLType, | 1379 fDirectionUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
kVec3f_GrSLType, |
| 1379 "LightDirection", &dir); | 1380 "LightDirection", &dir); |
| 1380 out->append(dir); | 1381 builder->fsCodeAppend(dir); |
| 1381 } | 1382 } |
| 1382 | 1383 |
| 1383 /////////////////////////////////////////////////////////////////////////////// | 1384 /////////////////////////////////////////////////////////////////////////////// |
| 1384 | 1385 |
| 1385 void GrGLPointLight::setData(const GrGLUniformManager& uman, | 1386 void GrGLPointLight::setData(const GrGLUniformManager& uman, |
| 1386 const SkLight* light) const { | 1387 const SkLight* light) const { |
| 1387 INHERITED::setData(uman, light); | 1388 INHERITED::setData(uman, light); |
| 1388 SkASSERT(light->type() == SkLight::kPoint_LightType); | 1389 SkASSERT(light->type() == SkLight::kPoint_LightType); |
| 1389 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light); | 1390 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light); |
| 1390 setUniformPoint3(uman, fLocationUni, pointLight->location()); | 1391 setUniformPoint3(uman, fLocationUni, pointLight->location()); |
| 1391 } | 1392 } |
| 1392 | 1393 |
| 1393 void GrGLPointLight::emitSurfaceToLight(GrGLShaderBuilder* builder, | 1394 void GrGLPointLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char*
z) { |
| 1394 SkString* out, | |
| 1395 const char* z) { | |
| 1396 const char* loc; | 1395 const char* loc; |
| 1397 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
kVec3f_GrSLType, | 1396 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
kVec3f_GrSLType, |
| 1398 "LightLocation", &loc); | 1397 "LightLocation", &loc); |
| 1399 out->appendf("normalize(%s - vec3(%s.xy, %s))", loc, builder->fragmentPositi
on(), z); | 1398 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))", loc, builder->frag
mentPosition(), z); |
| 1400 } | 1399 } |
| 1401 | 1400 |
| 1402 /////////////////////////////////////////////////////////////////////////////// | 1401 /////////////////////////////////////////////////////////////////////////////// |
| 1403 | 1402 |
| 1404 void GrGLSpotLight::setData(const GrGLUniformManager& uman, | 1403 void GrGLSpotLight::setData(const GrGLUniformManager& uman, |
| 1405 const SkLight* light) const { | 1404 const SkLight* light) const { |
| 1406 INHERITED::setData(uman, light); | 1405 INHERITED::setData(uman, light); |
| 1407 SkASSERT(light->type() == SkLight::kSpot_LightType); | 1406 SkASSERT(light->type() == SkLight::kSpot_LightType); |
| 1408 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light); | 1407 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light); |
| 1409 setUniformPoint3(uman, fLocationUni, spotLight->location()); | 1408 setUniformPoint3(uman, fLocationUni, spotLight->location()); |
| 1410 uman.set1f(fExponentUni, spotLight->specularExponent()); | 1409 uman.set1f(fExponentUni, spotLight->specularExponent()); |
| 1411 uman.set1f(fCosInnerConeAngleUni, spotLight->cosInnerConeAngle()); | 1410 uman.set1f(fCosInnerConeAngleUni, spotLight->cosInnerConeAngle()); |
| 1412 uman.set1f(fCosOuterConeAngleUni, spotLight->cosOuterConeAngle()); | 1411 uman.set1f(fCosOuterConeAngleUni, spotLight->cosOuterConeAngle()); |
| 1413 uman.set1f(fConeScaleUni, spotLight->coneScale()); | 1412 uman.set1f(fConeScaleUni, spotLight->coneScale()); |
| 1414 setUniformNormal3(uman, fSUni, spotLight->s()); | 1413 setUniformNormal3(uman, fSUni, spotLight->s()); |
| 1415 } | 1414 } |
| 1416 | 1415 |
| 1417 void GrGLSpotLight::emitSurfaceToLight(GrGLShaderBuilder* builder, | 1416 void GrGLSpotLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char* z
) { |
| 1418 SkString* out, | |
| 1419 const char* z) { | |
| 1420 const char* location; | 1417 const char* location; |
| 1421 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 1418 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
| 1422 kVec3f_GrSLType, "LightLocation", &locati
on); | 1419 kVec3f_GrSLType, "LightLocation", &locati
on); |
| 1423 out->appendf("normalize(%s - vec3(%s.xy, %s))", location, builder->fragmentP
osition(), z); | 1420 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))", |
| 1421 location, builder->fragmentPosition(), z); |
| 1424 } | 1422 } |
| 1425 | 1423 |
| 1426 void GrGLSpotLight::emitLightColor(GrGLShaderBuilder* builder, | 1424 void GrGLSpotLight::emitLightColor(GrGLShaderBuilder* builder, |
| 1427 const char *surfaceToLight) { | 1425 const char *surfaceToLight) { |
| 1428 | 1426 |
| 1429 const char* color = builder->getUniformCStr(this->lightColorUni()); // creat
ed by parent class. | 1427 const char* color = builder->getUniformCStr(this->lightColorUni()); // creat
ed by parent class. |
| 1430 | 1428 |
| 1431 const char* exponent; | 1429 const char* exponent; |
| 1432 const char* cosInner; | 1430 const char* cosInner; |
| 1433 const char* cosOuter; | 1431 const char* cosOuter; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1459 lightColorBody.appendf("\t}\n"); | 1457 lightColorBody.appendf("\t}\n"); |
| 1460 lightColorBody.appendf("\treturn %s;\n", color); | 1458 lightColorBody.appendf("\treturn %s;\n", color); |
| 1461 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, | 1459 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, |
| 1462 kVec3f_GrSLType, | 1460 kVec3f_GrSLType, |
| 1463 "lightColor", | 1461 "lightColor", |
| 1464 SK_ARRAY_COUNT(gLightColorArgs), | 1462 SK_ARRAY_COUNT(gLightColorArgs), |
| 1465 gLightColorArgs, | 1463 gLightColorArgs, |
| 1466 lightColorBody.c_str(), | 1464 lightColorBody.c_str(), |
| 1467 &fLightColorFunc); | 1465 &fLightColorFunc); |
| 1468 | 1466 |
| 1469 builder->fFSCode.appendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 1467 builder->fsCodeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
| 1470 } | 1468 } |
| 1471 | 1469 |
| 1472 #endif | 1470 #endif |
| 1473 | 1471 |
| 1474 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1472 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
| 1475 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1473 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
| 1476 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1474 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
| 1477 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) | 1475 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) |
| 1478 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) | 1476 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) |
| 1479 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) | 1477 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) |
| 1480 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1478 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |