[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57216] trunk/blender: fix [#35311] Planar Decimate / Limited Dissolve fails to merge some adjacent faces
Campbell Barton
ideasman42 at gmail.com
Mon Jun 3 07:07:16 CEST 2013
Revision: 57216
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57216
Author: campbellbarton
Date: 2013-06-03 05:07:16 +0000 (Mon, 03 Jun 2013)
Log Message:
-----------
fix [#35311] Planar Decimate / Limited Dissolve fails to merge some adjacent faces
optionally limit by face flipping, also added support to delimit by material and edge crease.
Modified Paths:
--------------
trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h
trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h
trunk/blender/source/blender/bmesh/tools/bmesh_decimate_dissolve.c
trunk/blender/source/blender/editors/interface/interface_templates.c
trunk/blender/source/blender/editors/mesh/editmesh_tools.c
trunk/blender/source/blender/makesdna/DNA_modifier_types.h
trunk/blender/source/blender/makesrna/RNA_enum_types.h
trunk/blender/source/blender/makesrna/intern/rna_mesh.c
trunk/blender/source/blender/makesrna/intern/rna_modifier.c
trunk/blender/source/blender/modifiers/intern/MOD_decimate.c
Modified: trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py 2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py 2013-06-03 05:07:16 UTC (rev 57216)
@@ -262,6 +262,9 @@
else: # decimate_type == 'DISSOLVE':
layout.prop(md, "angle_limit")
layout.prop(md, "use_dissolve_boundaries")
+ layout.label("Delimit:")
+ row = layout.row()
+ row.prop(md, "delimit")
layout.label(text=iface_("Face Count: %d") % md.face_count, translate=False)
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2013-06-03 05:07:16 UTC (rev 57216)
@@ -941,6 +941,7 @@
{"use_dissolve_boundaries", BMO_OP_SLOT_BOOL},
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
+ {"delimit", BMO_OP_SLOT_INT},
{{'\0'}},
},
{{{'\0'}}}, /* no output */
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h 2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h 2013-06-03 05:07:16 UTC (rev 57216)
@@ -297,6 +297,12 @@
BMO_SYMMETRIZE_POSITIVE_Z,
} BMO_SymmDirection;
+typedef enum {
+ BMO_DELIM_NORMAL = 1 << 0,
+ BMO_DELIM_MATERIAL = 1 << 1,
+ BMO_DELIM_SEAM = 1 << 2,
+} BMO_Delimit;
+
void BMO_op_flag_enable(BMesh *bm, BMOperator *op, const int op_flag);
void BMO_op_flag_disable(BMesh *bm, BMOperator *op, const int op_flag);
Modified: trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c 2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c 2013-06-03 05:07:16 UTC (rev 57216)
@@ -452,8 +452,9 @@
const float angle_max = (float)M_PI / 2.0f;
const float angle_limit = min_ff(angle_max, BMO_slot_float_get(op->slots_in, "angle_limit"));
const bool do_dissolve_boundaries = BMO_slot_bool_get(op->slots_in, "use_dissolve_boundaries");
+ const BMO_Delimit delimit = BMO_slot_int_get(op->slots_in, "delimit");
- BM_mesh_decimate_dissolve_ex(bm, angle_limit, do_dissolve_boundaries,
+ BM_mesh_decimate_dissolve_ex(bm, angle_limit, do_dissolve_boundaries, delimit,
(BMVert **)BMO_SLOT_AS_BUFFER(vinput), vinput->len,
(BMEdge **)BMO_SLOT_AS_BUFFER(einput), einput->len);
}
Modified: trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h 2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h 2013-06-03 05:07:16 UTC (rev 57216)
@@ -33,9 +33,11 @@
void BM_mesh_decimate_unsubdivide(BMesh *bm, const int iterations);
void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries,
+ const BMO_Delimit delimit,
BMVert **vinput_arr, const int vinput_len,
BMEdge **einput_arr, const int einput_len);
-void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries);
+void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries,
+ const BMO_Delimit delimit);
/* these weights are accumulated so too high values may reach 'inf' too quickly */
#define BM_MESH_DECIM_WEIGHT_MAX 100000.0f
Modified: trunk/blender/source/blender/bmesh/tools/bmesh_decimate_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_decimate_dissolve.c 2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_decimate_dissolve.c 2013-06-03 05:07:16 UTC (rev 57216)
@@ -70,6 +70,7 @@
}
void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries,
+ const BMO_Delimit delimit,
BMVert **vinput_arr, const int vinput_len,
BMEdge **einput_arr, const int einput_len)
{
@@ -77,7 +78,6 @@
DissolveElemWeight *weight_elems = MEM_mallocN(max_ii(einput_len, vinput_len) *
sizeof(DissolveElemWeight), __func__);
int i, tot_found;
-
BMIter iter;
BMEdge *e_iter;
BMEdge **earray;
@@ -94,8 +94,14 @@
/* go through and split edge */
for (i = 0, tot_found = 0; i < einput_len; i++) {
BMEdge *e = einput_arr[i];
- const float angle = BM_edge_calc_face_angle(e);
+ const bool is_contig = BM_edge_is_contiguous(e);
+ float angle;
+ angle = BM_edge_calc_face_angle(e);
+ if (is_contig == false) {
+ angle = (float)M_PI - angle;
+ }
+
if (angle < angle_limit) {
tot_found++;
}
@@ -108,12 +114,39 @@
for (i = 0; i < tot_found; i++) {
BMEdge *e = (BMEdge *)weight_elems[i].ele;
+ const bool is_contig = BM_edge_is_contiguous(e);
+ float angle;
- if (/* may have become non-manifold */
- BM_edge_is_manifold(e) &&
- /* check twice because cumulative effect could dissolve over angle limit */
- (BM_edge_calc_face_angle(e) < angle_limit))
+ /* may have become non-manifold */
+ if (!BM_edge_is_manifold(e)) {
+ continue;
+ }
+
+ if ((delimit & BMO_DELIM_SEAM) &&
+ (BM_elem_flag_test(e, BMO_DELIM_SEAM)))
{
+ continue;
+ }
+
+ if ((delimit & BMO_DELIM_MATERIAL) &&
+ (e->l->f->mat_nr != e->l->radial_next->f->mat_nr))
+ {
+ continue;
+ }
+
+ if ((delimit & BMO_DELIM_NORMAL) &&
+ (is_contig == false))
+ {
+ continue;
+ }
+
+ /* check twice because cumulative effect could dissolve over angle limit */
+ angle = BM_edge_calc_face_angle(e);
+ if (is_contig == false) {
+ angle = (float)M_PI - angle;
+ }
+
+ if (angle < angle_limit) {
BMFace *f_new = BM_faces_join_pair(bm, e->l->f,
e->l->radial_next->f,
e,
@@ -223,7 +256,8 @@
MEM_freeN(weight_elems);
}
-void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries)
+void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries,
+ const BMO_Delimit delimit)
{
int vinput_len;
int einput_len;
@@ -231,7 +265,9 @@
BMVert **vinput_arr = BM_iter_as_arrayN(bm, BM_VERTS_OF_MESH, NULL, &vinput_len, NULL, 0);
BMEdge **einput_arr = BM_iter_as_arrayN(bm, BM_EDGES_OF_MESH, NULL, &einput_len, NULL, 0);
+
BM_mesh_decimate_dissolve_ex(bm, angle_limit, do_dissolve_boundaries,
+ delimit,
vinput_arr, vinput_len,
einput_arr, einput_len);
Modified: trunk/blender/source/blender/editors/interface/interface_templates.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_templates.c 2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/editors/interface/interface_templates.c 2013-06-03 05:07:16 UTC (rev 57216)
@@ -150,7 +150,7 @@
if ((id->name[2] == '.') && (str[0] != '.'))
continue;
- if (BLI_strcasestr(id->name + 2, str)) {
+ if (*str == '\0' || BLI_strcasestr(id->name + 2, str)) {
/* +1 is needed because name_uiprefix_id used 3 letter prefix
* followed by ID_NAME-2 characters from id->name
*/
Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c 2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c 2013-06-03 05:07:16 UTC (rev 57216)
@@ -3056,6 +3056,7 @@
BMesh *bm = em->bm;
const float angle_limit = RNA_float_get(op->ptr, "angle_limit");
const bool use_dissolve_boundaries = RNA_boolean_get(op->ptr, "use_dissolve_boundaries");
+ const int delimit = RNA_enum_get(op->ptr, "delimit");
char dissolve_flag;
@@ -3091,8 +3092,8 @@
}
if (!EDBM_op_callf(em, op,
- "dissolve_limit edges=%he verts=%hv angle_limit=%f use_dissolve_boundaries=%b",
- dissolve_flag, dissolve_flag, angle_limit, use_dissolve_boundaries))
+ "dissolve_limit edges=%he verts=%hv angle_limit=%f use_dissolve_boundaries=%b delimit=%i",
+ dissolve_flag, dissolve_flag, angle_limit, use_dissolve_boundaries, delimit))
{
return OPERATOR_CANCELLED;
}
@@ -3123,6 +3124,8 @@
RNA_def_property_float_default(prop, DEG2RADF(5.0f));
RNA_def_boolean(ot->srna, "use_dissolve_boundaries", 0, "All Boundaries",
"Dissolve all vertices inbetween face boundaries");
+ RNA_def_enum_flag(ot->srna, "delimit", mesh_delimit_mode_items, 0, "Delimit",
+ "Delimit dissolve operation");
}
static int edbm_split_exec(bContext *C, wmOperator *op)
Modified: trunk/blender/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_modifier_types.h 2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/makesdna/DNA_modifier_types.h 2013-06-03 05:07:16 UTC (rev 57216)
@@ -367,7 +367,8 @@
float percent; /* (mode == MOD_DECIM_MODE_COLLAPSE) */
short iter; /* (mode == MOD_DECIM_MODE_UNSUBDIV) */
- short pad;
+ char delimit; /* (mode == MOD_DECIM_MODE_DISSOLVE) */
+ char pad;
float angle; /* (mode == MOD_DECIM_MODE_DISSOLVE) */
char defgrp_name[64]; /* MAX_VGROUP_NAME */
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list