[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52626] trunk/blender/source/blender: fix [#33320] Decimate modifer in collapse is inconsistent when limiting to a vertex group

Campbell Barton ideasman42 at gmail.com
Wed Nov 28 03:49:11 CET 2012


Revision: 52626
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52626
Author:   campbellbarton
Date:     2012-11-28 02:49:06 +0000 (Wed, 28 Nov 2012)
Log Message:
-----------
fix [#33320] Decimate modifer in collapse is inconsistent when limiting to a vertex group

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h
    trunk/blender/source/blender/bmesh/tools/bmesh_decimate_collapse.c
    trunk/blender/source/blender/modifiers/intern/MOD_decimate.c

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h	2012-11-28 01:14:11 UTC (rev 52625)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h	2012-11-28 02:49:06 UTC (rev 52626)
@@ -37,5 +37,8 @@
                                   BMEdge **einput_arr, const int einput_len);
 void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const int do_dissolve_boundaries);
 
+/* these weights are accumulated so too high values may reach 'inf' too quickly */
+#define BM_MESH_DECIM_WEIGHT_MAX 100000.0f
+#define BM_MESH_DECIM_WEIGHT_EPS (1.0f / BM_MESH_DECIM_WEIGHT_MAX)
 
 #endif /* __BMESH_DECIMATE_H__ */

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_decimate_collapse.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_decimate_collapse.c	2012-11-28 01:14:11 UTC (rev 52625)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_decimate_collapse.c	2012-11-28 02:49:06 UTC (rev 52626)
@@ -223,8 +223,8 @@
 	}
 
 	if (vweights) {
-		if ((vweights[BM_elem_index_get(e->v1)] < FLT_EPSILON) &&
-		    (vweights[BM_elem_index_get(e->v2)] < FLT_EPSILON))
+		if ((vweights[BM_elem_index_get(e->v1)] >= BM_MESH_DECIM_WEIGHT_MAX) &&
+		    (vweights[BM_elem_index_get(e->v2)] >= BM_MESH_DECIM_WEIGHT_MAX))
 		{
 			/* skip collapsing this edge */
 			eheap_table[BM_elem_index_get(e)] = NULL;
@@ -244,8 +244,9 @@
 		        BLI_quadric_evaluate(q2, optimize_co));
 	}
 	else {
-		cost = ((BLI_quadric_evaluate(q1, optimize_co) * vweights[BM_elem_index_get(e->v1)]) +
-		        (BLI_quadric_evaluate(q2, optimize_co) * vweights[BM_elem_index_get(e->v2)]));
+		/* add 1.0 so planar edges are still weighted against */
+		cost = (((BLI_quadric_evaluate(q1, optimize_co) + 1.0f) * vweights[BM_elem_index_get(e->v1)]) +
+		        ((BLI_quadric_evaluate(q2, optimize_co) + 1.0f) * vweights[BM_elem_index_get(e->v2)]));
 	}
 	// print("COST %.12f\n");
 
@@ -877,9 +878,7 @@
 		int i;
 
 		if (vweights) {
-			const int fac = CLAMPIS(customdata_fac, 0.0f, 1.0f);
-			vweights[BM_elem_index_get(v_other)] = (vweights[v_clear_index]              * (1.0f - fac)) +
-			                                       (vweights[BM_elem_index_get(v_other)] * fac);
+			vweights[BM_elem_index_get(v_other)] = vweights[v_clear_index] + vweights[BM_elem_index_get(v_other)];
 		}
 
 		e = NULL;  /* paranoid safety check */

Modified: trunk/blender/source/blender/modifiers/intern/MOD_decimate.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_decimate.c	2012-11-28 01:14:11 UTC (rev 52625)
+++ trunk/blender/source/blender/modifiers/intern/MOD_decimate.c	2012-11-28 02:49:06 UTC (rev 52626)
@@ -145,12 +145,14 @@
 
 				if (dmd->flag & MOD_DECIM_FLAG_INVERT_VGROUP) {
 					for (i = 0; i < vert_tot; i++) {
-						vweights[i] = 1.0f - defvert_find_weight(&dvert[i], defgrp_index);
+						const float f = 1.0f - defvert_find_weight(&dvert[i], defgrp_index);
+						vweights[i] = f > BM_MESH_DECIM_WEIGHT_EPS ? (1.0f / f) : BM_MESH_DECIM_WEIGHT_MAX;
 					}
 				}
 				else {
 					for (i = 0; i < vert_tot; i++) {
-						vweights[i] = defvert_find_weight(&dvert[i], defgrp_index);
+						const float f = defvert_find_weight(&dvert[i], defgrp_index);
+						vweights[i] = f > BM_MESH_DECIM_WEIGHT_EPS ? (1.0f / f) : BM_MESH_DECIM_WEIGHT_MAX;
 					}
 				}
 			}




More information about the Bf-blender-cvs mailing list