Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/effects/SkLightingImageFilter.cpp

Issue 12531015: Adds local coords to GrEffect system. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/effects/SkDisplacementMapEffect.cpp ('k') | src/effects/SkMagnifierImageFilter.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 962 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 GrCrash(); 973 GrCrash();
974 return NULL; 974 return NULL;
975 } 975 }
976 } 976 }
977 977
978 } 978 }
979 979
980 class GrGLLightingEffect : public GrGLEffect { 980 class GrGLLightingEffect : public GrGLEffect {
981 public: 981 public:
982 GrGLLightingEffect(const GrBackendEffectFactory& factory, 982 GrGLLightingEffect(const GrBackendEffectFactory& factory,
983 const GrEffectRef& effect); 983 const GrDrawEffect& effect);
984 virtual ~GrGLLightingEffect(); 984 virtual ~GrGLLightingEffect();
985 985
986 virtual void emitCode(GrGLShaderBuilder*, 986 virtual void emitCode(GrGLShaderBuilder*,
987 const GrEffectStage&, 987 const GrDrawEffect&,
988 EffectKey, 988 EffectKey,
989 const char* vertexCoords,
990 const char* outputColor, 989 const char* outputColor,
991 const char* inputColor, 990 const char* inputColor,
992 const TextureSamplerArray&) SK_OVERRIDE; 991 const TextureSamplerArray&) SK_OVERRIDE;
993 992
994 static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&); 993 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
995 994
996 /** 995 /**
997 * Subclasses of GrGLLightingEffect must call INHERITED::setData(); 996 * Subclasses of GrGLLightingEffect must call INHERITED::setData();
998 */ 997 */
999 virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVE RRIDE; 998 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE;
1000 999
1001 protected: 1000 protected:
1002 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) = 0; 1001 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) = 0;
1003 1002
1004 private: 1003 private:
1005 typedef GrGLEffect INHERITED; 1004 typedef GrGLEffect INHERITED;
1006 1005
1007 UniformHandle fImageIncrementUni; 1006 UniformHandle fImageIncrementUni;
1008 UniformHandle fSurfaceScaleUni; 1007 UniformHandle fSurfaceScaleUni;
1009 GrGLLight* fLight; 1008 GrGLLight* fLight;
1010 GrGLEffectMatrix fEffectMatrix; 1009 GrGLEffectMatrix fEffectMatrix;
1011 }; 1010 };
1012 1011
1013 /////////////////////////////////////////////////////////////////////////////// 1012 ///////////////////////////////////////////////////////////////////////////////
1014 1013
1015 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { 1014 class GrGLDiffuseLightingEffect : public GrGLLightingEffect {
1016 public: 1015 public:
1017 GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory, 1016 GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory,
1018 const GrEffectRef& effect); 1017 const GrDrawEffect& drawEffect);
1019 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI DE; 1018 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI DE;
1020 virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVE RRIDE; 1019 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE;
1021 1020
1022 private: 1021 private:
1023 typedef GrGLLightingEffect INHERITED; 1022 typedef GrGLLightingEffect INHERITED;
1024 1023
1025 UniformHandle fKDUni; 1024 UniformHandle fKDUni;
1026 }; 1025 };
1027 1026
1028 /////////////////////////////////////////////////////////////////////////////// 1027 ///////////////////////////////////////////////////////////////////////////////
1029 1028
1030 class GrGLSpecularLightingEffect : public GrGLLightingEffect { 1029 class GrGLSpecularLightingEffect : public GrGLLightingEffect {
1031 public: 1030 public:
1032 GrGLSpecularLightingEffect(const GrBackendEffectFactory& factory, 1031 GrGLSpecularLightingEffect(const GrBackendEffectFactory& factory,
1033 const GrEffectRef& effect); 1032 const GrDrawEffect& effect);
1034 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI DE; 1033 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI DE;
1035 virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVE RRIDE; 1034 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE;
1036 1035
1037 private: 1036 private:
1038 typedef GrGLLightingEffect INHERITED; 1037 typedef GrGLLightingEffect INHERITED;
1039 1038
1040 UniformHandle fKSUni; 1039 UniformHandle fKSUni;
1041 UniformHandle fShininessUni; 1040 UniformHandle fShininessUni;
1042 }; 1041 };
1043 1042
1044 /////////////////////////////////////////////////////////////////////////////// 1043 ///////////////////////////////////////////////////////////////////////////////
1045 1044
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 SkScalar kd = random->nextUScalar1(); 1085 SkScalar kd = random->nextUScalar1();
1087 SkAutoTUnref<SkLight> light(create_random_light(random)); 1086 SkAutoTUnref<SkLight> light(create_random_light(random));
1088 return GrDiffuseLightingEffect::Create(textures[GrEffectUnitTest::kAlphaText ureIdx], 1087 return GrDiffuseLightingEffect::Create(textures[GrEffectUnitTest::kAlphaText ureIdx],
1089 light, surfaceScale, kd); 1088 light, surfaceScale, kd);
1090 } 1089 }
1091 1090
1092 1091
1093 /////////////////////////////////////////////////////////////////////////////// 1092 ///////////////////////////////////////////////////////////////////////////////
1094 1093
1095 GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory, 1094 GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory,
1096 const GrEffectRef& effect) 1095 const GrDrawEffect& drawEffect)
1097 : INHERITED(factory) 1096 : INHERITED(factory)
1098 , fImageIncrementUni(kInvalidUniformHandle) 1097 , fImageIncrementUni(kInvalidUniformHandle)
1099 , fSurfaceScaleUni(kInvalidUniformHandle) { 1098 , fSurfaceScaleUni(kInvalidUniformHandle)
1100 const GrLightingEffect& m = CastEffect<GrLightingEffect>(effect); 1099 , fEffectMatrix(drawEffect.castEffect<GrLightingEffect>().coordsType()) {
1100 const GrLightingEffect& m = drawEffect.castEffect<GrLightingEffect>();
1101 fLight = m.light()->createGLLight(); 1101 fLight = m.light()->createGLLight();
1102 } 1102 }
1103 1103
1104 GrGLLightingEffect::~GrGLLightingEffect() { 1104 GrGLLightingEffect::~GrGLLightingEffect() {
1105 delete fLight; 1105 delete fLight;
1106 } 1106 }
1107 1107
1108 void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, 1108 void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder,
1109 const GrEffectStage&, 1109 const GrDrawEffect&,
1110 EffectKey key, 1110 EffectKey key,
1111 const char* vertexCoords,
1112 const char* outputColor, 1111 const char* outputColor,
1113 const char* inputColor, 1112 const char* inputColor,
1114 const TextureSamplerArray& samplers) { 1113 const TextureSamplerArray& samplers) {
1115 const char* coords; 1114 const char* coords;
1116 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords); 1115 const GrGLShaderVar& localCoords = builder->localCoordsAttribute();
1116 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &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 lightFunc; 1125 SkString lightFunc;
1126 this->emitLightFunc(builder, &lightFunc); 1126 this->emitLightFunc(builder, &lightFunc);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1200 builder->fsCodeAppend(";\n"); 1200 builder->fsCodeAppend(";\n");
1201 builder->fsCodeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", 1201 builder->fsCodeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ",
1202 outputColor, lightFunc.c_str(), interiorNormalName.c_ str(), surfScale); 1202 outputColor, lightFunc.c_str(), interiorNormalName.c_ str(), surfScale);
1203 fLight->emitLightColor(builder, "surfaceToLight"); 1203 fLight->emitLightColor(builder, "surfaceToLight");
1204 builder->fsCodeAppend(");\n"); 1204 builder->fsCodeAppend(");\n");
1205 SkString modulate; 1205 SkString modulate;
1206 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); 1206 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor);
1207 builder->fsCodeAppend(modulate.c_str()); 1207 builder->fsCodeAppend(modulate.c_str());
1208 } 1208 }
1209 1209
1210 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrEffectStage& s, 1210 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrDrawEffect& drawEffect,
1211 const GrGLCaps& caps) { 1211 const GrGLCaps& caps) {
1212 const GrLightingEffect& effect = GetEffectFromStage<GrLightingEffect>(s); 1212 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>() ;
1213 EffectKey key = effect.light()->type(); 1213 EffectKey key = lighting.light()->type();
1214 key <<= GrGLEffectMatrix::kKeyBits; 1214 key <<= GrGLEffectMatrix::kKeyBits;
1215 EffectKey matrixKey = GrGLEffectMatrix::GenKey(effect.getMatrix(), 1215 EffectKey matrixKey = GrGLEffectMatrix::GenKey(lighting.getMatrix(),
1216 s.getCoordChangeMatrix(), 1216 drawEffect,
1217 effect.texture(0)); 1217 lighting.coordsType(),
1218 lighting.texture(0));
1218 return key | matrixKey; 1219 return key | matrixKey;
1219 } 1220 }
1220 1221
1221 void GrGLLightingEffect::setData(const GrGLUniformManager& uman, const GrEffectS tage& stage) { 1222 void GrGLLightingEffect::setData(const GrGLUniformManager& uman,
1222 const GrLightingEffect& effect = GetEffectFromStage<GrLightingEffect>(stage) ; 1223 const GrDrawEffect& drawEffect) {
1223 GrTexture* texture = effect.texture(0); 1224 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>() ;
1225 GrTexture* texture = lighting.texture(0);
1224 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; 1226 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f;
1225 uman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->hei ght()); 1227 uman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->hei ght());
1226 uman.set1f(fSurfaceScaleUni, effect.surfaceScale()); 1228 uman.set1f(fSurfaceScaleUni, lighting.surfaceScale());
1227 fLight->setData(uman, effect.light()); 1229 fLight->setData(uman, lighting.light());
1228 fEffectMatrix.setData(uman, 1230 fEffectMatrix.setData(uman,
1229 effect.getMatrix(), 1231 lighting.getMatrix(),
1230 stage.getCoordChangeMatrix(), 1232 drawEffect,
1231 effect.texture(0)); 1233 lighting.texture(0));
1232 } 1234 }
1233 1235
1234 /////////////////////////////////////////////////////////////////////////////// 1236 ///////////////////////////////////////////////////////////////////////////////
1235 1237
1236 /////////////////////////////////////////////////////////////////////////////// 1238 ///////////////////////////////////////////////////////////////////////////////
1237 1239
1238 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactor y& factory, 1240 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactor y& factory,
1239 const GrEffectRef& effect) 1241 const GrDrawEffect& drawEff ect)
1240 : INHERITED(factory, effect) 1242 : INHERITED(factory, drawEffect)
1241 , fKDUni(kInvalidUniformHandle) { 1243 , fKDUni(kInvalidUniformHandle) {
1242 } 1244 }
1243 1245
1244 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStri ng* funcName) { 1246 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStri ng* funcName) {
1245 const char* kd; 1247 const char* kd;
1246 fKDUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 1248 fKDUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
1247 kFloat_GrSLType, 1249 kFloat_GrSLType,
1248 "KD", 1250 "KD",
1249 &kd); 1251 &kd);
1250 1252
1251 static const GrGLShaderVar gLightArgs[] = { 1253 static const GrGLShaderVar gLightArgs[] = {
1252 GrGLShaderVar("normal", kVec3f_GrSLType), 1254 GrGLShaderVar("normal", kVec3f_GrSLType),
1253 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), 1255 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType),
1254 GrGLShaderVar("lightColor", kVec3f_GrSLType) 1256 GrGLShaderVar("lightColor", kVec3f_GrSLType)
1255 }; 1257 };
1256 SkString lightBody; 1258 SkString lightBody;
1257 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n" , kd); 1259 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n" , kd);
1258 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1 .0);\n"); 1260 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1 .0);\n");
1259 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, 1261 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType,
1260 kVec4f_GrSLType, 1262 kVec4f_GrSLType,
1261 "light", 1263 "light",
1262 SK_ARRAY_COUNT(gLightArgs), 1264 SK_ARRAY_COUNT(gLightArgs),
1263 gLightArgs, 1265 gLightArgs,
1264 lightBody.c_str(), 1266 lightBody.c_str(),
1265 funcName); 1267 funcName);
1266 } 1268 }
1267 1269
1268 void GrGLDiffuseLightingEffect::setData(const GrGLUniformManager& uman, 1270 void GrGLDiffuseLightingEffect::setData(const GrGLUniformManager& uman,
1269 const GrEffectStage& stage) { 1271 const GrDrawEffect& drawEffect) {
1270 INHERITED::setData(uman, stage); 1272 INHERITED::setData(uman, drawEffect);
1271 const GrDiffuseLightingEffect& effect = GetEffectFromStage<GrDiffuseLighting Effect>(stage); 1273 const GrDiffuseLightingEffect& diffuse = drawEffect.castEffect<GrDiffuseLigh tingEffect>();
1272 uman.set1f(fKDUni, effect.kd()); 1274 uman.set1f(fKDUni, diffuse.kd());
1273 } 1275 }
1274 1276
1275 /////////////////////////////////////////////////////////////////////////////// 1277 ///////////////////////////////////////////////////////////////////////////////
1276 1278
1277 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, const SkL ight* light, SkScalar surfaceScale, SkScalar ks, SkScalar shininess) 1279 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, const SkL ight* light, SkScalar surfaceScale, SkScalar ks, SkScalar shininess)
1278 : INHERITED(texture, light, surfaceScale), 1280 : INHERITED(texture, light, surfaceScale),
1279 fKS(ks), 1281 fKS(ks),
1280 fShininess(shininess) { 1282 fShininess(shininess) {
1281 } 1283 }
1282 1284
(...skipping 17 matching lines...) Expand all
1300 SkScalar ks = random->nextUScalar1(); 1302 SkScalar ks = random->nextUScalar1();
1301 SkScalar shininess = random->nextUScalar1(); 1303 SkScalar shininess = random->nextUScalar1();
1302 SkAutoTUnref<SkLight> light(create_random_light(random)); 1304 SkAutoTUnref<SkLight> light(create_random_light(random));
1303 return GrSpecularLightingEffect::Create(textures[GrEffectUnitTest::kAlphaTex tureIdx], 1305 return GrSpecularLightingEffect::Create(textures[GrEffectUnitTest::kAlphaTex tureIdx],
1304 light, surfaceScale, ks, shininess); 1306 light, surfaceScale, ks, shininess);
1305 } 1307 }
1306 1308
1307 /////////////////////////////////////////////////////////////////////////////// 1309 ///////////////////////////////////////////////////////////////////////////////
1308 1310
1309 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrBackendEffectFact ory& factory, 1311 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrBackendEffectFact ory& factory,
1310 const GrEffectRef& effect ) 1312 const GrDrawEffect& drawE ffect)
1311 : GrGLLightingEffect(factory, effect) 1313 : GrGLLightingEffect(factory, drawEffect)
1312 , fKSUni(kInvalidUniformHandle) 1314 , fKSUni(kInvalidUniformHandle)
1313 , fShininessUni(kInvalidUniformHandle) { 1315 , fShininessUni(kInvalidUniformHandle) {
1314 } 1316 }
1315 1317
1316 void GrGLSpecularLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStr ing* funcName) { 1318 void GrGLSpecularLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStr ing* funcName) {
1317 const char* ks; 1319 const char* ks;
1318 const char* shininess; 1320 const char* shininess;
1319 1321
1320 fKSUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 1322 fKSUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
1321 kFloat_GrSLType, "KS", &ks); 1323 kFloat_GrSLType, "KS", &ks);
(...skipping 13 matching lines...) Expand all
1335 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, 1337 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType,
1336 kVec4f_GrSLType, 1338 kVec4f_GrSLType,
1337 "light", 1339 "light",
1338 SK_ARRAY_COUNT(gLightArgs), 1340 SK_ARRAY_COUNT(gLightArgs),
1339 gLightArgs, 1341 gLightArgs,
1340 lightBody.c_str(), 1342 lightBody.c_str(),
1341 funcName); 1343 funcName);
1342 } 1344 }
1343 1345
1344 void GrGLSpecularLightingEffect::setData(const GrGLUniformManager& uman, 1346 void GrGLSpecularLightingEffect::setData(const GrGLUniformManager& uman,
1345 const GrEffectStage& stage) { 1347 const GrDrawEffect& drawEffect) {
1346 INHERITED::setData(uman, stage); 1348 INHERITED::setData(uman, drawEffect);
1347 const GrSpecularLightingEffect& effect = GetEffectFromStage<GrSpecularLighti ngEffect>(stage); 1349 const GrSpecularLightingEffect& spec = drawEffect.castEffect<GrSpecularLight ingEffect>();
1348 uman.set1f(fKSUni, effect.ks()); 1350 uman.set1f(fKSUni, spec.ks());
1349 uman.set1f(fShininessUni, effect.shininess()); 1351 uman.set1f(fShininessUni, spec.shininess());
1350 } 1352 }
1351 1353
1352 /////////////////////////////////////////////////////////////////////////////// 1354 ///////////////////////////////////////////////////////////////////////////////
1353 void GrGLLight::emitLightColorUniform(GrGLShaderBuilder* builder) { 1355 void GrGLLight::emitLightColorUniform(GrGLShaderBuilder* builder) {
1354 fColorUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 1356 fColorUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
1355 kVec3f_GrSLType, "LightColor"); 1357 kVec3f_GrSLType, "LightColor");
1356 } 1358 }
1357 1359
1358 void GrGLLight::emitLightColor(GrGLShaderBuilder* builder, 1360 void GrGLLight::emitLightColor(GrGLShaderBuilder* builder,
1359 const char *surfaceToLight) { 1361 const char *surfaceToLight) {
1360 builder->fsCodeAppend(builder->getUniformCStr(this->lightColorUni())); 1362 builder->fsCodeAppend(builder->getUniformCStr(this->lightColorUni()));
1361 } 1363 }
1362 1364
1363 void GrGLLight::setData(const GrGLUniformManager& uman, 1365 void GrGLLight::setData(const GrGLUniformManager& uman, const SkLight* light) co nst {
1364 const SkLight* light) const {
1365 setUniformPoint3(uman, fColorUni, light->color() * SkScalarInvert(SkIntToSca lar(255))); 1366 setUniformPoint3(uman, fColorUni, light->color() * SkScalarInvert(SkIntToSca lar(255)));
1366 } 1367 }
1367 1368
1368 /////////////////////////////////////////////////////////////////////////////// 1369 ///////////////////////////////////////////////////////////////////////////////
1369 1370
1370 void GrGLDistantLight::setData(const GrGLUniformManager& uman, const SkLight* li ght) const { 1371 void GrGLDistantLight::setData(const GrGLUniformManager& uman, const SkLight* li ght) const {
1371 INHERITED::setData(uman, light); 1372 INHERITED::setData(uman, light);
1372 SkASSERT(light->type() == SkLight::kDistant_LightType); 1373 SkASSERT(light->type() == SkLight::kDistant_LightType);
1373 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh t); 1374 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh t);
1374 setUniformNormal3(uman, fDirectionUni, distantLight->direction()); 1375 setUniformNormal3(uman, fDirectionUni, distantLight->direction());
1375 } 1376 }
1376 1377
1377 void GrGLDistantLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char * z) { 1378 void GrGLDistantLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char * z) {
1378 const char* dir; 1379 const char* dir;
1379 fDirectionUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec3f_GrSLType, 1380 fDirectionUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec3f_GrSLType,
1380 "LightDirection", &dir); 1381 "LightDirection", &dir);
1381 builder->fsCodeAppend(dir); 1382 builder->fsCodeAppend(dir);
1382 } 1383 }
1383 1384
1384 /////////////////////////////////////////////////////////////////////////////// 1385 ///////////////////////////////////////////////////////////////////////////////
1385 1386
1386 void GrGLPointLight::setData(const GrGLUniformManager& uman, 1387 void GrGLPointLight::setData(const GrGLUniformManager& uman, const SkLight* ligh t) const {
1387 const SkLight* light) const {
1388 INHERITED::setData(uman, light); 1388 INHERITED::setData(uman, light);
1389 SkASSERT(light->type() == SkLight::kPoint_LightType); 1389 SkASSERT(light->type() == SkLight::kPoint_LightType);
1390 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light); 1390 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light);
1391 setUniformPoint3(uman, fLocationUni, pointLight->location()); 1391 setUniformPoint3(uman, fLocationUni, pointLight->location());
1392 } 1392 }
1393 1393
1394 void GrGLPointLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char* z) { 1394 void GrGLPointLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char* z) {
1395 const char* loc; 1395 const char* loc;
1396 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec3f_GrSLType, 1396 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec3f_GrSLType,
1397 "LightLocation", &loc); 1397 "LightLocation", &loc);
1398 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))", loc, builder->frag mentPosition(), z); 1398 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))", loc, builder->frag mentPosition(), z);
1399 } 1399 }
1400 1400
1401 /////////////////////////////////////////////////////////////////////////////// 1401 ///////////////////////////////////////////////////////////////////////////////
1402 1402
1403 void GrGLSpotLight::setData(const GrGLUniformManager& uman, 1403 void GrGLSpotLight::setData(const GrGLUniformManager& uman, const SkLight* light ) const {
1404 const SkLight* light) const {
1405 INHERITED::setData(uman, light); 1404 INHERITED::setData(uman, light);
1406 SkASSERT(light->type() == SkLight::kSpot_LightType); 1405 SkASSERT(light->type() == SkLight::kSpot_LightType);
1407 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light); 1406 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light);
1408 setUniformPoint3(uman, fLocationUni, spotLight->location()); 1407 setUniformPoint3(uman, fLocationUni, spotLight->location());
1409 uman.set1f(fExponentUni, spotLight->specularExponent()); 1408 uman.set1f(fExponentUni, spotLight->specularExponent());
1410 uman.set1f(fCosInnerConeAngleUni, spotLight->cosInnerConeAngle()); 1409 uman.set1f(fCosInnerConeAngleUni, spotLight->cosInnerConeAngle());
1411 uman.set1f(fCosOuterConeAngleUni, spotLight->cosOuterConeAngle()); 1410 uman.set1f(fCosOuterConeAngleUni, spotLight->cosOuterConeAngle());
1412 uman.set1f(fConeScaleUni, spotLight->coneScale()); 1411 uman.set1f(fConeScaleUni, spotLight->coneScale());
1413 setUniformNormal3(uman, fSUni, spotLight->s()); 1412 setUniformNormal3(uman, fSUni, spotLight->s());
1414 } 1413 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1469 1468
1470 #endif 1469 #endif
1471 1470
1472 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) 1471 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter)
1473 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) 1472 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter)
1474 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) 1473 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter)
1475 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) 1474 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight)
1476 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) 1475 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight)
1477 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) 1476 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight)
1478 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1477 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « src/effects/SkDisplacementMapEffect.cpp ('k') | src/effects/SkMagnifierImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698