Merge "Fix T-junctions in layers' generated meshes" into jb-mr2-dev
This commit is contained in:
@ -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;
|
||||
|
||||
|
@ -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());
|
||||
|
Reference in New Issue
Block a user