Loading libs/hwui/AmbientShadow.cpp +26 −28 Original line number Diff line number Diff line Loading @@ -47,9 +47,8 @@ void AmbientShadow::createAmbientShadow(const Vector3* vertices, int vertexCount const Vector3& centroid3d, float heightFactor, float geomFactor, VertexBuffer& shadowVertexBuffer) { const int rays = SHADOW_RAY_COUNT; const int layers = SHADOW_LAYER_COUNT; // Validate the inputs. if (vertexCount < 3 || heightFactor <= 0 || layers <= 0 || rays <= 0 if (vertexCount < 3 || heightFactor <= 0 || rays <= 0 || geomFactor <= 0) { #if DEBUG_SHADOW ALOGE("Invalid input for createAmbientShadow(), early return!"); Loading Loading @@ -96,33 +95,32 @@ void AmbientShadow::createAmbientShadow(const Vector3* vertices, int vertexCount // calculate the normal N, which should be perpendicular to the edge of the // polygon (represented by the neighbor intersection points) . // Shadow's vertices will be generated as : P + N * scale. int currentVertexIndex = 0; for (int layerIndex = 0; layerIndex <= layers; layerIndex++) { for (int rayIndex = 0; rayIndex < rays; rayIndex++) { Vector2 normal(1.0f, 0.0f); calculateNormal(rays, rayIndex, dir.array(), rayDist, normal); float opacity = 1.0 / (1 + rayHeight[rayIndex] / heightFactor); // The vertex should be start from rayDist[i] then scale the // normalizeNormal! Vector2 intersection = dir[rayIndex] * rayDist[rayIndex] + Vector2(centroid3d.x, centroid3d.y); float layerRatio = layerIndex / (float)(layers); // The higher the intersection is, the further the ambient shadow expanded. float expansionDist = rayHeight[rayIndex] / heightFactor * geomFactor * (1 - layerRatio); AlphaVertex::set(&shadowVertices[currentVertexIndex++], // outer ring of points, expanded based upon height of each ray intersection float expansionDist = rayHeight[rayIndex] * heightFactor * geomFactor; AlphaVertex::set(&shadowVertices[rayIndex], intersection.x + normal.x * expansionDist, intersection.y + normal.y * expansionDist, layerRatio * opacity); } 0.0f); // inner ring of points float opacity = 1.0 / (1 + rayHeight[rayIndex] * heightFactor); AlphaVertex::set(&shadowVertices[rayIndex + rays], intersection.x, intersection.y, opacity); } float centroidAlpha = 1.0 / (1 + centroid3d.z / heightFactor); AlphaVertex::set(&shadowVertices[currentVertexIndex++], float centroidAlpha = 1.0 / (1 + centroid3d.z * heightFactor); AlphaVertex::set(&shadowVertices[SHADOW_VERTEX_COUNT - 1], centroid3d.x, centroid3d.y, centroidAlpha); #if DEBUG_SHADOW Loading libs/hwui/Caches.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -705,8 +705,8 @@ void Caches::initTempProperties() { propertyDirtyViewport = false; propertyEnable3d = false; propertyCameraDistance = 1.0f; propertyAmbientShadowStrength = 0x3f; propertySpotShadowStrength = 0x3f; propertyAmbientShadowStrength = 25; propertySpotShadowStrength = 25; propertyLightPosXScale = 0.5f; propertyLightPosYScale = 0.0f; Loading libs/hwui/DisplayList.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -491,7 +491,7 @@ void DisplayList::replay(ReplayStateStruct& replayStruct, const int level) { replayStruct.mDrawGlStatus); } #define SHADOW_DELTA 2.0f #define SHADOW_DELTA 0.1f template <class T> void DisplayList::iterate3dChildren(ChildrenSelectMode mode, OpenGLRenderer& renderer, Loading libs/hwui/ShadowTessellator.cpp +13 −16 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ void ShadowTessellator::tessellateAmbientShadow(const Vector3* casterPolygon, // A bunch of parameters to tweak the shadow. // TODO: Allow some of these changable by debug settings or APIs. const float heightFactor = 128; const float heightFactor = 1.0f / 128; const float geomFactor = 64; AmbientShadow::createAmbientShadow(casterPolygon, casterVertexCount, Loading Loading @@ -69,7 +69,7 @@ void ShadowTessellator::tessellateSpotShadow(const Vector3* casterPolygon, int c reverseReceiverTransform.mapPoint3d(lightCenter); const float lightSize = maximal / 4; const int lightVertexCount = 16; const int lightVertexCount = 8; SpotShadow::createSpotShadow(casterPolygon, casterVertexCount, lightCenter, lightSize, lightVertexCount, shadowVertexBuffer); Loading @@ -78,26 +78,23 @@ void ShadowTessellator::tessellateSpotShadow(const Vector3* casterPolygon, int c void ShadowTessellator::generateShadowIndices(uint16_t* shadowIndices) { int currentIndex = 0; const int layers = SHADOW_LAYER_COUNT; const int rays = SHADOW_RAY_COUNT; // For the penumbra area. for (int i = 0; i < layers; i++) { for (int j = 0; j < rays; j++) { shadowIndices[currentIndex++] = i * rays + j; shadowIndices[currentIndex++] = (i + 1) * rays + j; for (int i = 0; i < rays; i++) { shadowIndices[currentIndex++] = i; shadowIndices[currentIndex++] = rays + i; } // To close the loop, back to the ray 0. shadowIndices[currentIndex++] = i * rays; shadowIndices[currentIndex++] = (i + 1) * rays; } uint16_t base = layers * rays; uint16_t centroidIndex = (layers + 1) * rays; shadowIndices[currentIndex++] = 0; shadowIndices[currentIndex++] = rays; uint16_t centroidIndex = 2 * rays; // For the umbra area, using strips to simulate the fans. for (int k = 0; k < rays; k++) { shadowIndices[currentIndex++] = base + k; for (int i = 0; i < rays; i++) { shadowIndices[currentIndex++] = rays + i; shadowIndices[currentIndex++] = centroidIndex; } shadowIndices[currentIndex++] = base; shadowIndices[currentIndex++] = rays; #if DEBUG_SHADOW if (currentIndex != SHADOW_INDEX_COUNT) { Loading libs/hwui/ShadowTessellator.h +3 −7 Original line number Diff line number Diff line Loading @@ -46,17 +46,13 @@ namespace uirenderer { // The total number of rays starting from the centroid of shadow area, in order // to generate the shadow geometry. #define SHADOW_RAY_COUNT 256 // The total number of layers in the outer shadow area, 1 being the minimum. #define SHADOW_LAYER_COUNT 2 #define SHADOW_RAY_COUNT 128 // The total number of all the vertices representing the shadow. #define SHADOW_VERTEX_COUNT ((SHADOW_LAYER_COUNT + 1) * SHADOW_RAY_COUNT + 1) #define SHADOW_VERTEX_COUNT (2 * SHADOW_RAY_COUNT + 1) // The total number of indices used for drawing the shadow geometry as triangle strips. #define SHADOW_INDEX_COUNT (2 * SHADOW_RAY_COUNT + 1 + 2 * (SHADOW_RAY_COUNT + 1) * \ SHADOW_LAYER_COUNT) #define SHADOW_INDEX_COUNT (2 * SHADOW_RAY_COUNT + 1 + 2 * (SHADOW_RAY_COUNT + 1)) class ShadowTessellator { public: Loading Loading
libs/hwui/AmbientShadow.cpp +26 −28 Original line number Diff line number Diff line Loading @@ -47,9 +47,8 @@ void AmbientShadow::createAmbientShadow(const Vector3* vertices, int vertexCount const Vector3& centroid3d, float heightFactor, float geomFactor, VertexBuffer& shadowVertexBuffer) { const int rays = SHADOW_RAY_COUNT; const int layers = SHADOW_LAYER_COUNT; // Validate the inputs. if (vertexCount < 3 || heightFactor <= 0 || layers <= 0 || rays <= 0 if (vertexCount < 3 || heightFactor <= 0 || rays <= 0 || geomFactor <= 0) { #if DEBUG_SHADOW ALOGE("Invalid input for createAmbientShadow(), early return!"); Loading Loading @@ -96,33 +95,32 @@ void AmbientShadow::createAmbientShadow(const Vector3* vertices, int vertexCount // calculate the normal N, which should be perpendicular to the edge of the // polygon (represented by the neighbor intersection points) . // Shadow's vertices will be generated as : P + N * scale. int currentVertexIndex = 0; for (int layerIndex = 0; layerIndex <= layers; layerIndex++) { for (int rayIndex = 0; rayIndex < rays; rayIndex++) { Vector2 normal(1.0f, 0.0f); calculateNormal(rays, rayIndex, dir.array(), rayDist, normal); float opacity = 1.0 / (1 + rayHeight[rayIndex] / heightFactor); // The vertex should be start from rayDist[i] then scale the // normalizeNormal! Vector2 intersection = dir[rayIndex] * rayDist[rayIndex] + Vector2(centroid3d.x, centroid3d.y); float layerRatio = layerIndex / (float)(layers); // The higher the intersection is, the further the ambient shadow expanded. float expansionDist = rayHeight[rayIndex] / heightFactor * geomFactor * (1 - layerRatio); AlphaVertex::set(&shadowVertices[currentVertexIndex++], // outer ring of points, expanded based upon height of each ray intersection float expansionDist = rayHeight[rayIndex] * heightFactor * geomFactor; AlphaVertex::set(&shadowVertices[rayIndex], intersection.x + normal.x * expansionDist, intersection.y + normal.y * expansionDist, layerRatio * opacity); } 0.0f); // inner ring of points float opacity = 1.0 / (1 + rayHeight[rayIndex] * heightFactor); AlphaVertex::set(&shadowVertices[rayIndex + rays], intersection.x, intersection.y, opacity); } float centroidAlpha = 1.0 / (1 + centroid3d.z / heightFactor); AlphaVertex::set(&shadowVertices[currentVertexIndex++], float centroidAlpha = 1.0 / (1 + centroid3d.z * heightFactor); AlphaVertex::set(&shadowVertices[SHADOW_VERTEX_COUNT - 1], centroid3d.x, centroid3d.y, centroidAlpha); #if DEBUG_SHADOW Loading
libs/hwui/Caches.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -705,8 +705,8 @@ void Caches::initTempProperties() { propertyDirtyViewport = false; propertyEnable3d = false; propertyCameraDistance = 1.0f; propertyAmbientShadowStrength = 0x3f; propertySpotShadowStrength = 0x3f; propertyAmbientShadowStrength = 25; propertySpotShadowStrength = 25; propertyLightPosXScale = 0.5f; propertyLightPosYScale = 0.0f; Loading
libs/hwui/DisplayList.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -491,7 +491,7 @@ void DisplayList::replay(ReplayStateStruct& replayStruct, const int level) { replayStruct.mDrawGlStatus); } #define SHADOW_DELTA 2.0f #define SHADOW_DELTA 0.1f template <class T> void DisplayList::iterate3dChildren(ChildrenSelectMode mode, OpenGLRenderer& renderer, Loading
libs/hwui/ShadowTessellator.cpp +13 −16 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ void ShadowTessellator::tessellateAmbientShadow(const Vector3* casterPolygon, // A bunch of parameters to tweak the shadow. // TODO: Allow some of these changable by debug settings or APIs. const float heightFactor = 128; const float heightFactor = 1.0f / 128; const float geomFactor = 64; AmbientShadow::createAmbientShadow(casterPolygon, casterVertexCount, Loading Loading @@ -69,7 +69,7 @@ void ShadowTessellator::tessellateSpotShadow(const Vector3* casterPolygon, int c reverseReceiverTransform.mapPoint3d(lightCenter); const float lightSize = maximal / 4; const int lightVertexCount = 16; const int lightVertexCount = 8; SpotShadow::createSpotShadow(casterPolygon, casterVertexCount, lightCenter, lightSize, lightVertexCount, shadowVertexBuffer); Loading @@ -78,26 +78,23 @@ void ShadowTessellator::tessellateSpotShadow(const Vector3* casterPolygon, int c void ShadowTessellator::generateShadowIndices(uint16_t* shadowIndices) { int currentIndex = 0; const int layers = SHADOW_LAYER_COUNT; const int rays = SHADOW_RAY_COUNT; // For the penumbra area. for (int i = 0; i < layers; i++) { for (int j = 0; j < rays; j++) { shadowIndices[currentIndex++] = i * rays + j; shadowIndices[currentIndex++] = (i + 1) * rays + j; for (int i = 0; i < rays; i++) { shadowIndices[currentIndex++] = i; shadowIndices[currentIndex++] = rays + i; } // To close the loop, back to the ray 0. shadowIndices[currentIndex++] = i * rays; shadowIndices[currentIndex++] = (i + 1) * rays; } uint16_t base = layers * rays; uint16_t centroidIndex = (layers + 1) * rays; shadowIndices[currentIndex++] = 0; shadowIndices[currentIndex++] = rays; uint16_t centroidIndex = 2 * rays; // For the umbra area, using strips to simulate the fans. for (int k = 0; k < rays; k++) { shadowIndices[currentIndex++] = base + k; for (int i = 0; i < rays; i++) { shadowIndices[currentIndex++] = rays + i; shadowIndices[currentIndex++] = centroidIndex; } shadowIndices[currentIndex++] = base; shadowIndices[currentIndex++] = rays; #if DEBUG_SHADOW if (currentIndex != SHADOW_INDEX_COUNT) { Loading
libs/hwui/ShadowTessellator.h +3 −7 Original line number Diff line number Diff line Loading @@ -46,17 +46,13 @@ namespace uirenderer { // The total number of rays starting from the centroid of shadow area, in order // to generate the shadow geometry. #define SHADOW_RAY_COUNT 256 // The total number of layers in the outer shadow area, 1 being the minimum. #define SHADOW_LAYER_COUNT 2 #define SHADOW_RAY_COUNT 128 // The total number of all the vertices representing the shadow. #define SHADOW_VERTEX_COUNT ((SHADOW_LAYER_COUNT + 1) * SHADOW_RAY_COUNT + 1) #define SHADOW_VERTEX_COUNT (2 * SHADOW_RAY_COUNT + 1) // The total number of indices used for drawing the shadow geometry as triangle strips. #define SHADOW_INDEX_COUNT (2 * SHADOW_RAY_COUNT + 1 + 2 * (SHADOW_RAY_COUNT + 1) * \ SHADOW_LAYER_COUNT) #define SHADOW_INDEX_COUNT (2 * SHADOW_RAY_COUNT + 1 + 2 * (SHADOW_RAY_COUNT + 1)) class ShadowTessellator { public: Loading