Revert "Fix directional shadows."
This reverts commit 6789b824015373104bc3282c971e435a9f542f59.
Reason for revert: Failing CK test.
Original change's description:
> Fix directional shadows.
>
> The xy offset calculation for drawShadow was not quite correct. Rather
> than normalizing the light vector and using the xy values of that as the
> base offset value, we should scale the light vector by 1/z.
>
> See https://github.com/flutter/engine/pull/27124#issuecomment-880182653
> for more detail.
>
> Bug: skia:10781
> Change-Id: Ib69a313cb96a532f8d89644e3d69f666a184e897
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/428880
> Reviewed-by: Brian Salomon <bsalomon@google.com>
> Commit-Queue: Jim Van Verth <jvanverth@google.com>
TBR=jvanverth@google.com,bsalomon@google.com
Change-Id: Id22c2113fc1b62109975b83a0dcda5b1b16380a8
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:10781
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/428977
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
diff --git a/src/core/SkDrawShadowInfo.cpp b/src/core/SkDrawShadowInfo.cpp
index 76f7441..e56b00d 100644
--- a/src/core/SkDrawShadowInfo.cpp
+++ b/src/core/SkDrawShadowInfo.cpp
@@ -151,8 +151,10 @@
// get spot params (in device space)
if (SkToBool(rec.fFlags & SkShadowFlags::kDirectionalLight_ShadowFlag)) {
- SkDrawShadowMetrics::GetDirectionalParams(occluderZ, rec.fLightPos.fX, rec.fLightPos.fY,
- rec.fLightPos.fZ, rec.fLightRadius,
+ SkPoint3 lightDir = rec.fLightPos;
+ lightDir.normalize();
+ SkDrawShadowMetrics::GetDirectionalParams(occluderZ, lightDir.fX, lightDir.fY,
+ lightDir.fZ, rec.fLightRadius,
&spotBlur, &spotScale, &spotOffset);
} else {
SkPoint devLightPos = SkPoint::Make(rec.fLightPos.fX, rec.fLightPos.fY);
@@ -170,8 +172,10 @@
// get spot params (in local space)
if (SkToBool(rec.fFlags & SkShadowFlags::kDirectionalLight_ShadowFlag)) {
- SkDrawShadowMetrics::GetDirectionalParams(occluderZ, rec.fLightPos.fX, rec.fLightPos.fY,
- rec.fLightPos.fZ, rec.fLightRadius,
+ SkPoint3 lightDir = rec.fLightPos;
+ lightDir.normalize();
+ SkDrawShadowMetrics::GetDirectionalParams(occluderZ, lightDir.fX, lightDir.fY,
+ lightDir.fZ, rec.fLightRadius,
&spotBlur, &spotScale, &spotOffset);
// light dir is in device space, so need to map spot offset back into local space
SkMatrix inverse;
diff --git a/src/core/SkDrawShadowInfo.h b/src/core/SkDrawShadowInfo.h
index de44bea..454b0cb 100644
--- a/src/core/SkDrawShadowInfo.h
+++ b/src/core/SkDrawShadowInfo.h
@@ -68,10 +68,8 @@
SkScalar* blurRadius, SkScalar* scale, SkVector* translate) {
*blurRadius = lightRadius*occluderZ;
*scale = 1;
- // Max z-ratio is "max expected elevation"/"min allowable z"
- constexpr SkScalar kMaxZRatio = 64/SK_ScalarNearlyZero;
- SkScalar zRatio = divide_and_pin(occluderZ, lightZ, 0.0f, kMaxZRatio);
- *translate = SkVector::Make(-zRatio * lightX, -zRatio * lightY);
+ // assumption here is that light direction is normalized
+ *translate = SkVector::Make(-occluderZ * lightX, -occluderZ * lightY);
}
// Create the transformation to apply to a path to get its base shadow outline, given the light
diff --git a/src/gpu/GrSurfaceDrawContext.cpp b/src/gpu/GrSurfaceDrawContext.cpp
index fd4155a..b99b7e2 100644
--- a/src/gpu/GrSurfaceDrawContext.cpp
+++ b/src/gpu/GrSurfaceDrawContext.cpp
@@ -1152,7 +1152,9 @@
SkPoint3 devLightPos = rec.fLightPos;
bool directional = SkToBool(rec.fFlags & kDirectionalLight_ShadowFlag);
- if (!directional) {
+ if (directional) {
+ devLightPos.normalize();
+ } else {
// transform light
viewMatrix.mapPoints((SkPoint*)&devLightPos.fX, 1);
}
diff --git a/src/utils/SkShadowUtils.cpp b/src/utils/SkShadowUtils.cpp
index f433821..5a32ec4 100644
--- a/src/utils/SkShadowUtils.cpp
+++ b/src/utils/SkShadowUtils.cpp
@@ -664,7 +664,9 @@
SkPoint3 zPlaneParams = rec.fZPlaneParams;
SkPoint3 devLightPos = rec.fLightPos;
- if (!directional) {
+ if (directional) {
+ devLightPos.normalize();
+ } else {
viewMatrix.mapPoints((SkPoint*)&devLightPos.fX, 1);
}
float lightRadius = rec.fLightRadius;