| 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 962 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |