[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45404] trunk/blender/source/blender/bmesh : adjust limited dissolve to take face angle into account when dissolving vertices between manifold edges .
Campbell Barton
ideasman42 at gmail.com
Thu Apr 5 03:20:36 CEST 2012
Revision: 45404
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45404
Author: campbellbarton
Date: 2012-04-05 01:20:32 +0000 (Thu, 05 Apr 2012)
Log Message:
-----------
adjust limited dissolve to take face angle into account when dissolving vertices between manifold edges.
stops artifact with zig-zag patterns between _almost_ planer faces.
Modified Paths:
--------------
trunk/blender/source/blender/bmesh/intern/bmesh_core.c
trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.c 2012-04-04 17:18:01 UTC (rev 45403)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.c 2012-04-05 01:20:32 UTC (rev 45404)
@@ -1038,8 +1038,7 @@
else {
/* otherwise we get both old and new faces */
for (i = 0; i < totface; i++) {
- f = faces[i];
- BM_face_kill(bm, f);
+ BM_face_kill(bm, faces[i]);
}
}
Modified: trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c 2012-04-04 17:18:01 UTC (rev 45403)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c 2012-04-05 01:20:32 UTC (rev 45404)
@@ -472,7 +472,29 @@
#endif
-/**/
+/* Limited Dissolve */
+
+#define UNIT_TO_ANGLE DEG2RADF(90.0)
+#define ANGLE_TO_UNIT (1.0 / UNIT_TO_ANGLE)
+
+/* multiply vertex edge angle by face angle
+ * this means we are not left with sharp corners between _almost_ planer faces
+ * convert angles [0-PI/2] -> [0-1], multiply together, then convert back to radians. */
+float bm_vert_edge_face_angle(BMVert *v)
+{
+ const float angle = BM_vert_edge_angle(v);
+ /*note: could be either edge, it doesnt matter */
+ if (v->e && BM_edge_is_manifold(v->e)) {
+ return ((angle * ANGLE_TO_UNIT) * (BM_edge_face_angle(v->e) * ANGLE_TO_UNIT)) * UNIT_TO_ANGLE;
+ }
+ else {
+ return angle;
+ }
+}
+
+#undef UNIT_TO_ANGLE
+#undef ANGLE_TO_UNIT
+
typedef struct DissolveElemWeight {
BMHeader *ele;
float weight;
@@ -553,7 +575,7 @@
/* --- second verts --- */
for (i = 0, tot_found = 0; i < vinput->len; i++) {
BMVert *v = ((BMVert **)vinput->data.p)[i];
- const float angle = BM_vert_edge_angle(v);
+ const float angle = bm_vert_edge_face_angle(v);
if (angle < angle_limit) {
weight_elems[i].ele = (BMHeader *)v;
@@ -571,9 +593,16 @@
for (i = 0; i < tot_found; i++) {
BMVert *v = (BMVert *)weight_elems[i].ele;
- /* check twice because cumulative effect could dissolve over angle limit */
- if (BM_vert_edge_angle(v) < angle_limit) {
- BM_vert_collapse_edge(bm, v->e, v, TRUE); /* join edges */
+ if (/* topology changes may cause this to be un-collapsable */
+ (BM_vert_edge_count(v) == 2) &&
+ /* check twice because cumulative effect could dissolve over angle limit */
+ bm_vert_edge_face_angle(v) < angle_limit)
+ {
+ BMEdge *ne = BM_vert_collapse_edge(bm, v->e, v, TRUE); /* join edges */
+
+ if (ne && ne->l) {
+ BM_edge_normals_update(bm, ne);
+ }
}
}
}
More information about the Bf-blender-cvs
mailing list