| 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" |
| 11 #include "SkFlattenableBuffers.h" | 11 #include "SkFlattenableBuffers.h" |
| 12 #include "SkOrderedReadBuffer.h" | 12 #include "SkOrderedReadBuffer.h" |
| 13 #include "SkOrderedWriteBuffer.h" | 13 #include "SkOrderedWriteBuffer.h" |
| 14 #include "SkTypes.h" | 14 #include "SkTypes.h" |
| 15 | 15 |
| 16 #if SK_SUPPORT_GPU | 16 #if SK_SUPPORT_GPU |
| 17 #include "effects/GrSingleTextureEffect.h" | 17 #include "effects/GrSingleTextureEffect.h" |
| 18 #include "gl/GrGLEffect.h" | 18 #include "gl/GrGLEffect.h" |
| 19 #include "gl/GrGLEffectMatrix.h" | 19 #include "gl/GrGLEffectMatrix.h" |
| 20 #include "GrEffect.h" | 20 #include "GrEffect.h" |
| 21 #include "GrTBackendEffectFactory.h" | 21 #include "GrTBackendEffectFactory.h" |
| 22 | 22 |
| 23 class GrGLDiffuseLightingEffect; | 23 class GrGLDiffuseLightingEffect; |
| 24 class GrGLSpecularLightingEffect; | 24 class GrGLSpecularLightingEffect; |
| 25 | 25 |
| 26 // For brevity | |
| 27 typedef GrGLUniformManager::UniformHandle UniformHandle; | |
| 28 static const UniformHandle kInvalidUniformHandle = GrGLUniformManager::kInvalidU
niformHandle; | |
| 29 #endif | 26 #endif |
| 30 | 27 |
| 31 namespace { | 28 namespace { |
| 32 | 29 |
| 33 const SkScalar gOneThird = SkScalarInvert(SkIntToScalar(3)); | 30 const SkScalar gOneThird = SkScalarInvert(SkIntToScalar(3)); |
| 34 const SkScalar gTwoThirds = SkScalarDiv(SkIntToScalar(2), SkIntToScalar(3)); | 31 const SkScalar gTwoThirds = SkScalarDiv(SkIntToScalar(2), SkIntToScalar(3)); |
| 35 const SkScalar gOneHalf = SkFloatToScalar(0.5f); | 32 const SkScalar gOneHalf = SkFloatToScalar(0.5f); |
| 36 const SkScalar gOneQuarter = SkFloatToScalar(0.25f); | 33 const SkScalar gOneQuarter = SkFloatToScalar(0.25f); |
| 37 | 34 |
| 38 #if SK_SUPPORT_GPU | 35 #if SK_SUPPORT_GPU |
| 39 void setUniformPoint3(const GrGLUniformManager& uman, UniformHandle uni, const S
kPoint3& point) { | 36 void setUniformPoint3(const GrGLContext& context, GrGLUniform* uni, const SkPoin
t3& point) { |
| 40 GR_STATIC_ASSERT(sizeof(SkPoint3) == 3 * sizeof(GrGLfloat)); | 37 GR_STATIC_ASSERT(sizeof(SkPoint3) == 3 * sizeof(GrGLfloat)); |
| 41 uman.set3fv(uni, 0, 1, &point.fX); | 38 uni->set3fv(context, 0, 1, &point.fX); |
| 42 } | 39 } |
| 43 | 40 |
| 44 void setUniformNormal3(const GrGLUniformManager& uman, UniformHandle uni, const
SkPoint3& point) { | 41 void setUniformNormal3(const GrGLContext& context, GrGLUniform* uni, const SkPoi
nt3& point) { |
| 45 setUniformPoint3(uman, uni, SkPoint3(point.fX, point.fY, point.fZ)); | 42 setUniformPoint3(context, uni, SkPoint3(point.fX, point.fY, point.fZ)); |
| 46 } | 43 } |
| 47 #endif | 44 #endif |
| 48 | 45 |
| 49 // Shift matrix components to the left, as we advance pixels to the right. | 46 // Shift matrix components to the left, as we advance pixels to the right. |
| 50 inline void shiftMatrixLeft(int m[9]) { | 47 inline void shiftMatrixLeft(int m[9]) { |
| 51 m[0] = m[1]; | 48 m[0] = m[1]; |
| 52 m[3] = m[4]; | 49 m[3] = m[4]; |
| 53 m[6] = m[7]; | 50 m[6] = m[7]; |
| 54 m[1] = m[2]; | 51 m[1] = m[2]; |
| 55 m[4] = m[5]; | 52 m[4] = m[5]; |
| (...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 /////////////////////////////////////////////////////////////////////////////// | 409 /////////////////////////////////////////////////////////////////////////////// |
| 413 | 410 |
| 414 class GrGLLight { | 411 class GrGLLight { |
| 415 public: | 412 public: |
| 416 virtual ~GrGLLight() {} | 413 virtual ~GrGLLight() {} |
| 417 | 414 |
| 418 /** | 415 /** |
| 419 * This is called by GrGLLightingEffect::emitCode() before either of the two
virtual functions | 416 * This is called by GrGLLightingEffect::emitCode() before either of the two
virtual functions |
| 420 * below. It adds a vec3f uniform visible in the FS that represents the cons
tant light color. | 417 * below. It adds a vec3f uniform visible in the FS that represents the cons
tant light color. |
| 421 */ | 418 */ |
| 422 void emitLightColorUniform(GrGLShaderBuilder*); | 419 GrGLShaderBuilder::Uniform* emitLightColorUniform(GrGLShaderBuilder*); |
| 423 | 420 |
| 424 /** | 421 /** |
| 425 * These two functions are called from GrGLLightingEffect's emitCode() funct
ion. | 422 * These two functions are called from GrGLLightingEffect's emitCode() funct
ion. |
| 426 * emitSurfaceToLight places an expression in param out that is the vector f
rom the surface to | 423 * emitSurfaceToLight places an expression in param out that is the vector f
rom the surface to |
| 427 * the light. The expression will be used in the FS. emitLightColor writes a
n expression into | 424 * the light. The expression will be used in the FS. emitLightColor writes a
n expression into |
| 428 * the FS that is the color of the light. Either function may add functions
and/or uniforms to | 425 * the FS that is the color of the light. Either function may add functions
and/or uniforms to |
| 429 * the FS. The default of emitLightColor appends the name of the constant li
ght color uniform | 426 * the FS. The default of emitLightColor appends the name of the constant li
ght color uniform |
| 430 * and so this function only needs to be overridden if the light color varie
s spatially. | 427 * and so this function only needs to be overridden if the light color varie
s spatially. |
| 431 */ | 428 */ |
| 432 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) = 0; | 429 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) = 0; |
| 433 virtual void emitLightColor(GrGLShaderBuilder*, const char *surfaceToLight); | 430 virtual void emitLightColor(GrGLShaderBuilder*, GrGLShaderBuilder::Uniform*,
const char *surfaceToLight); |
| 434 | 431 |
| 435 // This is called from GrGLLightingEffect's setData(). Subclasses of GrGLLig
ht must call | 432 // This is called from GrGLLightingEffect's setData(). Subclasses of GrGLLig
ht must call |
| 436 // INHERITED::setData(). | 433 // INHERITED::setData(). |
| 437 virtual void setData(const GrGLUniformManager&, | 434 virtual void setData(const GrGLContext&, |
| 438 const SkLight* light, | 435 const SkLight* light, |
| 439 const SkIPoint& offset) const; | 436 const SkIPoint& offset) const; |
| 440 | 437 |
| 441 protected: | 438 protected: |
| 442 /** | 439 /** |
| 443 * Gets the constant light color uniform. Subclasses can use this in their e
mitLightColor | 440 * Gets the constant light color uniform. Subclasses can use this in their e
mitLightColor |
| 444 * function. | 441 * function. |
| 445 */ | 442 */ |
| 446 UniformHandle lightColorUni() const { return fColorUni; } | 443 GrGLUniform* lightColorUni() const { return fColorUni; } |
| 447 | 444 |
| 448 private: | 445 private: |
| 449 UniformHandle fColorUni; | 446 GrGLUniform* fColorUni; |
| 450 | 447 |
| 451 typedef SkRefCnt INHERITED; | 448 typedef SkRefCnt INHERITED; |
| 452 }; | 449 }; |
| 453 | 450 |
| 454 /////////////////////////////////////////////////////////////////////////////// | 451 /////////////////////////////////////////////////////////////////////////////// |
| 455 | 452 |
| 456 class GrGLDistantLight : public GrGLLight { | 453 class GrGLDistantLight : public GrGLLight { |
| 457 public: | 454 public: |
| 458 virtual ~GrGLDistantLight() {} | 455 virtual ~GrGLDistantLight() {} |
| 459 virtual void setData(const GrGLUniformManager&, | 456 virtual void setData(const GrGLContext&, |
| 460 const SkLight* light, | 457 const SkLight* light, |
| 461 const SkIPoint& offset) const SK_OVERRIDE; | 458 const SkIPoint& offset) const SK_OVERRIDE; |
| 462 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI
DE; | 459 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI
DE; |
| 463 | 460 |
| 464 private: | 461 private: |
| 465 typedef GrGLLight INHERITED; | 462 typedef GrGLLight INHERITED; |
| 466 UniformHandle fDirectionUni; | 463 GrGLUniform* fDirectionUni; |
| 467 }; | 464 }; |
| 468 | 465 |
| 469 /////////////////////////////////////////////////////////////////////////////// | 466 /////////////////////////////////////////////////////////////////////////////// |
| 470 | 467 |
| 471 class GrGLPointLight : public GrGLLight { | 468 class GrGLPointLight : public GrGLLight { |
| 472 public: | 469 public: |
| 473 virtual ~GrGLPointLight() {} | 470 virtual ~GrGLPointLight() {} |
| 474 virtual void setData(const GrGLUniformManager&, | 471 virtual void setData(const GrGLContext&, |
| 475 const SkLight* light, | 472 const SkLight* light, |
| 476 const SkIPoint& offset) const SK_OVERRIDE; | 473 const SkIPoint& offset) const SK_OVERRIDE; |
| 477 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI
DE; | 474 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI
DE; |
| 478 | 475 |
| 479 private: | 476 private: |
| 480 typedef GrGLLight INHERITED; | 477 typedef GrGLLight INHERITED; |
| 481 UniformHandle fLocationUni; | 478 GrGLUniform* fLocationUni; |
| 482 }; | 479 }; |
| 483 | 480 |
| 484 /////////////////////////////////////////////////////////////////////////////// | 481 /////////////////////////////////////////////////////////////////////////////// |
| 485 | 482 |
| 486 class GrGLSpotLight : public GrGLLight { | 483 class GrGLSpotLight : public GrGLLight { |
| 487 public: | 484 public: |
| 488 virtual ~GrGLSpotLight() {} | 485 virtual ~GrGLSpotLight() {} |
| 489 virtual void setData(const GrGLUniformManager&, | 486 virtual void setData(const GrGLContext&, |
| 490 const SkLight* light, | 487 const SkLight* light, |
| 491 const SkIPoint& offset) const SK_OVERRIDE; | 488 const SkIPoint& offset) const SK_OVERRIDE; |
| 492 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI
DE; | 489 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI
DE; |
| 493 virtual void emitLightColor(GrGLShaderBuilder*, const char *surfaceToLight)
SK_OVERRIDE; | 490 virtual void emitLightColor(GrGLShaderBuilder*, GrGLShaderBuilder::Uniform*,
const char *surfaceToLight) SK_OVERRIDE; |
| 494 | 491 |
| 495 private: | 492 private: |
| 496 typedef GrGLLight INHERITED; | 493 typedef GrGLLight INHERITED; |
| 497 | 494 |
| 498 SkString fLightColorFunc; | 495 SkString fLightColorFunc; |
| 499 UniformHandle fLocationUni; | 496 GrGLUniform* fLocationUni; |
| 500 UniformHandle fExponentUni; | 497 GrGLUniform* fExponentUni; |
| 501 UniformHandle fCosOuterConeAngleUni; | 498 GrGLUniform* fCosOuterConeAngleUni; |
| 502 UniformHandle fCosInnerConeAngleUni; | 499 GrGLUniform* fCosInnerConeAngleUni; |
| 503 UniformHandle fConeScaleUni; | 500 GrGLUniform* fConeScaleUni; |
| 504 UniformHandle fSUni; | 501 GrGLUniform* fSUni; |
| 505 }; | 502 }; |
| 506 #else | 503 #else |
| 507 | 504 |
| 508 class GrGLLight; | 505 class GrGLLight; |
| 509 | 506 |
| 510 #endif | 507 #endif |
| 511 | 508 |
| 512 }; | 509 }; |
| 513 | 510 |
| 514 /////////////////////////////////////////////////////////////////////////////// | 511 /////////////////////////////////////////////////////////////////////////////// |
| (...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1031 EffectKey, | 1028 EffectKey, |
| 1032 const char* outputColor, | 1029 const char* outputColor, |
| 1033 const char* inputColor, | 1030 const char* inputColor, |
| 1034 const TextureSamplerArray&) SK_OVERRIDE; | 1031 const TextureSamplerArray&) SK_OVERRIDE; |
| 1035 | 1032 |
| 1036 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); | 1033 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); |
| 1037 | 1034 |
| 1038 /** | 1035 /** |
| 1039 * Subclasses of GrGLLightingEffect must call INHERITED::setData(); | 1036 * Subclasses of GrGLLightingEffect must call INHERITED::setData(); |
| 1040 */ | 1037 */ |
| 1041 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; | 1038 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE; |
| 1042 | 1039 |
| 1043 protected: | 1040 protected: |
| 1044 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) = 0; | 1041 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) = 0; |
| 1045 | 1042 |
| 1046 private: | 1043 private: |
| 1047 typedef GrGLEffect INHERITED; | 1044 typedef GrGLEffect INHERITED; |
| 1048 | 1045 |
| 1049 UniformHandle fImageIncrementUni; | 1046 GrGLUniform* fImageIncrementUni; |
| 1050 UniformHandle fSurfaceScaleUni; | 1047 GrGLUniform* fSurfaceScaleUni; |
| 1051 GrGLLight* fLight; | 1048 GrGLLight* fLight; |
| 1052 GrGLEffectMatrix fEffectMatrix; | 1049 GrGLEffectMatrix fEffectMatrix; |
| 1053 }; | 1050 }; |
| 1054 | 1051 |
| 1055 /////////////////////////////////////////////////////////////////////////////// | 1052 /////////////////////////////////////////////////////////////////////////////// |
| 1056 | 1053 |
| 1057 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { | 1054 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { |
| 1058 public: | 1055 public: |
| 1059 GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory, | 1056 GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory, |
| 1060 const GrDrawEffect& drawEffect); | 1057 const GrDrawEffect& drawEffect); |
| 1061 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI
DE; | 1058 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI
DE; |
| 1062 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; | 1059 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE; |
| 1063 | 1060 |
| 1064 private: | 1061 private: |
| 1065 typedef GrGLLightingEffect INHERITED; | 1062 typedef GrGLLightingEffect INHERITED; |
| 1066 | 1063 |
| 1067 UniformHandle fKDUni; | 1064 GrGLUniform* fKDUni; |
| 1068 }; | 1065 }; |
| 1069 | 1066 |
| 1070 /////////////////////////////////////////////////////////////////////////////// | 1067 /////////////////////////////////////////////////////////////////////////////// |
| 1071 | 1068 |
| 1072 class GrGLSpecularLightingEffect : public GrGLLightingEffect { | 1069 class GrGLSpecularLightingEffect : public GrGLLightingEffect { |
| 1073 public: | 1070 public: |
| 1074 GrGLSpecularLightingEffect(const GrBackendEffectFactory& factory, | 1071 GrGLSpecularLightingEffect(const GrBackendEffectFactory& factory, |
| 1075 const GrDrawEffect& effect); | 1072 const GrDrawEffect& effect); |
| 1076 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI
DE; | 1073 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI
DE; |
| 1077 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; | 1074 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE; |
| 1078 | 1075 |
| 1079 private: | 1076 private: |
| 1080 typedef GrGLLightingEffect INHERITED; | 1077 typedef GrGLLightingEffect INHERITED; |
| 1081 | 1078 |
| 1082 UniformHandle fKSUni; | 1079 GrGLUniform* fKSUni; |
| 1083 UniformHandle fShininessUni; | 1080 GrGLUniform* fShininessUni; |
| 1084 }; | 1081 }; |
| 1085 | 1082 |
| 1086 /////////////////////////////////////////////////////////////////////////////// | 1083 /////////////////////////////////////////////////////////////////////////////// |
| 1087 | 1084 |
| 1088 GrLightingEffect::GrLightingEffect(GrTexture* texture, | 1085 GrLightingEffect::GrLightingEffect(GrTexture* texture, |
| 1089 const SkLight* light, | 1086 const SkLight* light, |
| 1090 SkScalar surfaceScale, | 1087 SkScalar surfaceScale, |
| 1091 const SkIPoint& offset) | 1088 const SkIPoint& offset) |
| 1092 : INHERITED(texture, MakeDivByTextureWHMatrix(texture)) | 1089 : INHERITED(texture, MakeDivByTextureWHMatrix(texture)) |
| 1093 , fLight(light) | 1090 , fLight(light) |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1143 return GrDiffuseLightingEffect::Create(textures[GrEffectUnitTest::kAlphaText
ureIdx], | 1140 return GrDiffuseLightingEffect::Create(textures[GrEffectUnitTest::kAlphaText
ureIdx], |
| 1144 light, surfaceScale, offset, kd); | 1141 light, surfaceScale, offset, kd); |
| 1145 } | 1142 } |
| 1146 | 1143 |
| 1147 | 1144 |
| 1148 /////////////////////////////////////////////////////////////////////////////// | 1145 /////////////////////////////////////////////////////////////////////////////// |
| 1149 | 1146 |
| 1150 GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory, | 1147 GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory, |
| 1151 const GrDrawEffect& drawEffect) | 1148 const GrDrawEffect& drawEffect) |
| 1152 : INHERITED(factory) | 1149 : INHERITED(factory) |
| 1153 , fImageIncrementUni(kInvalidUniformHandle) | 1150 , fImageIncrementUni(NULL) |
| 1154 , fSurfaceScaleUni(kInvalidUniformHandle) | 1151 , fSurfaceScaleUni(NULL) |
| 1155 , fEffectMatrix(drawEffect.castEffect<GrLightingEffect>().coordsType()) { | 1152 , fEffectMatrix(drawEffect.castEffect<GrLightingEffect>().coordsType()) { |
| 1156 const GrLightingEffect& m = drawEffect.castEffect<GrLightingEffect>(); | 1153 const GrLightingEffect& m = drawEffect.castEffect<GrLightingEffect>(); |
| 1157 fLight = m.light()->createGLLight(); | 1154 fLight = m.light()->createGLLight(); |
| 1158 } | 1155 } |
| 1159 | 1156 |
| 1160 GrGLLightingEffect::~GrGLLightingEffect() { | 1157 GrGLLightingEffect::~GrGLLightingEffect() { |
| 1161 delete fLight; | 1158 delete fLight; |
| 1162 } | 1159 } |
| 1163 | 1160 |
| 1164 void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, | 1161 void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, |
| 1165 const GrDrawEffect&, | 1162 const GrDrawEffect&, |
| 1166 EffectKey key, | 1163 EffectKey key, |
| 1167 const char* outputColor, | 1164 const char* outputColor, |
| 1168 const char* inputColor, | 1165 const char* inputColor, |
| 1169 const TextureSamplerArray& samplers) { | 1166 const TextureSamplerArray& samplers) { |
| 1170 const char* coords; | 1167 const char* coords; |
| 1171 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); | 1168 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); |
| 1172 | 1169 |
| 1173 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader
Type, | 1170 GrGLShaderBuilder::Uniform* imageIncrementUni = |
| 1174 kVec2f_GrSLType, | 1171 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSL
Type, |
| 1175 "ImageIncrement"); | 1172 "ImageIncrement"); |
| 1176 fSurfaceScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderTy
pe, | 1173 fImageIncrementUni = imageIncrementUni->glUniform(); |
| 1177 kFloat_GrSLType, | 1174 |
| 1178 "SurfaceScale"); | 1175 GrGLShaderBuilder::Uniform* surfaceScaleUni = |
| 1179 fLight->emitLightColorUniform(builder); | 1176 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSL
Type, "SurfaceScale"); |
| 1177 fSurfaceScaleUni = surfaceScaleUni->glUniform(); |
| 1178 |
| 1179 GrGLShaderBuilder::Uniform* lightColorUni = fLight->emitLightColorUniform(bu
ilder); |
| 1180 SkString lightFunc; | 1180 SkString lightFunc; |
| 1181 this->emitLightFunc(builder, &lightFunc); | 1181 this->emitLightFunc(builder, &lightFunc); |
| 1182 static const GrGLShaderVar gSobelArgs[] = { | 1182 static const GrGLShaderVar gSobelArgs[] = { |
| 1183 GrGLShaderVar("a", kFloat_GrSLType), | 1183 GrGLShaderVar("a", kFloat_GrSLType), |
| 1184 GrGLShaderVar("b", kFloat_GrSLType), | 1184 GrGLShaderVar("b", kFloat_GrSLType), |
| 1185 GrGLShaderVar("c", kFloat_GrSLType), | 1185 GrGLShaderVar("c", kFloat_GrSLType), |
| 1186 GrGLShaderVar("d", kFloat_GrSLType), | 1186 GrGLShaderVar("d", kFloat_GrSLType), |
| 1187 GrGLShaderVar("e", kFloat_GrSLType), | 1187 GrGLShaderVar("e", kFloat_GrSLType), |
| 1188 GrGLShaderVar("f", kFloat_GrSLType), | 1188 GrGLShaderVar("f", kFloat_GrSLType), |
| 1189 GrGLShaderVar("scale", kFloat_GrSLType), | 1189 GrGLShaderVar("scale", kFloat_GrSLType), |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1226 kVec3f_GrSLType, | 1226 kVec3f_GrSLType, |
| 1227 "interiorNormal", | 1227 "interiorNormal", |
| 1228 SK_ARRAY_COUNT(gInteriorNormalArgs), | 1228 SK_ARRAY_COUNT(gInteriorNormalArgs), |
| 1229 gInteriorNormalArgs, | 1229 gInteriorNormalArgs, |
| 1230 interiorNormalBody.c_str(), | 1230 interiorNormalBody.c_str(), |
| 1231 &interiorNormalName); | 1231 &interiorNormalName); |
| 1232 | 1232 |
| 1233 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords); | 1233 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords); |
| 1234 builder->fsCodeAppend("\t\tfloat m[9];\n"); | 1234 builder->fsCodeAppend("\t\tfloat m[9];\n"); |
| 1235 | 1235 |
| 1236 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); | |
| 1237 const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni); | |
| 1238 | |
| 1239 int index = 0; | 1236 int index = 0; |
| 1240 for (int dy = -1; dy <= 1; dy++) { | 1237 for (int dy = -1; dy <= 1; dy++) { |
| 1241 for (int dx = -1; dx <= 1; dx++) { | 1238 for (int dx = -1; dx <= 1; dx++) { |
| 1242 SkString texCoords; | 1239 SkString texCoords; |
| 1243 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); | 1240 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imageIncremen
tUni->c_str()); |
| 1244 builder->fsCodeAppendf("\t\tm[%d] = ", index++); | 1241 builder->fsCodeAppendf("\t\tm[%d] = ", index++); |
| 1245 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType
, | 1242 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType
, |
| 1246 samplers[0], | 1243 samplers[0], |
| 1247 texCoords.c_str()); | 1244 texCoords.c_str()); |
| 1248 builder->fsCodeAppend(".a;\n"); | 1245 builder->fsCodeAppend(".a;\n"); |
| 1249 } | 1246 } |
| 1250 } | 1247 } |
| 1251 builder->fsCodeAppend("\t\tvec3 surfaceToLight = "); | 1248 builder->fsCodeAppend("\t\tvec3 surfaceToLight = "); |
| 1252 SkString arg; | 1249 SkString arg; |
| 1253 arg.appendf("%s * m[4]", surfScale); | 1250 arg.appendf("%s * m[4]", surfaceScaleUni->c_str()); |
| 1254 fLight->emitSurfaceToLight(builder, arg.c_str()); | 1251 fLight->emitSurfaceToLight(builder, arg.c_str()); |
| 1255 builder->fsCodeAppend(";\n"); | 1252 builder->fsCodeAppend(";\n"); |
| 1256 builder->fsCodeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", | 1253 builder->fsCodeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", |
| 1257 outputColor, lightFunc.c_str(), interiorNormalName.c_
str(), surfScale); | 1254 outputColor, lightFunc.c_str(), interiorNormalName.c_
str(), surfaceScaleUni->c_str()); |
| 1258 fLight->emitLightColor(builder, "surfaceToLight"); | 1255 fLight->emitLightColor(builder, lightColorUni, "surfaceToLight"); |
| 1259 builder->fsCodeAppend(");\n"); | 1256 builder->fsCodeAppend(");\n"); |
| 1260 SkString modulate; | 1257 SkString modulate; |
| 1261 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); | 1258 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); |
| 1262 builder->fsCodeAppend(modulate.c_str()); | 1259 builder->fsCodeAppend(modulate.c_str()); |
| 1263 } | 1260 } |
| 1264 | 1261 |
| 1265 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrDrawEffect& drawEffect, | 1262 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrDrawEffect& drawEffect, |
| 1266 const GrGLCaps& caps) { | 1263 const GrGLCaps& caps) { |
| 1267 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>()
; | 1264 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>()
; |
| 1268 EffectKey key = lighting.light()->type(); | 1265 EffectKey key = lighting.light()->type(); |
| 1269 key <<= GrGLEffectMatrix::kKeyBits; | 1266 key <<= GrGLEffectMatrix::kKeyBits; |
| 1270 EffectKey matrixKey = GrGLEffectMatrix::GenKey(lighting.getMatrix(), | 1267 EffectKey matrixKey = GrGLEffectMatrix::GenKey(lighting.getMatrix(), |
| 1271 drawEffect, | 1268 drawEffect, |
| 1272 lighting.coordsType(), | 1269 lighting.coordsType(), |
| 1273 lighting.texture(0)); | 1270 lighting.texture(0)); |
| 1274 return key | matrixKey; | 1271 return key | matrixKey; |
| 1275 } | 1272 } |
| 1276 | 1273 |
| 1277 void GrGLLightingEffect::setData(const GrGLUniformManager& uman, | 1274 void GrGLLightingEffect::setData(const GrGLContext& context, |
| 1278 const GrDrawEffect& drawEffect) { | 1275 const GrDrawEffect& drawEffect) { |
| 1279 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>()
; | 1276 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>()
; |
| 1280 GrTexture* texture = lighting.texture(0); | 1277 GrTexture* texture = lighting.texture(0); |
| 1281 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; | 1278 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; |
| 1282 uman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->hei
ght()); | 1279 fImageIncrementUni->set2f(context, 1.0f / texture->width(), ySign / texture-
>height()); |
| 1283 uman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); | 1280 fSurfaceScaleUni->set1f(context, lighting.surfaceScale()); |
| 1284 fLight->setData(uman, lighting.light(), lighting.offset()); | 1281 fLight->setData(context, lighting.light(), lighting.offset()); |
| 1285 fEffectMatrix.setData(uman, | 1282 fEffectMatrix.setData(context, |
| 1286 lighting.getMatrix(), | 1283 lighting.getMatrix(), |
| 1287 drawEffect, | 1284 drawEffect, |
| 1288 lighting.texture(0)); | 1285 lighting.texture(0)); |
| 1289 } | 1286 } |
| 1290 | 1287 |
| 1291 /////////////////////////////////////////////////////////////////////////////// | 1288 /////////////////////////////////////////////////////////////////////////////// |
| 1292 | 1289 |
| 1293 /////////////////////////////////////////////////////////////////////////////// | 1290 /////////////////////////////////////////////////////////////////////////////// |
| 1294 | 1291 |
| 1295 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactor
y& factory, | 1292 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactor
y& factory, |
| 1296 const GrDrawEffect& drawEff
ect) | 1293 const GrDrawEffect& drawEff
ect) |
| 1297 : INHERITED(factory, drawEffect) | 1294 : INHERITED(factory, drawEffect) |
| 1298 , fKDUni(kInvalidUniformHandle) { | 1295 , fKDUni(NULL) { |
| 1299 } | 1296 } |
| 1300 | 1297 |
| 1301 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStri
ng* funcName) { | 1298 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStri
ng* funcName) { |
| 1302 const char* kd; | 1299 const char* kd; |
| 1303 fKDUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 1300 fKDUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
| 1304 kFloat_GrSLType, | 1301 kFloat_GrSLType, |
| 1305 "KD", | 1302 "KD", |
| 1306 &kd); | 1303 &kd)->glUniform(); |
| 1307 | 1304 |
| 1308 static const GrGLShaderVar gLightArgs[] = { | 1305 static const GrGLShaderVar gLightArgs[] = { |
| 1309 GrGLShaderVar("normal", kVec3f_GrSLType), | 1306 GrGLShaderVar("normal", kVec3f_GrSLType), |
| 1310 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), | 1307 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), |
| 1311 GrGLShaderVar("lightColor", kVec3f_GrSLType) | 1308 GrGLShaderVar("lightColor", kVec3f_GrSLType) |
| 1312 }; | 1309 }; |
| 1313 SkString lightBody; | 1310 SkString lightBody; |
| 1314 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); | 1311 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); |
| 1315 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1
.0);\n"); | 1312 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1
.0);\n"); |
| 1316 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, | 1313 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, |
| 1317 kVec4f_GrSLType, | 1314 kVec4f_GrSLType, |
| 1318 "light", | 1315 "light", |
| 1319 SK_ARRAY_COUNT(gLightArgs), | 1316 SK_ARRAY_COUNT(gLightArgs), |
| 1320 gLightArgs, | 1317 gLightArgs, |
| 1321 lightBody.c_str(), | 1318 lightBody.c_str(), |
| 1322 funcName); | 1319 funcName); |
| 1323 } | 1320 } |
| 1324 | 1321 |
| 1325 void GrGLDiffuseLightingEffect::setData(const GrGLUniformManager& uman, | 1322 void GrGLDiffuseLightingEffect::setData(const GrGLContext& context, |
| 1326 const GrDrawEffect& drawEffect) { | 1323 const GrDrawEffect& drawEffect) { |
| 1327 INHERITED::setData(uman, drawEffect); | 1324 INHERITED::setData(context, drawEffect); |
| 1328 const GrDiffuseLightingEffect& diffuse = drawEffect.castEffect<GrDiffuseLigh
tingEffect>(); | 1325 const GrDiffuseLightingEffect& diffuse = drawEffect.castEffect<GrDiffuseLigh
tingEffect>(); |
| 1329 uman.set1f(fKDUni, diffuse.kd()); | 1326 fKDUni->set1f(context, diffuse.kd()); |
| 1330 } | 1327 } |
| 1331 | 1328 |
| 1332 /////////////////////////////////////////////////////////////////////////////// | 1329 /////////////////////////////////////////////////////////////////////////////// |
| 1333 | 1330 |
| 1334 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, | 1331 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, |
| 1335 const SkLight* light, | 1332 const SkLight* light, |
| 1336 SkScalar surfaceScale, | 1333 SkScalar surfaceScale, |
| 1337 const SkIPoint& offset, | 1334 const SkIPoint& offset, |
| 1338 SkScalar ks, | 1335 SkScalar ks, |
| 1339 SkScalar shininess) | 1336 SkScalar shininess) |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1365 SkAutoTUnref<SkLight> light(create_random_light(random)); | 1362 SkAutoTUnref<SkLight> light(create_random_light(random)); |
| 1366 SkIPoint offset = SkIPoint::Make(random->nextS(), random->nextS()); | 1363 SkIPoint offset = SkIPoint::Make(random->nextS(), random->nextS()); |
| 1367 return GrSpecularLightingEffect::Create(textures[GrEffectUnitTest::kAlphaTex
tureIdx], | 1364 return GrSpecularLightingEffect::Create(textures[GrEffectUnitTest::kAlphaTex
tureIdx], |
| 1368 light, surfaceScale, offset, ks, shi
niness); | 1365 light, surfaceScale, offset, ks, shi
niness); |
| 1369 } | 1366 } |
| 1370 | 1367 |
| 1371 /////////////////////////////////////////////////////////////////////////////// | 1368 /////////////////////////////////////////////////////////////////////////////// |
| 1372 | 1369 |
| 1373 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrBackendEffectFact
ory& factory, | 1370 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrBackendEffectFact
ory& factory, |
| 1374 const GrDrawEffect& drawE
ffect) | 1371 const GrDrawEffect& drawE
ffect) |
| 1375 : GrGLLightingEffect(factory, drawEffect) | 1372 : INHERITED(factory, drawEffect) |
| 1376 , fKSUni(kInvalidUniformHandle) | 1373 , fKSUni(NULL) |
| 1377 , fShininessUni(kInvalidUniformHandle) { | 1374 , fShininessUni(NULL) { |
| 1378 } | 1375 } |
| 1379 | 1376 |
| 1380 void GrGLSpecularLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStr
ing* funcName) { | 1377 void GrGLSpecularLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStr
ing* funcName) { |
| 1381 const char* ks; | 1378 const char* ks; |
| 1382 const char* shininess; | 1379 const char* shininess; |
| 1383 | 1380 |
| 1384 fKSUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 1381 fKSUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
| 1385 kFloat_GrSLType, "KS", &ks); | 1382 kFloat_GrSLType, "KS", &ks)->glUniform(); |
| 1386 fShininessUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 1383 fShininessUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
| 1387 kFloat_GrSLType, "Shininess", &shininess
); | 1384 kFloat_GrSLType, "Shininess", &shininess
)->glUniform(); |
| 1388 | 1385 |
| 1389 static const GrGLShaderVar gLightArgs[] = { | 1386 static const GrGLShaderVar gLightArgs[] = { |
| 1390 GrGLShaderVar("normal", kVec3f_GrSLType), | 1387 GrGLShaderVar("normal", kVec3f_GrSLType), |
| 1391 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), | 1388 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), |
| 1392 GrGLShaderVar("lightColor", kVec3f_GrSLType) | 1389 GrGLShaderVar("lightColor", kVec3f_GrSLType) |
| 1393 }; | 1390 }; |
| 1394 SkString lightBody; | 1391 SkString lightBody; |
| 1395 lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0,
0, 1)));\n"); | 1392 lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0,
0, 1)));\n"); |
| 1396 lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\
n", ks, shininess); | 1393 lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\
n", ks, shininess); |
| 1397 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); | 1394 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); |
| 1398 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b))
;\n"); | 1395 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b))
;\n"); |
| 1399 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, | 1396 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, |
| 1400 kVec4f_GrSLType, | 1397 kVec4f_GrSLType, |
| 1401 "light", | 1398 "light", |
| 1402 SK_ARRAY_COUNT(gLightArgs), | 1399 SK_ARRAY_COUNT(gLightArgs), |
| 1403 gLightArgs, | 1400 gLightArgs, |
| 1404 lightBody.c_str(), | 1401 lightBody.c_str(), |
| 1405 funcName); | 1402 funcName); |
| 1406 } | 1403 } |
| 1407 | 1404 |
| 1408 void GrGLSpecularLightingEffect::setData(const GrGLUniformManager& uman, | 1405 void GrGLSpecularLightingEffect::setData(const GrGLContext& context, |
| 1409 const GrDrawEffect& drawEffect) { | 1406 const GrDrawEffect& drawEffect) { |
| 1410 INHERITED::setData(uman, drawEffect); | 1407 INHERITED::setData(context, drawEffect); |
| 1411 const GrSpecularLightingEffect& spec = drawEffect.castEffect<GrSpecularLight
ingEffect>(); | 1408 const GrSpecularLightingEffect& spec = drawEffect.castEffect<GrSpecularLight
ingEffect>(); |
| 1412 uman.set1f(fKSUni, spec.ks()); | 1409 fKSUni->set1f(context, spec.ks()); |
| 1413 uman.set1f(fShininessUni, spec.shininess()); | 1410 fShininessUni->set1f(context, spec.shininess()); |
| 1414 } | 1411 } |
| 1415 | 1412 |
| 1416 /////////////////////////////////////////////////////////////////////////////// | 1413 /////////////////////////////////////////////////////////////////////////////// |
| 1417 void GrGLLight::emitLightColorUniform(GrGLShaderBuilder* builder) { | 1414 GrGLShaderBuilder::Uniform* GrGLLight::emitLightColorUniform(GrGLShaderBuilder*
builder) { |
| 1418 fColorUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 1415 GrGLShaderBuilder::Uniform* colorUni = |
| 1419 kVec3f_GrSLType, "LightColor"); | 1416 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
| 1417 kVec3f_GrSLType, "LightColor"); |
| 1418 fColorUni = colorUni->glUniform(); |
| 1419 return colorUni; |
| 1420 } | 1420 } |
| 1421 | 1421 |
| 1422 void GrGLLight::emitLightColor(GrGLShaderBuilder* builder, | 1422 void GrGLLight::emitLightColor(GrGLShaderBuilder* builder, |
| 1423 GrGLShaderBuilder::Uniform* colorUni, |
| 1423 const char *surfaceToLight) { | 1424 const char *surfaceToLight) { |
| 1424 builder->fsCodeAppend(builder->getUniformCStr(this->lightColorUni())); | 1425 builder->fsCodeAppend(colorUni->c_str()); |
| 1425 } | 1426 } |
| 1426 | 1427 |
| 1427 void GrGLLight::setData(const GrGLUniformManager& uman, | 1428 void GrGLLight::setData(const GrGLContext& context, |
| 1428 const SkLight* light, | 1429 const SkLight* light, |
| 1429 const SkIPoint&) const { | 1430 const SkIPoint&) const { |
| 1430 setUniformPoint3(uman, fColorUni, light->color() * SkScalarInvert(SkIntToSca
lar(255))); | 1431 setUniformPoint3(context, fColorUni, light->color() * SkScalarInvert(SkIntTo
Scalar(255))); |
| 1431 } | 1432 } |
| 1432 | 1433 |
| 1433 /////////////////////////////////////////////////////////////////////////////// | 1434 /////////////////////////////////////////////////////////////////////////////// |
| 1434 | 1435 |
| 1435 void GrGLDistantLight::setData(const GrGLUniformManager& uman, | 1436 void GrGLDistantLight::setData(const GrGLContext& context, |
| 1436 const SkLight* light, | 1437 const SkLight* light, |
| 1437 const SkIPoint& offset) const { | 1438 const SkIPoint& offset) const { |
| 1438 INHERITED::setData(uman, light, offset); | 1439 INHERITED::setData(context, light, offset); |
| 1439 SkASSERT(light->type() == SkLight::kDistant_LightType); | 1440 SkASSERT(light->type() == SkLight::kDistant_LightType); |
| 1440 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh
t); | 1441 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh
t); |
| 1441 setUniformNormal3(uman, fDirectionUni, distantLight->direction()); | 1442 setUniformNormal3(context, fDirectionUni, distantLight->direction()); |
| 1442 } | 1443 } |
| 1443 | 1444 |
| 1444 void GrGLDistantLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char
* z) { | 1445 void GrGLDistantLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char
* z) { |
| 1445 const char* dir; | 1446 const char* dir; |
| 1446 fDirectionUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
kVec3f_GrSLType, | 1447 fDirectionUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
kVec3f_GrSLType, |
| 1447 "LightDirection", &dir); | 1448 "LightDirection", &dir)->glUniform(); |
| 1448 builder->fsCodeAppend(dir); | 1449 builder->fsCodeAppend(dir); |
| 1449 } | 1450 } |
| 1450 | 1451 |
| 1451 /////////////////////////////////////////////////////////////////////////////// | 1452 /////////////////////////////////////////////////////////////////////////////// |
| 1452 | 1453 |
| 1453 void GrGLPointLight::setData(const GrGLUniformManager& uman, | 1454 void GrGLPointLight::setData(const GrGLContext& context, |
| 1454 const SkLight* light, | 1455 const SkLight* light, |
| 1455 const SkIPoint& offset) const { | 1456 const SkIPoint& offset) const { |
| 1456 INHERITED::setData(uman, light, offset); | 1457 INHERITED::setData(context, light, offset); |
| 1457 SkASSERT(light->type() == SkLight::kPoint_LightType); | 1458 SkASSERT(light->type() == SkLight::kPoint_LightType); |
| 1458 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light); | 1459 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light); |
| 1459 SkPoint3 location = pointLight->location(); | 1460 SkPoint3 location = pointLight->location(); |
| 1460 location.fX -= offset.fX; | 1461 location.fX -= offset.fX; |
| 1461 location.fY -= offset.fY; | 1462 location.fY -= offset.fY; |
| 1462 setUniformPoint3(uman, fLocationUni, location); | 1463 setUniformPoint3(context, fLocationUni, location); |
| 1463 } | 1464 } |
| 1464 | 1465 |
| 1465 void GrGLPointLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char*
z) { | 1466 void GrGLPointLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char*
z) { |
| 1466 const char* loc; | 1467 const char* loc; |
| 1467 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
kVec3f_GrSLType, | 1468 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
kVec3f_GrSLType, |
| 1468 "LightLocation", &loc); | 1469 "LightLocation", &loc)->glUniform(); |
| 1469 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))", loc, builder->frag
mentPosition(), z); | 1470 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))", loc, builder->frag
mentPosition(), z); |
| 1470 } | 1471 } |
| 1471 | 1472 |
| 1472 /////////////////////////////////////////////////////////////////////////////// | 1473 /////////////////////////////////////////////////////////////////////////////// |
| 1473 | 1474 |
| 1474 void GrGLSpotLight::setData(const GrGLUniformManager& uman, | 1475 void GrGLSpotLight::setData(const GrGLContext& context, |
| 1475 const SkLight* light, | 1476 const SkLight* light, |
| 1476 const SkIPoint& offset) const { | 1477 const SkIPoint& offset) const { |
| 1477 INHERITED::setData(uman, light, offset); | 1478 INHERITED::setData(context, light, offset); |
| 1478 SkASSERT(light->type() == SkLight::kSpot_LightType); | 1479 SkASSERT(light->type() == SkLight::kSpot_LightType); |
| 1479 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light); | 1480 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light); |
| 1480 SkPoint3 location = spotLight->location(); | 1481 SkPoint3 location = spotLight->location(); |
| 1481 location.fX -= offset.fX; | 1482 location.fX -= offset.fX; |
| 1482 location.fY -= offset.fY; | 1483 location.fY -= offset.fY; |
| 1483 setUniformPoint3(uman, fLocationUni, location); | 1484 setUniformPoint3(context, fLocationUni, location); |
| 1484 uman.set1f(fExponentUni, spotLight->specularExponent()); | 1485 fExponentUni->set1f(context, spotLight->specularExponent()); |
| 1485 uman.set1f(fCosInnerConeAngleUni, spotLight->cosInnerConeAngle()); | 1486 fCosInnerConeAngleUni->set1f(context, spotLight->cosInnerConeAngle()); |
| 1486 uman.set1f(fCosOuterConeAngleUni, spotLight->cosOuterConeAngle()); | 1487 fCosOuterConeAngleUni->set1f(context, spotLight->cosOuterConeAngle()); |
| 1487 uman.set1f(fConeScaleUni, spotLight->coneScale()); | 1488 fConeScaleUni->set1f(context, spotLight->coneScale()); |
| 1488 setUniformNormal3(uman, fSUni, spotLight->s()); | 1489 setUniformNormal3(context, fSUni, spotLight->s()); |
| 1489 } | 1490 } |
| 1490 | 1491 |
| 1491 void GrGLSpotLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char* z
) { | 1492 void GrGLSpotLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char* z
) { |
| 1492 const char* location; | 1493 const char* location; |
| 1493 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 1494 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
| 1494 kVec3f_GrSLType, "LightLocation", &locati
on); | 1495 kVec3f_GrSLType, "LightLocation", &locati
on)->glUniform(); |
| 1495 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))", | 1496 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))", |
| 1496 location, builder->fragmentPosition(), z); | 1497 location, builder->fragmentPosition(), z); |
| 1497 } | 1498 } |
| 1498 | 1499 |
| 1499 void GrGLSpotLight::emitLightColor(GrGLShaderBuilder* builder, | 1500 void GrGLSpotLight::emitLightColor(GrGLShaderBuilder* builder, |
| 1501 GrGLShaderBuilder::Uniform* lightUni, |
| 1500 const char *surfaceToLight) { | 1502 const char *surfaceToLight) { |
| 1501 | 1503 |
| 1502 const char* color = builder->getUniformCStr(this->lightColorUni()); // creat
ed by parent class. | 1504 const char* color = lightUni->c_str(); // created by parent class. |
| 1503 | 1505 |
| 1504 const char* exponent; | 1506 const char* exponent; |
| 1505 const char* cosInner; | 1507 const char* cosInner; |
| 1506 const char* cosOuter; | 1508 const char* cosOuter; |
| 1507 const char* coneScale; | 1509 const char* coneScale; |
| 1508 const char* s; | 1510 const char* s; |
| 1509 fExponentUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 1511 fExponentUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
| 1510 kFloat_GrSLType, "Exponent", &exponent); | 1512 kFloat_GrSLType, "Exponent", &exponent)->
glUniform(); |
| 1511 fCosInnerConeAngleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Sha
derType, | 1513 fCosInnerConeAngleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Sha
derType, |
| 1512 kFloat_GrSLType, "CosInnerConeAn
gle", &cosInner); | 1514 kFloat_GrSLType, "CosInnerConeAn
gle", &cosInner)->glUniform(); |
| 1513 fCosOuterConeAngleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Sha
derType, | 1515 fCosOuterConeAngleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Sha
derType, |
| 1514 kFloat_GrSLType, "CosOuterConeAn
gle", &cosOuter); | 1516 kFloat_GrSLType, "CosOuterConeAn
gle", &cosOuter)->glUniform(); |
| 1515 fConeScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 1517 fConeScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
| 1516 kFloat_GrSLType, "ConeScale", &coneScale
); | 1518 kFloat_GrSLType, "ConeScale", &coneScale
)->glUniform(); |
| 1517 fSUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 1519 fSUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
| 1518 kVec3f_GrSLType, "S", &s); | 1520 kVec3f_GrSLType, "S", &s)->glUniform(); |
| 1519 | 1521 |
| 1520 static const GrGLShaderVar gLightColorArgs[] = { | 1522 static const GrGLShaderVar gLightColorArgs[] = { |
| 1521 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType) | 1523 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType) |
| 1522 }; | 1524 }; |
| 1523 SkString lightColorBody; | 1525 SkString lightColorBody; |
| 1524 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s); | 1526 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s); |
| 1525 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter); | 1527 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter); |
| 1526 lightColorBody.appendf("\t\treturn vec3(0);\n"); | 1528 lightColorBody.appendf("\t\treturn vec3(0);\n"); |
| 1527 lightColorBody.appendf("\t}\n"); | 1529 lightColorBody.appendf("\t}\n"); |
| 1528 lightColorBody.appendf("\tfloat scale = pow(cosAngle, %s);\n", exponent); | 1530 lightColorBody.appendf("\tfloat scale = pow(cosAngle, %s);\n", exponent); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1544 | 1546 |
| 1545 #endif | 1547 #endif |
| 1546 | 1548 |
| 1547 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1549 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
| 1548 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1550 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
| 1549 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1551 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
| 1550 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) | 1552 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) |
| 1551 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) | 1553 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) |
| 1552 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) | 1554 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) |
| 1553 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1555 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |