Add support for directional lights.
Adds a new kDirectionLight_ShadowFlag which indicates that lightPosition
is a vector pointing towards the light, and lightRadius is the blur
radius when the occluder is at z == 1. For other values of z it will
scale linearly. The direction is specified in device space.
Bug: skia:10781
Change-Id: I14d530f006e5541ed6e22bfbeb29c7441c21fb8e
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/321792
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/src/utils/SkShadowTessellator.cpp b/src/utils/SkShadowTessellator.cpp
index 450b4ff..9baa29c 100644
--- a/src/utils/SkShadowTessellator.cpp
+++ b/src/utils/SkShadowTessellator.cpp
@@ -991,7 +991,7 @@
public:
SkSpotShadowTessellator(const SkPath& path, const SkMatrix& ctm,
const SkPoint3& zPlaneParams, const SkPoint3& lightPos,
- SkScalar lightRadius, bool transparent);
+ SkScalar lightRadius, bool transparent, bool directional);
private:
bool computeClipAndPathPolygons(const SkPath& path, const SkMatrix& ctm,
@@ -1004,14 +1004,14 @@
SkSpotShadowTessellator::SkSpotShadowTessellator(const SkPath& path, const SkMatrix& ctm,
const SkPoint3& zPlaneParams,
const SkPoint3& lightPos, SkScalar lightRadius,
- bool transparent)
+ bool transparent, bool directional)
: INHERITED(zPlaneParams, path.getBounds(), transparent) {
// Compute the blur radius, scale and translation for the spot shadow.
SkMatrix shadowTransform;
SkScalar outset;
- if (!SkDrawShadowMetrics::GetSpotShadowTransform(lightPos, lightRadius,
- ctm, zPlaneParams, path.getBounds(),
+ if (!SkDrawShadowMetrics::GetSpotShadowTransform(lightPos, lightRadius, ctm, zPlaneParams,
+ path.getBounds(), directional,
&shadowTransform, &outset)) {
return;
}
@@ -1159,12 +1159,14 @@
sk_sp<SkVertices> SkShadowTessellator::MakeSpot(const SkPath& path, const SkMatrix& ctm,
const SkPoint3& zPlane, const SkPoint3& lightPos,
- SkScalar lightRadius, bool transparent) {
+ SkScalar lightRadius, bool transparent,
+ bool directional) {
if (!ctm.mapRect(path.getBounds()).isFinite() || !zPlane.isFinite() ||
!lightPos.isFinite() || !(lightPos.fZ >= SK_ScalarNearlyZero) ||
!SkScalarIsFinite(lightRadius) || !(lightRadius >= SK_ScalarNearlyZero)) {
return nullptr;
}
- SkSpotShadowTessellator spotTess(path, ctm, zPlane, lightPos, lightRadius, transparent);
+ SkSpotShadowTessellator spotTess(path, ctm, zPlane, lightPos, lightRadius, transparent,
+ directional);
return spotTess.releaseVertices();
}