[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52086] trunk/blender/source/blender/ blenkernel/intern/cdderivedmesh.c: Fix #32398: Mirror modifier with "Merge" enabled producing pairs of faces

Ben Batt benbatt at gmail.com
Sun Nov 11 05:53:28 CET 2012


Revision: 52086
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52086
Author:   artificer
Date:     2012-11-11 04:53:20 +0000 (Sun, 11 Nov 2012)
Log Message:
-----------
Fix #32398: Mirror modifier with "Merge" enabled producing pairs of faces
sharing the same set of vertices.

Modified the CDDM_merge_verts function (currently only used by the Mirror
modifier) to skip faces using all merged vertices.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-11-11 03:30:39 UTC (rev 52085)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-11-11 04:53:20 UTC (rev 52086)
@@ -2254,6 +2254,11 @@
  * this is a really horribly written function.  ger. - joeedh
  *
  * note, CDDM_recalc_tessellation has to run on the returned DM if you want to access tessfaces.
+ *
+ * Note: This function is currently only used by the Mirror modifier, so it
+ *       skips any faces that have all vertices merged (to avoid creating pairs
+ *       of faces sharing the same set of vertices). If used elsewhere, it may
+ *       be necessary to make this functionality optional.
  */
 DerivedMesh *CDDM_merge_verts(DerivedMesh *dm, const int *vtargetmap)
 {
@@ -2297,15 +2302,12 @@
 			newv[i] = newv[vtargetmap[i]];
 		}
 	}
-	
-	/* find-replace merged vertices with target vertices */
-	ml = cddm->mloop;
-	for (i = 0; i < totloop; i++, ml++) {
-		if (vtargetmap[ml->v] != -1) {
-			ml->v = vtargetmap[ml->v];
-		}
-	}
 
+	/* Don't remap vertices in cddm->mloop, because we need to know the original
+	   indices in order to skip faces with all vertices merged.
+	   The "update loop indices..." section further down remaps vertices in mloop.
+	*/
+
 	/* now go through and fix edges and faces */
 	med = cddm->medge;
 	c = 0;
@@ -2338,6 +2340,25 @@
 		
 		ml = cddm->mloop + mp->loopstart;
 
+		/* skip faces with all vertices merged */
+		{
+			int all_vertices_merged = TRUE;
+
+			for (j = 0; j < mp->totloop; j++, ml++) {
+				if (vtargetmap[ml->v] == -1) {
+					all_vertices_merged = FALSE;
+					break;
+				}
+			}
+
+			if (UNLIKELY(all_vertices_merged))
+			{
+				continue;
+			}
+		}
+
+		ml = cddm->mloop + mp->loopstart;
+
 		c = 0;
 		for (j = 0; j < mp->totloop; j++, ml++) {
 			med = cddm->medge + ml->e;




More information about the Bf-blender-cvs mailing list