diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/AmbientShadow.cpp | 17 | ||||
-rw-r--r-- | libs/hwui/SpotShadow.cpp | 5 | ||||
-rw-r--r-- | libs/hwui/VertexBuffer.h | 9 |
3 files changed, 19 insertions, 12 deletions
diff --git a/libs/hwui/AmbientShadow.cpp b/libs/hwui/AmbientShadow.cpp index b9d7b12..75cbfa1 100644 --- a/libs/hwui/AmbientShadow.cpp +++ b/libs/hwui/AmbientShadow.cpp @@ -48,7 +48,6 @@ void AmbientShadow::createAmbientShadow(bool isCasterOpaque, const Vector3* vertices, int vertexCount, const Vector3& centroid3d, float heightFactor, float geomFactor, VertexBuffer& shadowVertexBuffer) { const int rays = SHADOW_RAY_COUNT; - VertexBuffer::Mode mode = VertexBuffer::kOnePolyRingShadow; // Validate the inputs. if (vertexCount < 3 || heightFactor <= 0 || rays <= 0 || geomFactor <= 0) { @@ -124,19 +123,23 @@ void AmbientShadow::createAmbientShadow(bool isCasterOpaque, opacity); } - // If caster isn't opaque, we need to to fill the umbra by storing the umbra's - // centroid in the innermost ring of vertices. - if (!isCasterOpaque) { - mode = VertexBuffer::kTwoPolyRingShadow; + if (isCasterOpaque) { + // skip inner ring, calc bounds over filled portion of buffer + shadowVertexBuffer.computeBounds<AlphaVertex>(2 * rays); + shadowVertexBuffer.setMode(VertexBuffer::kOnePolyRingShadow); + } else { + // If caster isn't opaque, we need to to fill the umbra by storing the umbra's + // centroid in the innermost ring of vertices. float centroidAlpha = 1.0 / (1 + centroid3d.z * heightFactor); AlphaVertex centroidXYA; AlphaVertex::set(¢roidXYA, centroid2d.x, centroid2d.y, centroidAlpha); for (int rayIndex = 0; rayIndex < rays; rayIndex++) { shadowVertices[2 * rays + rayIndex] = centroidXYA; } + // calc bounds over entire buffer + shadowVertexBuffer.computeBounds<AlphaVertex>(); + shadowVertexBuffer.setMode(VertexBuffer::kTwoPolyRingShadow); } - shadowVertexBuffer.setMode(mode); - shadowVertexBuffer.computeBounds<AlphaVertex>(); #if DEBUG_SHADOW for (int i = 0; i < SHADOW_VERTEX_COUNT; i++) { diff --git a/libs/hwui/SpotShadow.cpp b/libs/hwui/SpotShadow.cpp index 82dbe7a..8a5e722 100644 --- a/libs/hwui/SpotShadow.cpp +++ b/libs/hwui/SpotShadow.cpp @@ -507,8 +507,6 @@ void SpotShadow::createSpotShadow(bool isCasterOpaque, const Vector3* poly, computeLightPolygon(lightVertexCount, lightCenter, lightSize, light); computeSpotShadow(isCasterOpaque, light, lightVertexCount, lightCenter, poly, polyLength, retStrips); - retStrips.setMode(VertexBuffer::kTwoPolyRingShadow); - retStrips.computeBounds<AlphaVertex>(); } /** @@ -785,6 +783,9 @@ void SpotShadow::generateTriangleStrip(bool isCasterOpaque, const Vector2* penum shadowVertices[2 * rays + rayIndex] = centroidXYA; } } + + shadowTriangleStrip.setMode(VertexBuffer::kTwoPolyRingShadow); + shadowTriangleStrip.computeBounds<AlphaVertex>(); } /** diff --git a/libs/hwui/VertexBuffer.h b/libs/hwui/VertexBuffer.h index 5875f25..3837f88 100644 --- a/libs/hwui/VertexBuffer.h +++ b/libs/hwui/VertexBuffer.h @@ -62,7 +62,6 @@ public: mVertexCount = vertexCount; mByteCount = mVertexCount * sizeof(TYPE); mReallocBuffer = mBuffer = (void*)new TYPE[vertexCount]; - memset(mBuffer, 0, sizeof(TYPE) * vertexCount); mCleanupMethod = &(cleanup<TYPE>); @@ -86,13 +85,17 @@ public: * vertex buffer can't determine bounds more simply/efficiently */ template <class TYPE> - void computeBounds() { + void computeBounds(int vertexCount = 0) { if (!mVertexCount) { mBounds.setEmpty(); return; } + + // default: compute over every vertex + if (vertexCount == 0) vertexCount = mVertexCount; + TYPE* current = (TYPE*)mBuffer; - TYPE* end = current + mVertexCount; + TYPE* end = current + vertexCount; mBounds.set(current->x, current->y, current->x, current->y); for (; current < end; current++) { mBounds.expandToCoverVertex(current->x, current->y); |