Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-03-05 18:00:18 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-03-05 18:00:18 +0400
commitdf3116b3269f428ffbbcc31a1f786da0d6510400 (patch)
tree6822451aef0186da64ac7e228df27ef51f4d4b06
parent26b1406f6ee9beae3245fcc7e0fa5c8cfa867d98 (diff)
Fix for un-subdivide creating duplicate faces
-rw-r--r--source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c b/source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c
index 092a004aece..ffc680817a7 100644
--- a/source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c
+++ b/source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c
@@ -41,6 +41,8 @@ static bool bm_vert_dissolve_fan_test(BMVert *v)
BMIter iter;
BMEdge *e;
+ BMVert *varr[4];
+
unsigned int tot_edge = 0;
unsigned int tot_edge_boundary = 0;
unsigned int tot_edge_manifold = 0;
@@ -56,17 +58,25 @@ static bool bm_vert_dissolve_fan_test(BMVert *v)
else if (BM_edge_is_wire(e)) {
tot_edge_wire++;
}
+
+ /* bail out early */
+ if (tot_edge == 4) {
+ return false;
+ }
+
+ /* used to check overlapping faces */
+ varr[tot_edge] = BM_edge_other_vert(e, v);
+
tot_edge++;
}
- if ((tot_edge == 4) && (tot_edge_boundary == 0) && (tot_edge_manifold == 4)) {
- return true;
- }
- else if ((tot_edge == 3) && (tot_edge_boundary == 0) && (tot_edge_manifold == 3)) {
- return true;
- }
- else if ((tot_edge == 3) && (tot_edge_boundary == 2) && (tot_edge_manifold == 1)) {
- return true;
+ if (((tot_edge == 4) && (tot_edge_boundary == 0) && (tot_edge_manifold == 4)) ||
+ ((tot_edge == 3) && (tot_edge_boundary == 0) && (tot_edge_manifold == 3)) ||
+ ((tot_edge == 3) && (tot_edge_boundary == 2) && (tot_edge_manifold == 1)))
+ {
+ if (!BM_face_exists(varr, tot_edge, NULL)) {
+ return true;
+ }
}
else if ((tot_edge == 2) && (tot_edge_wire == 2)) {
return true;