[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