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 1635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1646 | 1646 |
1647 /////////////////////////////////////////////////////////////////////////////// | 1647 /////////////////////////////////////////////////////////////////////////////// |
1648 | 1648 |
1649 void GrGLLightingEffect::emitCode(EmitArgs& args) { | 1649 void GrGLLightingEffect::emitCode(EmitArgs& args) { |
1650 const GrLightingEffect& le = args.fFp.cast<GrLightingEffect>(); | 1650 const GrLightingEffect& le = args.fFp.cast<GrLightingEffect>(); |
1651 if (!fLight) { | 1651 if (!fLight) { |
1652 fLight = le.light()->createGLLight(); | 1652 fLight = le.light()->createGLLight(); |
1653 } | 1653 } |
1654 | 1654 |
1655 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; | 1655 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
1656 fImageIncrementUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragm
ent_Visibility, | 1656 fImageIncrementUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1657 kVec2f_GrSLType, kDefault_Gr
SLPrecision, | 1657 kVec2f_GrSLType, kDefault_Gr
SLPrecision, |
1658 "ImageIncrement"); | 1658 "ImageIncrement"); |
1659 fSurfaceScaleUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragmen
t_Visibility, | 1659 fSurfaceScaleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1660 kFloat_GrSLType, kDefault_GrSL
Precision, | 1660 kFloat_GrSLType, kDefault_GrSL
Precision, |
1661 "SurfaceScale"); | 1661 "SurfaceScale"); |
1662 fLight->emitLightColorUniform(uniformHandler); | 1662 fLight->emitLightColorUniform(uniformHandler); |
1663 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 1663 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
1664 SkString lightFunc; | 1664 SkString lightFunc; |
1665 this->emitLightFunc(uniformHandler, fragBuilder, &lightFunc); | 1665 this->emitLightFunc(uniformHandler, fragBuilder, &lightFunc); |
1666 static const GrGLSLShaderVar gSobelArgs[] = { | 1666 static const GrGLSLShaderVar gSobelArgs[] = { |
1667 GrGLSLShaderVar("a", kFloat_GrSLType), | 1667 GrGLSLShaderVar("a", kFloat_GrSLType), |
1668 GrGLSLShaderVar("b", kFloat_GrSLType), | 1668 GrGLSLShaderVar("b", kFloat_GrSLType), |
1669 GrGLSLShaderVar("c", kFloat_GrSLType), | 1669 GrGLSLShaderVar("c", kFloat_GrSLType), |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1762 } | 1762 } |
1763 | 1763 |
1764 /////////////////////////////////////////////////////////////////////////////// | 1764 /////////////////////////////////////////////////////////////////////////////// |
1765 | 1765 |
1766 /////////////////////////////////////////////////////////////////////////////// | 1766 /////////////////////////////////////////////////////////////////////////////// |
1767 | 1767 |
1768 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHandl
er, | 1768 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHandl
er, |
1769 GrGLSLFragmentBuilder* fragBuilder
, | 1769 GrGLSLFragmentBuilder* fragBuilder
, |
1770 SkString* funcName) { | 1770 SkString* funcName) { |
1771 const char* kd; | 1771 const char* kd; |
1772 fKDUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibili
ty, | 1772 fKDUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1773 kFloat_GrSLType, kDefault_GrSLPrecision, | 1773 kFloat_GrSLType, kDefault_GrSLPrecision, |
1774 "KD", &kd); | 1774 "KD", &kd); |
1775 | 1775 |
1776 static const GrGLSLShaderVar gLightArgs[] = { | 1776 static const GrGLSLShaderVar gLightArgs[] = { |
1777 GrGLSLShaderVar("normal", kVec3f_GrSLType), | 1777 GrGLSLShaderVar("normal", kVec3f_GrSLType), |
1778 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType), | 1778 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType), |
1779 GrGLSLShaderVar("lightColor", kVec3f_GrSLType) | 1779 GrGLSLShaderVar("lightColor", kVec3f_GrSLType) |
1780 }; | 1780 }; |
1781 SkString lightBody; | 1781 SkString lightBody; |
1782 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); | 1782 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1844 } | 1844 } |
1845 | 1845 |
1846 /////////////////////////////////////////////////////////////////////////////// | 1846 /////////////////////////////////////////////////////////////////////////////// |
1847 | 1847 |
1848 void GrGLSpecularLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHand
ler, | 1848 void GrGLSpecularLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHand
ler, |
1849 GrGLSLFragmentBuilder* fragBuilde
r, | 1849 GrGLSLFragmentBuilder* fragBuilde
r, |
1850 SkString* funcName) { | 1850 SkString* funcName) { |
1851 const char* ks; | 1851 const char* ks; |
1852 const char* shininess; | 1852 const char* shininess; |
1853 | 1853 |
1854 fKSUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibili
ty, | 1854 fKSUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1855 kFloat_GrSLType, kDefault_GrSLPrecision,
"KS", &ks); | 1855 kFloat_GrSLType, kDefault_GrSLPrecision,
"KS", &ks); |
1856 fShininessUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_V
isibility, | 1856 fShininessUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1857 kFloat_GrSLType, | 1857 kFloat_GrSLType, |
1858 kDefault_GrSLPrecision, | 1858 kDefault_GrSLPrecision, |
1859 "Shininess", | 1859 "Shininess", |
1860 &shininess); | 1860 &shininess); |
1861 | 1861 |
1862 static const GrGLSLShaderVar gLightArgs[] = { | 1862 static const GrGLSLShaderVar gLightArgs[] = { |
1863 GrGLSLShaderVar("normal", kVec3f_GrSLType), | 1863 GrGLSLShaderVar("normal", kVec3f_GrSLType), |
1864 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType), | 1864 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType), |
1865 GrGLSLShaderVar("lightColor", kVec3f_GrSLType) | 1865 GrGLSLShaderVar("lightColor", kVec3f_GrSLType) |
1866 }; | 1866 }; |
(...skipping 13 matching lines...) Expand all Loading... |
1880 void GrGLSpecularLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman
, | 1880 void GrGLSpecularLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman
, |
1881 const GrProcessor& effect) { | 1881 const GrProcessor& effect) { |
1882 INHERITED::onSetData(pdman, effect); | 1882 INHERITED::onSetData(pdman, effect); |
1883 const GrSpecularLightingEffect& spec = effect.cast<GrSpecularLightingEffect>
(); | 1883 const GrSpecularLightingEffect& spec = effect.cast<GrSpecularLightingEffect>
(); |
1884 pdman.set1f(fKSUni, spec.ks()); | 1884 pdman.set1f(fKSUni, spec.ks()); |
1885 pdman.set1f(fShininessUni, spec.shininess()); | 1885 pdman.set1f(fShininessUni, spec.shininess()); |
1886 } | 1886 } |
1887 | 1887 |
1888 /////////////////////////////////////////////////////////////////////////////// | 1888 /////////////////////////////////////////////////////////////////////////////// |
1889 void GrGLLight::emitLightColorUniform(GrGLSLUniformHandler* uniformHandler) { | 1889 void GrGLLight::emitLightColorUniform(GrGLSLUniformHandler* uniformHandler) { |
1890 fColorUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visib
ility, | 1890 fColorUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1891 kVec3f_GrSLType, kDefault_GrSLPrecisi
on, | 1891 kVec3f_GrSLType, kDefault_GrSLPrecisi
on, |
1892 "LightColor"); | 1892 "LightColor"); |
1893 } | 1893 } |
1894 | 1894 |
1895 void GrGLLight::emitLightColor(GrGLSLUniformHandler* uniformHandler, | 1895 void GrGLLight::emitLightColor(GrGLSLUniformHandler* uniformHandler, |
1896 GrGLSLFragmentBuilder* fragBuilder, | 1896 GrGLSLFragmentBuilder* fragBuilder, |
1897 const char *surfaceToLight) { | 1897 const char *surfaceToLight) { |
1898 fragBuilder->codeAppend(uniformHandler->getUniformCStr(this->lightColorUni()
)); | 1898 fragBuilder->codeAppend(uniformHandler->getUniformCStr(this->lightColorUni()
)); |
1899 } | 1899 } |
1900 | 1900 |
(...skipping 10 matching lines...) Expand all Loading... |
1911 INHERITED::setData(pdman, light); | 1911 INHERITED::setData(pdman, light); |
1912 SkASSERT(light->type() == SkImageFilterLight::kDistant_LightType); | 1912 SkASSERT(light->type() == SkImageFilterLight::kDistant_LightType); |
1913 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh
t); | 1913 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh
t); |
1914 setUniformNormal3(pdman, fDirectionUni, distantLight->direction()); | 1914 setUniformNormal3(pdman, fDirectionUni, distantLight->direction()); |
1915 } | 1915 } |
1916 | 1916 |
1917 void GrGLDistantLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler, | 1917 void GrGLDistantLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler, |
1918 GrGLSLFragmentBuilder* fragBuilder, | 1918 GrGLSLFragmentBuilder* fragBuilder, |
1919 const char* z) { | 1919 const char* z) { |
1920 const char* dir; | 1920 const char* dir; |
1921 fDirectionUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_V
isibility, | 1921 fDirectionUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1922 kVec3f_GrSLType, kDefault_GrSLPre
cision, | 1922 kVec3f_GrSLType, kDefault_GrSLPre
cision, |
1923 "LightDirection", &dir); | 1923 "LightDirection", &dir); |
1924 fragBuilder->codeAppend(dir); | 1924 fragBuilder->codeAppend(dir); |
1925 } | 1925 } |
1926 | 1926 |
1927 /////////////////////////////////////////////////////////////////////////////// | 1927 /////////////////////////////////////////////////////////////////////////////// |
1928 | 1928 |
1929 void GrGLPointLight::setData(const GrGLSLProgramDataManager& pdman, | 1929 void GrGLPointLight::setData(const GrGLSLProgramDataManager& pdman, |
1930 const SkImageFilterLight* light) const { | 1930 const SkImageFilterLight* light) const { |
1931 INHERITED::setData(pdman, light); | 1931 INHERITED::setData(pdman, light); |
1932 SkASSERT(light->type() == SkImageFilterLight::kPoint_LightType); | 1932 SkASSERT(light->type() == SkImageFilterLight::kPoint_LightType); |
1933 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light); | 1933 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light); |
1934 setUniformPoint3(pdman, fLocationUni, pointLight->location()); | 1934 setUniformPoint3(pdman, fLocationUni, pointLight->location()); |
1935 } | 1935 } |
1936 | 1936 |
1937 void GrGLPointLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler, | 1937 void GrGLPointLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler, |
1938 GrGLSLFragmentBuilder* fragBuilder, | 1938 GrGLSLFragmentBuilder* fragBuilder, |
1939 const char* z) { | 1939 const char* z) { |
1940 const char* loc; | 1940 const char* loc; |
1941 fLocationUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Vi
sibility, | 1941 fLocationUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1942 kVec3f_GrSLType, kDefault_GrSLPrec
ision, | 1942 kVec3f_GrSLType, kDefault_GrSLPrec
ision, |
1943 "LightLocation", &loc); | 1943 "LightLocation", &loc); |
1944 fragBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))", | 1944 fragBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))", |
1945 loc, fragBuilder->fragmentPosition(), z); | 1945 loc, fragBuilder->fragmentPosition(), z); |
1946 } | 1946 } |
1947 | 1947 |
1948 /////////////////////////////////////////////////////////////////////////////// | 1948 /////////////////////////////////////////////////////////////////////////////// |
1949 | 1949 |
1950 void GrGLSpotLight::setData(const GrGLSLProgramDataManager& pdman, | 1950 void GrGLSpotLight::setData(const GrGLSLProgramDataManager& pdman, |
1951 const SkImageFilterLight* light) const { | 1951 const SkImageFilterLight* light) const { |
1952 INHERITED::setData(pdman, light); | 1952 INHERITED::setData(pdman, light); |
1953 SkASSERT(light->type() == SkImageFilterLight::kSpot_LightType); | 1953 SkASSERT(light->type() == SkImageFilterLight::kSpot_LightType); |
1954 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light); | 1954 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light); |
1955 setUniformPoint3(pdman, fLocationUni, spotLight->location()); | 1955 setUniformPoint3(pdman, fLocationUni, spotLight->location()); |
1956 pdman.set1f(fExponentUni, spotLight->specularExponent()); | 1956 pdman.set1f(fExponentUni, spotLight->specularExponent()); |
1957 pdman.set1f(fCosInnerConeAngleUni, spotLight->cosInnerConeAngle()); | 1957 pdman.set1f(fCosInnerConeAngleUni, spotLight->cosInnerConeAngle()); |
1958 pdman.set1f(fCosOuterConeAngleUni, spotLight->cosOuterConeAngle()); | 1958 pdman.set1f(fCosOuterConeAngleUni, spotLight->cosOuterConeAngle()); |
1959 pdman.set1f(fConeScaleUni, spotLight->coneScale()); | 1959 pdman.set1f(fConeScaleUni, spotLight->coneScale()); |
1960 setUniformNormal3(pdman, fSUni, spotLight->s()); | 1960 setUniformNormal3(pdman, fSUni, spotLight->s()); |
1961 } | 1961 } |
1962 | 1962 |
1963 void GrGLSpotLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler, | 1963 void GrGLSpotLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler, |
1964 GrGLSLFragmentBuilder* fragBuilder, | 1964 GrGLSLFragmentBuilder* fragBuilder, |
1965 const char* z) { | 1965 const char* z) { |
1966 const char* location; | 1966 const char* location; |
1967 fLocationUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Vi
sibility, | 1967 fLocationUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1968 kVec3f_GrSLType, kDefault_GrSLPrec
ision, | 1968 kVec3f_GrSLType, kDefault_GrSLPrec
ision, |
1969 "LightLocation", &location); | 1969 "LightLocation", &location); |
1970 | 1970 |
1971 fragBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))", | 1971 fragBuilder->codeAppendf("normalize(%s - vec3(%s.xy, %s))", |
1972 location, fragBuilder->fragmentPosition(), z); | 1972 location, fragBuilder->fragmentPosition(), z); |
1973 } | 1973 } |
1974 | 1974 |
1975 void GrGLSpotLight::emitLightColor(GrGLSLUniformHandler* uniformHandler, | 1975 void GrGLSpotLight::emitLightColor(GrGLSLUniformHandler* uniformHandler, |
1976 GrGLSLFragmentBuilder* fragBuilder, | 1976 GrGLSLFragmentBuilder* fragBuilder, |
1977 const char *surfaceToLight) { | 1977 const char *surfaceToLight) { |
1978 | 1978 |
1979 const char* color = uniformHandler->getUniformCStr(this->lightColorUni()); /
/ created by parent class. | 1979 const char* color = uniformHandler->getUniformCStr(this->lightColorUni()); /
/ created by parent class. |
1980 | 1980 |
1981 const char* exponent; | 1981 const char* exponent; |
1982 const char* cosInner; | 1982 const char* cosInner; |
1983 const char* cosOuter; | 1983 const char* cosOuter; |
1984 const char* coneScale; | 1984 const char* coneScale; |
1985 const char* s; | 1985 const char* s; |
1986 fExponentUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Vi
sibility, | 1986 fExponentUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1987 kFloat_GrSLType, kDefault_GrSLPrec
ision, | 1987 kFloat_GrSLType, kDefault_GrSLPrec
ision, |
1988 "Exponent", &exponent); | 1988 "Exponent", &exponent); |
1989 fCosInnerConeAngleUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFr
agment_Visibility, | 1989 fCosInnerConeAngleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1990 kFloat_GrSLType, kDefault
_GrSLPrecision, | 1990 kFloat_GrSLType, kDefault
_GrSLPrecision, |
1991 "CosInnerConeAngle", &cos
Inner); | 1991 "CosInnerConeAngle", &cos
Inner); |
1992 fCosOuterConeAngleUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFr
agment_Visibility, | 1992 fCosOuterConeAngleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1993 kFloat_GrSLType, kDefault
_GrSLPrecision, | 1993 kFloat_GrSLType, kDefault
_GrSLPrecision, |
1994 "CosOuterConeAngle", &cos
Outer); | 1994 "CosOuterConeAngle", &cos
Outer); |
1995 fConeScaleUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_V
isibility, | 1995 fConeScaleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1996 kFloat_GrSLType, kDefault_GrSLPre
cision, | 1996 kFloat_GrSLType, kDefault_GrSLPre
cision, |
1997 "ConeScale", &coneScale); | 1997 "ConeScale", &coneScale); |
1998 fSUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibilit
y, | 1998 fSUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
1999 kVec3f_GrSLType, kDefault_GrSLPrecision,
"S", &s); | 1999 kVec3f_GrSLType, kDefault_GrSLPrecision,
"S", &s); |
2000 | 2000 |
2001 static const GrGLSLShaderVar gLightColorArgs[] = { | 2001 static const GrGLSLShaderVar gLightColorArgs[] = { |
2002 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType) | 2002 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType) |
2003 }; | 2003 }; |
2004 SkString lightColorBody; | 2004 SkString lightColorBody; |
2005 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s); | 2005 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s); |
2006 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter); | 2006 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter); |
2007 lightColorBody.appendf("\t\treturn vec3(0);\n"); | 2007 lightColorBody.appendf("\t\treturn vec3(0);\n"); |
2008 lightColorBody.appendf("\t}\n"); | 2008 lightColorBody.appendf("\t}\n"); |
(...skipping 12 matching lines...) Expand all Loading... |
2021 | 2021 |
2022 fragBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 2022 fragBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
2023 } | 2023 } |
2024 | 2024 |
2025 #endif | 2025 #endif |
2026 | 2026 |
2027 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 2027 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
2028 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 2028 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
2029 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 2029 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
2030 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 2030 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |