OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
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 "SkCanvas.h" | 8 #include "SkCanvas.h" |
9 #include "SkReadBuffer.h" | 9 #include "SkReadBuffer.h" |
10 #include "SkShadowShader.h" | 10 #include "SkShadowShader.h" |
(...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 if (light.type() == SkLights::Light::kDirectional_LightType) { | 722 if (light.type() == SkLights::Light::kDirectional_LightType) { |
723 int pvDepth = SkColorGetB(povDepthColor); // depth stored in
blue channel | 723 int pvDepth = SkColorGetB(povDepthColor); // depth stored in
blue channel |
724 | 724 |
725 int xOffset = SkScalarRoundToInt(light.dir().fX * pvDepth); | 725 int xOffset = SkScalarRoundToInt(light.dir().fX * pvDepth); |
726 int yOffset = SkScalarRoundToInt(light.dir().fY * pvDepth); | 726 int yOffset = SkScalarRoundToInt(light.dir().fY * pvDepth); |
727 | 727 |
728 int shX = SkClampMax(x + i + xOffset, light.getShadowMap()->
width() - 1); | 728 int shX = SkClampMax(x + i + xOffset, light.getShadowMap()->
width() - 1); |
729 int shY = SkClampMax(y + yOffset, light.getShadowMap()->heig
ht() - 1); | 729 int shY = SkClampMax(y + yOffset, light.getShadowMap()->heig
ht() - 1); |
730 | 730 |
731 int shDepth = 0; | 731 int shDepth = 0; |
| 732 int shDepthsq = 0; |
732 | 733 |
733 // pixmaps that point to things have nonzero heights | 734 // pixmaps that point to things have nonzero heights |
734 if (fShadowMapPixels[l].height() > 0) { | 735 if (fShadowMapPixels[l].height() > 0) { |
735 uint32_t pix = *fShadowMapPixels[l].addr32(shX, shY); | 736 uint32_t pix = *fShadowMapPixels[l].addr32(shX, shY); |
736 SkColor shColor(pix); | 737 SkColor shColor(pix); |
737 | 738 |
738 shDepth = SkColorGetB(shColor); | 739 shDepth = SkColorGetB(shColor); |
| 740 shDepthsq = SkColorGetG(shColor) * 256; |
739 } else { | 741 } else { |
740 // Make lights w/o a shadow map receive the full light c
ontribution | 742 // Make lights w/o a shadow map receive the full light c
ontribution |
741 shDepth = pvDepth; | 743 shDepth = pvDepth; |
742 } | 744 } |
743 | 745 |
744 if (pvDepth >= shDepth) { | 746 SkScalar lightProb = 1.0f; |
745 // assume object normals are pointing straight up | 747 if (pvDepth < shDepth) { |
746 totalLight.fX += light.dir().fZ * light.color().fX; | 748 if (lightShader.fShadowParams.fType == |
747 totalLight.fY += light.dir().fZ * light.color().fY; | 749 SkShadowParams::ShadowType::kVariance_ShadowType) { |
748 totalLight.fZ += light.dir().fZ * light.color().fZ; | 750 int variance = SkMaxScalar(shDepthsq - shDepth * shD
epth, |
| 751 lightShader.fShadowParams
.fMinVariance); |
| 752 int d = pvDepth - shDepth; |
| 753 |
| 754 lightProb = (SkScalar) variance / ((SkScalar) (varia
nce + d * d)); |
| 755 |
| 756 SkScalar bias = lightShader.fShadowParams.fBiasingCo
nstant; |
| 757 |
| 758 lightProb = SkMaxScalar((lightProb - bias) / (1.0f -
bias), 0.0f); |
| 759 } else { |
| 760 lightProb = 0.0f; |
| 761 } |
749 } | 762 } |
| 763 |
| 764 // assume object normals are pointing straight up |
| 765 totalLight.fX += light.dir().fZ * light.color().fX * lightPr
ob; |
| 766 totalLight.fY += light.dir().fZ * light.color().fY * lightPr
ob; |
| 767 totalLight.fZ += light.dir().fZ * light.color().fZ * lightPr
ob; |
750 } else { | 768 } else { |
751 totalLight += light.color(); | 769 totalLight += light.color(); |
752 } | 770 } |
753 } | 771 } |
754 | 772 |
755 SkColor3f totalColor = SkColor3f::Make(SkColorGetR(diffColor) * tota
lLight.fX, | 773 SkColor3f totalColor = SkColor3f::Make(SkColorGetR(diffColor) * tota
lLight.fX, |
756 SkColorGetG(diffColor) * tota
lLight.fY, | 774 SkColorGetG(diffColor) * tota
lLight.fY, |
757 SkColorGetB(diffColor) * tota
lLight.fZ); | 775 SkColorGetB(diffColor) * tota
lLight.fZ); |
758 | 776 |
759 result[i] = convert(totalColor, SkColorGetA(diffColor)); | 777 result[i] = convert(totalColor, SkColorGetA(diffColor)); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
872 | 890 |
873 /////////////////////////////////////////////////////////////////////////////// | 891 /////////////////////////////////////////////////////////////////////////////// |
874 | 892 |
875 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkShadowShader) | 893 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkShadowShader) |
876 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkShadowShaderImpl) | 894 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkShadowShaderImpl) |
877 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 895 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
878 | 896 |
879 /////////////////////////////////////////////////////////////////////////////// | 897 /////////////////////////////////////////////////////////////////////////////// |
880 | 898 |
881 #endif | 899 #endif |
OLD | NEW |