diff options
author | ztenghui <ztenghui@google.com> | 2014-08-25 14:42:27 -0700 |
---|---|---|
committer | ztenghui <ztenghui@google.com> | 2014-08-26 10:45:27 -0700 |
commit | 3bd3fa1f1d437e22aee35381a559dcee15a437dd (patch) | |
tree | 2a052bdfd2c2104570d5061effd1db189121e9f2 /libs/hwui | |
parent | f2a778683d602d9483bfaf8fdbc63e9fd19a7e5f (diff) | |
download | frameworks_base-3bd3fa1f1d437e22aee35381a559dcee15a437dd.zip frameworks_base-3bd3fa1f1d437e22aee35381a559dcee15a437dd.tar.gz frameworks_base-3bd3fa1f1d437e22aee35381a559dcee15a437dd.tar.bz2 |
Correctly detect the wrong Z value for the light
b/17221975
Change-Id: I2b46da95ad12ca5260d7fe9514a75558b6b6393b
Diffstat (limited to 'libs/hwui')
-rw-r--r-- | libs/hwui/SpotShadow.cpp | 8 | ||||
-rw-r--r-- | libs/hwui/utils/MathUtils.h | 5 |
2 files changed, 11 insertions, 2 deletions
diff --git a/libs/hwui/SpotShadow.cpp b/libs/hwui/SpotShadow.cpp index cb20a0b..2178cc7 100644 --- a/libs/hwui/SpotShadow.cpp +++ b/libs/hwui/SpotShadow.cpp @@ -647,7 +647,7 @@ float SpotShadow::projectCasterToOutline(Vector2& outline, if (lightToPolyZ != 0) { // If any caster's vertex is almost above the light, we just keep it as 95% // of the height of the light. - ratioZ = MathUtils::min(polyVertex.z / lightToPolyZ, CASTER_Z_CAP_RATIO); + ratioZ = MathUtils::clamp(polyVertex.z / lightToPolyZ, 0.0f, CASTER_Z_CAP_RATIO); } outline.x = polyVertex.x - ratioZ * (lightCenter.x - polyVertex.x); @@ -669,6 +669,10 @@ float SpotShadow::projectCasterToOutline(Vector2& outline, void SpotShadow::createSpotShadow(bool isCasterOpaque, const Vector3& lightCenter, float lightSize, const Vector3* poly, int polyLength, const Vector3& polyCentroid, VertexBuffer& shadowTriangleStrip) { + if (CC_UNLIKELY(lightCenter.z <= 0)) { + ALOGW("Relative Light Z is not positive. No spot shadow!"); + return; + } OutlineData outlineData[polyLength]; Vector2 outlineCentroid; // Calculate the projected outline for each polygon's vertices from the light center. @@ -787,7 +791,7 @@ void SpotShadow::createSpotShadow(bool isCasterOpaque, const Vector3& lightCente // The ratio can be simulated by using the inverse of maximum of ratioVI for // all (V). distOutline = (outlineData[i].position - outlineCentroid).length(); - if (distOutline == 0) { + if (CC_UNLIKELY(distOutline == 0)) { // If the outline has 0 area, then there is no spot shadow anyway. ALOGW("Outline has 0 area, no spot shadow!"); return; diff --git a/libs/hwui/utils/MathUtils.h b/libs/hwui/utils/MathUtils.h index 00448b8..d89859b 100644 --- a/libs/hwui/utils/MathUtils.h +++ b/libs/hwui/utils/MathUtils.h @@ -76,6 +76,11 @@ public: return a < b ? a : b; } + template<typename T> + static inline T clamp(T a, T minValue, T maxValue) { + return min(max(a, minValue), maxValue); + } + inline static float lerp(float v1, float v2, float t) { return v1 + ((v2 - v1) * t); } |