[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