Merge "Fix T-junctions in layers' generated meshes" into jb-mr2-dev

This commit is contained in:
Chris Craik
2013-02-27 23:47:54 +00:00
committed by Android (Google) Code Review
2 changed files with 18 additions and 9 deletions

View File

@ -123,13 +123,9 @@ Region* LayerRenderer::getRegion() {
return &mLayer->region;
}
// TODO: This implementation is flawed and can generate T-junctions
// in the mesh, which will in turn produce cracks when the
// mesh is rotated/skewed. The easiest way to fix this would
// be, for each row, to add new vertices shared with the previous
// row when the two rows share an edge.
// In practice, T-junctions do not appear often so this has yet
// to be fixed.
// TODO: This implementation uses a very simple approach to fixing T-junctions which keeps the
// results as rectangles, and is thus not necessarily efficient in the geometry
// produced. Eventually, it may be better to develop triangle-based mechanism.
void LayerRenderer::generateMesh() {
if (mLayer->region.isRect() || mLayer->region.isEmpty()) {
if (mLayer->mesh) {
@ -145,8 +141,14 @@ void LayerRenderer::generateMesh() {
return;
}
// avoid T-junctions as they cause artifacts in between the resultant
// geometry when complex transforms occur.
// TODO: generate the safeRegion only if necessary based on drawing transform (see
// OpenGLRenderer::composeLayerRegion())
Region safeRegion = Region::createTJunctionFreeRegion(mLayer->region);
size_t count;
const android::Rect* rects = mLayer->region.getArray(&count);
const android::Rect* rects = safeRegion.getArray(&count);
GLsizei elementCount = count * 6;

View File

@ -1022,7 +1022,14 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) {
// information about this implementation
if (CC_LIKELY(!layer->region.isEmpty())) {
size_t count;
const android::Rect* rects = layer->region.getArray(&count);
const android::Rect* rects;
Region safeRegion;
if (CC_LIKELY(hasRectToRectTransform())) {
rects = layer->region.getArray(&count);
} else {
safeRegion = Region::createTJunctionFreeRegion(layer->region);
rects = safeRegion.getArray(&count);
}
const float alpha = layer->getAlpha() / 255.0f;
const float texX = 1.0f / float(layer->getWidth());