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 "SkDevice.h" | 11 #include "SkDevice.h" |
12 #include "SkPoint3.h" | 12 #include "SkPoint3.h" |
13 #include "SkReadBuffer.h" | 13 #include "SkReadBuffer.h" |
14 #include "SkTypes.h" | 14 #include "SkTypes.h" |
15 #include "SkWriteBuffer.h" | 15 #include "SkWriteBuffer.h" |
16 | 16 |
17 #if SK_SUPPORT_GPU | 17 #if SK_SUPPORT_GPU |
18 #include "GrContext.h" | 18 #include "GrContext.h" |
19 #include "GrDrawContext.h" | 19 #include "GrDrawContext.h" |
20 #include "GrFragmentProcessor.h" | 20 #include "GrFragmentProcessor.h" |
21 #include "GrInvariantOutput.h" | 21 #include "GrInvariantOutput.h" |
22 #include "GrPaint.h" | 22 #include "GrPaint.h" |
23 #include "effects/GrSingleTextureEffect.h" | 23 #include "effects/GrSingleTextureEffect.h" |
24 #include "gl/GrGLFragmentProcessor.h" | 24 #include "gl/GrGLFragmentProcessor.h" |
25 #include "gl/builders/GrGLProgramBuilder.h" | 25 #include "gl/builders/GrGLProgramBuilder.h" |
| 26 #include "glsl/GrGLSLProgramDataManager.h" |
26 | 27 |
27 class GrGLDiffuseLightingEffect; | 28 class GrGLDiffuseLightingEffect; |
28 class GrGLSpecularLightingEffect; | 29 class GrGLSpecularLightingEffect; |
29 | 30 |
30 // For brevity | 31 // For brevity |
31 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 32 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; |
32 #endif | 33 #endif |
33 | 34 |
34 namespace { | 35 namespace { |
35 | 36 |
36 const SkScalar gOneThird = SkIntToScalar(1) / 3; | 37 const SkScalar gOneThird = SkIntToScalar(1) / 3; |
37 const SkScalar gTwoThirds = SkIntToScalar(2) / 3; | 38 const SkScalar gTwoThirds = SkIntToScalar(2) / 3; |
38 const SkScalar gOneHalf = 0.5f; | 39 const SkScalar gOneHalf = 0.5f; |
39 const SkScalar gOneQuarter = 0.25f; | 40 const SkScalar gOneQuarter = 0.25f; |
40 | 41 |
41 #if SK_SUPPORT_GPU | 42 #if SK_SUPPORT_GPU |
42 void setUniformPoint3(const GrGLProgramDataManager& pdman, UniformHandle uni, | 43 void setUniformPoint3(const GrGLSLProgramDataManager& pdman, UniformHandle uni, |
43 const SkPoint3& point) { | 44 const SkPoint3& point) { |
44 GR_STATIC_ASSERT(sizeof(SkPoint3) == 3 * sizeof(GrGLfloat)); | 45 GR_STATIC_ASSERT(sizeof(SkPoint3) == 3 * sizeof(float)); |
45 pdman.set3fv(uni, 1, &point.fX); | 46 pdman.set3fv(uni, 1, &point.fX); |
46 } | 47 } |
47 | 48 |
48 void setUniformNormal3(const GrGLProgramDataManager& pdman, UniformHandle uni, | 49 void setUniformNormal3(const GrGLSLProgramDataManager& pdman, UniformHandle uni, |
49 const SkPoint3& point) { | 50 const SkPoint3& point) { |
50 setUniformPoint3(pdman, uni, point); | 51 setUniformPoint3(pdman, uni, point); |
51 } | 52 } |
52 #endif | 53 #endif |
53 | 54 |
54 // Shift matrix components to the left, as we advance pixels to the right. | 55 // Shift matrix components to the left, as we advance pixels to the right. |
55 inline void shiftMatrixLeft(int m[9]) { | 56 inline void shiftMatrixLeft(int m[9]) { |
56 m[0] = m[1]; | 57 m[0] = m[1]; |
57 m[3] = m[4]; | 58 m[3] = m[4]; |
58 m[6] = m[7]; | 59 m[6] = m[7]; |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
604 * the light. The expression will be used in the FS. emitLightColor writes a
n expression into | 605 * the light. The expression will be used in the FS. emitLightColor writes a
n expression into |
605 * the FS that is the color of the light. Either function may add functions
and/or uniforms to | 606 * the FS that is the color of the light. Either function may add functions
and/or uniforms to |
606 * the FS. The default of emitLightColor appends the name of the constant li
ght color uniform | 607 * the FS. The default of emitLightColor appends the name of the constant li
ght color uniform |
607 * and so this function only needs to be overridden if the light color varie
s spatially. | 608 * and so this function only needs to be overridden if the light color varie
s spatially. |
608 */ | 609 */ |
609 virtual void emitSurfaceToLight(GrGLFPBuilder*, const char* z) = 0; | 610 virtual void emitSurfaceToLight(GrGLFPBuilder*, const char* z) = 0; |
610 virtual void emitLightColor(GrGLFPBuilder*, const char *surfaceToLight); | 611 virtual void emitLightColor(GrGLFPBuilder*, const char *surfaceToLight); |
611 | 612 |
612 // This is called from GrGLLightingEffect's setData(). Subclasses of GrGLLig
ht must call | 613 // This is called from GrGLLightingEffect's setData(). Subclasses of GrGLLig
ht must call |
613 // INHERITED::setData(). | 614 // INHERITED::setData(). |
614 virtual void setData(const GrGLProgramDataManager&, const SkImageFilterLight
* light) const; | 615 virtual void setData(const GrGLSLProgramDataManager&, const SkImageFilterLig
ht* light) const; |
615 | 616 |
616 protected: | 617 protected: |
617 /** | 618 /** |
618 * Gets the constant light color uniform. Subclasses can use this in their e
mitLightColor | 619 * Gets the constant light color uniform. Subclasses can use this in their e
mitLightColor |
619 * function. | 620 * function. |
620 */ | 621 */ |
621 UniformHandle lightColorUni() const { return fColorUni; } | 622 UniformHandle lightColorUni() const { return fColorUni; } |
622 | 623 |
623 private: | 624 private: |
624 UniformHandle fColorUni; | 625 UniformHandle fColorUni; |
625 | 626 |
626 typedef SkRefCnt INHERITED; | 627 typedef SkRefCnt INHERITED; |
627 }; | 628 }; |
628 | 629 |
629 /////////////////////////////////////////////////////////////////////////////// | 630 /////////////////////////////////////////////////////////////////////////////// |
630 | 631 |
631 class GrGLDistantLight : public GrGLLight { | 632 class GrGLDistantLight : public GrGLLight { |
632 public: | 633 public: |
633 virtual ~GrGLDistantLight() {} | 634 virtual ~GrGLDistantLight() {} |
634 void setData(const GrGLProgramDataManager&, const SkImageFilterLight* light)
const override; | 635 void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* ligh
t) const override; |
635 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; | 636 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; |
636 | 637 |
637 private: | 638 private: |
638 typedef GrGLLight INHERITED; | 639 typedef GrGLLight INHERITED; |
639 UniformHandle fDirectionUni; | 640 UniformHandle fDirectionUni; |
640 }; | 641 }; |
641 | 642 |
642 /////////////////////////////////////////////////////////////////////////////// | 643 /////////////////////////////////////////////////////////////////////////////// |
643 | 644 |
644 class GrGLPointLight : public GrGLLight { | 645 class GrGLPointLight : public GrGLLight { |
645 public: | 646 public: |
646 virtual ~GrGLPointLight() {} | 647 virtual ~GrGLPointLight() {} |
647 void setData(const GrGLProgramDataManager&, const SkImageFilterLight* light)
const override; | 648 void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* ligh
t) const override; |
648 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; | 649 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; |
649 | 650 |
650 private: | 651 private: |
651 typedef GrGLLight INHERITED; | 652 typedef GrGLLight INHERITED; |
652 UniformHandle fLocationUni; | 653 UniformHandle fLocationUni; |
653 }; | 654 }; |
654 | 655 |
655 /////////////////////////////////////////////////////////////////////////////// | 656 /////////////////////////////////////////////////////////////////////////////// |
656 | 657 |
657 class GrGLSpotLight : public GrGLLight { | 658 class GrGLSpotLight : public GrGLLight { |
658 public: | 659 public: |
659 virtual ~GrGLSpotLight() {} | 660 virtual ~GrGLSpotLight() {} |
660 void setData(const GrGLProgramDataManager&, const SkImageFilterLight* light)
const override; | 661 void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* ligh
t) const override; |
661 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; | 662 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; |
662 void emitLightColor(GrGLFPBuilder*, const char *surfaceToLight) override; | 663 void emitLightColor(GrGLFPBuilder*, const char *surfaceToLight) override; |
663 | 664 |
664 private: | 665 private: |
665 typedef GrGLLight INHERITED; | 666 typedef GrGLLight INHERITED; |
666 | 667 |
667 SkString fLightColorFunc; | 668 SkString fLightColorFunc; |
668 UniformHandle fLocationUni; | 669 UniformHandle fLocationUni; |
669 UniformHandle fExponentUni; | 670 UniformHandle fExponentUni; |
670 UniformHandle fCosOuterConeAngleUni; | 671 UniformHandle fCosOuterConeAngleUni; |
(...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1512 virtual ~GrGLLightingEffect(); | 1513 virtual ~GrGLLightingEffect(); |
1513 | 1514 |
1514 void emitCode(EmitArgs&) override; | 1515 void emitCode(EmitArgs&) override; |
1515 | 1516 |
1516 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder* b); | 1517 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder* b); |
1517 | 1518 |
1518 protected: | 1519 protected: |
1519 /** | 1520 /** |
1520 * Subclasses of GrGLLightingEffect must call INHERITED::onSetData(); | 1521 * Subclasses of GrGLLightingEffect must call INHERITED::onSetData(); |
1521 */ | 1522 */ |
1522 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 1523 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
1523 | 1524 |
1524 virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) = 0; | 1525 virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) = 0; |
1525 | 1526 |
1526 private: | 1527 private: |
1527 typedef GrGLFragmentProcessor INHERITED; | 1528 typedef GrGLFragmentProcessor INHERITED; |
1528 | 1529 |
1529 UniformHandle fImageIncrementUni; | 1530 UniformHandle fImageIncrementUni; |
1530 UniformHandle fSurfaceScaleUni; | 1531 UniformHandle fSurfaceScaleUni; |
1531 GrGLLight* fLight; | 1532 GrGLLight* fLight; |
1532 BoundaryMode fBoundaryMode; | 1533 BoundaryMode fBoundaryMode; |
1533 }; | 1534 }; |
1534 | 1535 |
1535 /////////////////////////////////////////////////////////////////////////////// | 1536 /////////////////////////////////////////////////////////////////////////////// |
1536 | 1537 |
1537 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { | 1538 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { |
1538 public: | 1539 public: |
1539 GrGLDiffuseLightingEffect(const GrProcessor&); | 1540 GrGLDiffuseLightingEffect(const GrProcessor&); |
1540 void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; | 1541 void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; |
1541 | 1542 |
1542 protected: | 1543 protected: |
1543 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 1544 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
1544 | 1545 |
1545 private: | 1546 private: |
1546 typedef GrGLLightingEffect INHERITED; | 1547 typedef GrGLLightingEffect INHERITED; |
1547 | 1548 |
1548 UniformHandle fKDUni; | 1549 UniformHandle fKDUni; |
1549 }; | 1550 }; |
1550 | 1551 |
1551 /////////////////////////////////////////////////////////////////////////////// | 1552 /////////////////////////////////////////////////////////////////////////////// |
1552 | 1553 |
1553 class GrGLSpecularLightingEffect : public GrGLLightingEffect { | 1554 class GrGLSpecularLightingEffect : public GrGLLightingEffect { |
1554 public: | 1555 public: |
1555 GrGLSpecularLightingEffect(const GrProcessor&); | 1556 GrGLSpecularLightingEffect(const GrProcessor&); |
1556 void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; | 1557 void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; |
1557 | 1558 |
1558 protected: | 1559 protected: |
1559 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 1560 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
1560 | 1561 |
1561 private: | 1562 private: |
1562 typedef GrGLLightingEffect INHERITED; | 1563 typedef GrGLLightingEffect INHERITED; |
1563 | 1564 |
1564 UniformHandle fKSUni; | 1565 UniformHandle fKSUni; |
1565 UniformHandle fShininessUni; | 1566 UniformHandle fShininessUni; |
1566 }; | 1567 }; |
1567 | 1568 |
1568 /////////////////////////////////////////////////////////////////////////////// | 1569 /////////////////////////////////////////////////////////////////////////////// |
1569 | 1570 |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1735 GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor); | 1736 GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor); |
1736 fsBuilder->codeAppend(modulate.c_str()); | 1737 fsBuilder->codeAppend(modulate.c_str()); |
1737 } | 1738 } |
1738 | 1739 |
1739 void GrGLLightingEffect::GenKey(const GrProcessor& proc, | 1740 void GrGLLightingEffect::GenKey(const GrProcessor& proc, |
1740 const GrGLSLCaps& caps, GrProcessorKeyBuilder* b
) { | 1741 const GrGLSLCaps& caps, GrProcessorKeyBuilder* b
) { |
1741 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); | 1742 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); |
1742 b->add32(lighting.boundaryMode() << 2 | lighting.light()->type()); | 1743 b->add32(lighting.boundaryMode() << 2 | lighting.light()->type()); |
1743 } | 1744 } |
1744 | 1745 |
1745 void GrGLLightingEffect::onSetData(const GrGLProgramDataManager& pdman, | 1746 void GrGLLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman, |
1746 const GrProcessor& proc) { | 1747 const GrProcessor& proc) { |
1747 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); | 1748 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); |
1748 GrTexture* texture = lighting.texture(0); | 1749 GrTexture* texture = lighting.texture(0); |
1749 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; | 1750 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; |
1750 pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he
ight()); | 1751 pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he
ight()); |
1751 pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); | 1752 pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); |
1752 SkAutoTUnref<SkImageFilterLight> transformedLight( | 1753 SkAutoTUnref<SkImageFilterLight> transformedLight( |
1753 lighting.light()->transform(lighting
.filterMatrix())); | 1754 lighting.light()->transform(lighting
.filterMatrix())); |
1754 fLight->setData(pdman, transformedLight); | 1755 fLight->setData(pdman, transformedLight); |
1755 } | 1756 } |
1756 | 1757 |
(...skipping 20 matching lines...) Expand all Loading... |
1777 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); | 1778 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); |
1778 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1
.0);\n"); | 1779 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1
.0);\n"); |
1779 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, | 1780 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, |
1780 "light", | 1781 "light", |
1781 SK_ARRAY_COUNT(gLightArgs)
, | 1782 SK_ARRAY_COUNT(gLightArgs)
, |
1782 gLightArgs, | 1783 gLightArgs, |
1783 lightBody.c_str(), | 1784 lightBody.c_str(), |
1784 funcName); | 1785 funcName); |
1785 } | 1786 } |
1786 | 1787 |
1787 void GrGLDiffuseLightingEffect::onSetData(const GrGLProgramDataManager& pdman, | 1788 void GrGLDiffuseLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman, |
1788 const GrProcessor& proc) { | 1789 const GrProcessor& proc) { |
1789 INHERITED::onSetData(pdman, proc); | 1790 INHERITED::onSetData(pdman, proc); |
1790 const GrDiffuseLightingEffect& diffuse = proc.cast<GrDiffuseLightingEffect>(
); | 1791 const GrDiffuseLightingEffect& diffuse = proc.cast<GrDiffuseLightingEffect>(
); |
1791 pdman.set1f(fKDUni, diffuse.kd()); | 1792 pdman.set1f(fKDUni, diffuse.kd()); |
1792 } | 1793 } |
1793 | 1794 |
1794 /////////////////////////////////////////////////////////////////////////////// | 1795 /////////////////////////////////////////////////////////////////////////////// |
1795 | 1796 |
1796 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, | 1797 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, |
1797 const SkImageFilterLight* lig
ht, | 1798 const SkImageFilterLight* lig
ht, |
1798 SkScalar surfaceScale, | 1799 SkScalar surfaceScale, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1867 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); | 1868 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); |
1868 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b))
;\n"); | 1869 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b))
;\n"); |
1869 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, | 1870 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, |
1870 "light", | 1871 "light", |
1871 SK_ARRAY_COUNT(gLightArgs)
, | 1872 SK_ARRAY_COUNT(gLightArgs)
, |
1872 gLightArgs, | 1873 gLightArgs, |
1873 lightBody.c_str(), | 1874 lightBody.c_str(), |
1874 funcName); | 1875 funcName); |
1875 } | 1876 } |
1876 | 1877 |
1877 void GrGLSpecularLightingEffect::onSetData(const GrGLProgramDataManager& pdman, | 1878 void GrGLSpecularLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman
, |
1878 const GrProcessor& effect) { | 1879 const GrProcessor& effect) { |
1879 INHERITED::onSetData(pdman, effect); | 1880 INHERITED::onSetData(pdman, effect); |
1880 const GrSpecularLightingEffect& spec = effect.cast<GrSpecularLightingEffect>
(); | 1881 const GrSpecularLightingEffect& spec = effect.cast<GrSpecularLightingEffect>
(); |
1881 pdman.set1f(fKSUni, spec.ks()); | 1882 pdman.set1f(fKSUni, spec.ks()); |
1882 pdman.set1f(fShininessUni, spec.shininess()); | 1883 pdman.set1f(fShininessUni, spec.shininess()); |
1883 } | 1884 } |
1884 | 1885 |
1885 /////////////////////////////////////////////////////////////////////////////// | 1886 /////////////////////////////////////////////////////////////////////////////// |
1886 void GrGLLight::emitLightColorUniform(GrGLFPBuilder* builder) { | 1887 void GrGLLight::emitLightColorUniform(GrGLFPBuilder* builder) { |
1887 fColorUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1888 fColorUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
1888 kVec3f_GrSLType, kDefault_GrSLPrecision, | 1889 kVec3f_GrSLType, kDefault_GrSLPrecision, |
1889 "LightColor"); | 1890 "LightColor"); |
1890 } | 1891 } |
1891 | 1892 |
1892 void GrGLLight::emitLightColor(GrGLFPBuilder* builder, const char *surfaceToLigh
t) { | 1893 void GrGLLight::emitLightColor(GrGLFPBuilder* builder, const char *surfaceToLigh
t) { |
1893 builder->getFragmentShaderBuilder()->codeAppend(builder->getUniformCStr(this
->lightColorUni())); | 1894 builder->getFragmentShaderBuilder()->codeAppend(builder->getUniformCStr(this
->lightColorUni())); |
1894 } | 1895 } |
1895 | 1896 |
1896 void GrGLLight::setData(const GrGLProgramDataManager& pdman, | 1897 void GrGLLight::setData(const GrGLSLProgramDataManager& pdman, |
1897 const SkImageFilterLight* light) const { | 1898 const SkImageFilterLight* light) const { |
1898 setUniformPoint3(pdman, fColorUni, | 1899 setUniformPoint3(pdman, fColorUni, |
1899 light->color().makeScale(SkScalarInvert(SkIntToScalar(255))
)); | 1900 light->color().makeScale(SkScalarInvert(SkIntToScalar(255))
)); |
1900 } | 1901 } |
1901 | 1902 |
1902 /////////////////////////////////////////////////////////////////////////////// | 1903 /////////////////////////////////////////////////////////////////////////////// |
1903 | 1904 |
1904 void GrGLDistantLight::setData(const GrGLProgramDataManager& pdman, | 1905 void GrGLDistantLight::setData(const GrGLSLProgramDataManager& pdman, |
1905 const SkImageFilterLight* light) const { | 1906 const SkImageFilterLight* light) const { |
1906 INHERITED::setData(pdman, light); | 1907 INHERITED::setData(pdman, light); |
1907 SkASSERT(light->type() == SkImageFilterLight::kDistant_LightType); | 1908 SkASSERT(light->type() == SkImageFilterLight::kDistant_LightType); |
1908 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh
t); | 1909 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh
t); |
1909 setUniformNormal3(pdman, fDirectionUni, distantLight->direction()); | 1910 setUniformNormal3(pdman, fDirectionUni, distantLight->direction()); |
1910 } | 1911 } |
1911 | 1912 |
1912 void GrGLDistantLight::emitSurfaceToLight(GrGLFPBuilder* builder, const char* z)
{ | 1913 void GrGLDistantLight::emitSurfaceToLight(GrGLFPBuilder* builder, const char* z)
{ |
1913 const char* dir; | 1914 const char* dir; |
1914 fDirectionUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, | 1915 fDirectionUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, |
1915 kVec3f_GrSLType, kDefault_GrSLPrecision, | 1916 kVec3f_GrSLType, kDefault_GrSLPrecision, |
1916 "LightDirection", &dir); | 1917 "LightDirection", &dir); |
1917 builder->getFragmentShaderBuilder()->codeAppend(dir); | 1918 builder->getFragmentShaderBuilder()->codeAppend(dir); |
1918 } | 1919 } |
1919 | 1920 |
1920 /////////////////////////////////////////////////////////////////////////////// | 1921 /////////////////////////////////////////////////////////////////////////////// |
1921 | 1922 |
1922 void GrGLPointLight::setData(const GrGLProgramDataManager& pdman, | 1923 void GrGLPointLight::setData(const GrGLSLProgramDataManager& pdman, |
1923 const SkImageFilterLight* light) const { | 1924 const SkImageFilterLight* light) const { |
1924 INHERITED::setData(pdman, light); | 1925 INHERITED::setData(pdman, light); |
1925 SkASSERT(light->type() == SkImageFilterLight::kPoint_LightType); | 1926 SkASSERT(light->type() == SkImageFilterLight::kPoint_LightType); |
1926 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light); | 1927 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light); |
1927 setUniformPoint3(pdman, fLocationUni, pointLight->location()); | 1928 setUniformPoint3(pdman, fLocationUni, pointLight->location()); |
1928 } | 1929 } |
1929 | 1930 |
1930 void GrGLPointLight::emitSurfaceToLight(GrGLFPBuilder* builder, const char* z) { | 1931 void GrGLPointLight::emitSurfaceToLight(GrGLFPBuilder* builder, const char* z) { |
1931 const char* loc; | 1932 const char* loc; |
1932 fLocationUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1933 fLocationUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
1933 kVec3f_GrSLType, kDefault_GrSLPrecision, | 1934 kVec3f_GrSLType, kDefault_GrSLPrecision, |
1934 "LightLocation", &loc); | 1935 "LightLocation", &loc); |
1935 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 1936 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
1936 fsBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))", | 1937 fsBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))", |
1937 loc, fsBuilder->fragmentPosition(), z); | 1938 loc, fsBuilder->fragmentPosition(), z); |
1938 } | 1939 } |
1939 | 1940 |
1940 /////////////////////////////////////////////////////////////////////////////// | 1941 /////////////////////////////////////////////////////////////////////////////// |
1941 | 1942 |
1942 void GrGLSpotLight::setData(const GrGLProgramDataManager& pdman, | 1943 void GrGLSpotLight::setData(const GrGLSLProgramDataManager& pdman, |
1943 const SkImageFilterLight* light) const { | 1944 const SkImageFilterLight* light) const { |
1944 INHERITED::setData(pdman, light); | 1945 INHERITED::setData(pdman, light); |
1945 SkASSERT(light->type() == SkImageFilterLight::kSpot_LightType); | 1946 SkASSERT(light->type() == SkImageFilterLight::kSpot_LightType); |
1946 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light); | 1947 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light); |
1947 setUniformPoint3(pdman, fLocationUni, spotLight->location()); | 1948 setUniformPoint3(pdman, fLocationUni, spotLight->location()); |
1948 pdman.set1f(fExponentUni, spotLight->specularExponent()); | 1949 pdman.set1f(fExponentUni, spotLight->specularExponent()); |
1949 pdman.set1f(fCosInnerConeAngleUni, spotLight->cosInnerConeAngle()); | 1950 pdman.set1f(fCosInnerConeAngleUni, spotLight->cosInnerConeAngle()); |
1950 pdman.set1f(fCosOuterConeAngleUni, spotLight->cosOuterConeAngle()); | 1951 pdman.set1f(fCosOuterConeAngleUni, spotLight->cosOuterConeAngle()); |
1951 pdman.set1f(fConeScaleUni, spotLight->coneScale()); | 1952 pdman.set1f(fConeScaleUni, spotLight->coneScale()); |
1952 setUniformNormal3(pdman, fSUni, spotLight->s()); | 1953 setUniformNormal3(pdman, fSUni, spotLight->s()); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2012 | 2013 |
2013 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 2014 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
2014 } | 2015 } |
2015 | 2016 |
2016 #endif | 2017 #endif |
2017 | 2018 |
2018 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 2019 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
2019 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 2020 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
2020 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 2021 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
2021 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 2022 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |