[Bf-blender-cvs] [61ad3f8] fracture_modifier: fix: improved "fix normals" in conjunction with autohide, might be slower, but looks way better with the right settings (as in fix normals search radius and autohide distance) now, using limited dissolve with keep normals operator (during autohide)

Martin Felke noreply at git.blender.org
Sat Feb 21 22:55:18 CET 2015


Commit: 61ad3f80b745fee314f1005ef4487a96bd5c19f3
Author: Martin Felke
Date:   Sat Feb 21 22:55:07 2015 +0100
Branches: fracture_modifier
https://developer.blender.org/rB61ad3f80b745fee314f1005ef4487a96bd5c19f3

fix: improved "fix normals" in conjunction with autohide, might be slower, but looks way better with the right settings (as in fix normals search radius and autohide distance) now, using limited dissolve with keep normals operator (during autohide)

===================================================================

M	source/blender/bmesh/intern/bmesh_opdefines.c
M	source/blender/modifiers/intern/MOD_fracture.c

===================================================================

diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c
index ded9fa5..11625c4 100644
--- a/source/blender/bmesh/intern/bmesh_opdefines.c
+++ b/source/blender/bmesh/intern/bmesh_opdefines.c
@@ -1107,6 +1107,30 @@ static BMOpDefine bmo_dissolve_faces_def = {
 };
 
 /*
+ * Limited Dissolve (Keep Normals).
+ *
+ * Dissolve planar faces and co-linear edges.
+ */
+static BMOpDefine bmo_dissolve_limit_keep_normal_def = {
+	"dissolve_limit_keep_normals",
+	/* slots_in */
+	{{"angle_limit", BMO_OP_SLOT_FLT}, /* total rotation angle (radians) */
+	 {"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'}},
+	},
+	/* slots_out */
+	{{"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
+	 {{'\0'}}},
+	bmo_dissolve_limit_exec,
+	(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
+	 BMO_OPTYPE_FLAG_SELECT_FLUSH |
+	 BMO_OPTYPE_FLAG_SELECT_VALIDATE),
+};
+
+/*
  * Limited Dissolve.
  *
  * Dissolve planar faces and co-linear edges.
@@ -2033,6 +2057,7 @@ const BMOpDefine *bmo_opdefines[] = {
 	&bmo_dissolve_faces_def,
 	&bmo_dissolve_verts_def,
 	&bmo_dissolve_limit_def,
+	&bmo_dissolve_limit_keep_normal_def,
 	&bmo_dissolve_degenerate_def,
 	&bmo_duplicate_def,
 	&bmo_holes_fill_def,
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 815ba10..97fe123 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2193,8 +2193,8 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
 	/* make kdtree of all faces of dm, then find closest face for each face*/
 	MPoly *mp = NULL;
 	MPoly *mpoly = dm->getPolyArray(dm);
-//	MLoop* mloop = dm->getLoopArray(dm);
-//	MVert* mvert = dm->getVertArray(dm);
+	MLoop* mloop = dm->getLoopArray(dm);
+	MVert* mvert = dm->getVertArray(dm);
 	int totpoly = dm->getNumPolys(dm);
 	KDTree *tree = BLI_kdtree_new(totpoly);
 	int i = 0;
@@ -2204,7 +2204,7 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
 	for (i = 0, mp = mpoly; i < totpoly; mp++, i++) {
 		float co[3];
 		DM_face_calc_center_mean(dm, mp, co);
-		//if (mp->mat_nr == 1)
+		if (mp->mat_nr == 1)
 		{
 			BLI_kdtree_insert(tree, i, co);
 		}
@@ -2216,7 +2216,7 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
 
 	for (i = 0, mp = mpoly; i < totpoly; mp++, i++)
 	{
-		//if (mp->mat_nr == 1)
+		if (mp->mat_nr == 1)
 		{
 			int index = -1, j = 0, r = 0;
 			KDTreeNearest *n;
@@ -2236,10 +2236,10 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
 
 			if (!BLI_ghash_haskey(fmd->face_pairs, SET_INT_IN_POINTER(index))) {
 
-				//int j = 0;
+				int j = 0;
 
 				BLI_ghash_insert(fmd->face_pairs, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(index));
-#if 0
+
 				/*match normals...*/
 				if (fmd->fix_normals)
 				{
@@ -2266,7 +2266,6 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
 						}
 					}
 				}
-#endif
 			}
 
 			if (n != NULL) {
@@ -2295,9 +2294,6 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm)
 
 	BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
 
-	//BM_mesh_elem_hflag_enable_all(bm, BM_EDGE, BM_ELEM_SELECT, false);
-	//BM_mesh_elem_hflag_disable_test(bm, BM_EDGE, BM_ELEM_SELECT, false, false, BM_ELEM_SMOOTH);
-
 	for (i = 0; i < totpoly; i++) {
 		BMFace *f1, *f2;
 		other = GET_INT_FROM_POINTER(BLI_ghash_lookup(fmd->face_pairs, SET_INT_IN_POINTER(i)));
@@ -2318,7 +2314,7 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm)
 		BM_face_calc_center_mean(f2, f_centr_other);
 
 
-		if ((len_squared_v3v3(f_centr, f_centr_other) < fmd->autohide_dist) && (f1 != f2) &&
+		if ((len_squared_v3v3(f_centr, f_centr_other) < (fmd->autohide_dist)) && (f1 != f2) &&
 		    (f1->mat_nr == 1) && (f2->mat_nr == 1))
 		{
 
@@ -2346,15 +2342,23 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm)
 
 	BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), "delete_keep_normals geom=%hf context=%i", BM_ELEM_SELECT, DEL_FACES);
 	BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE),
-	             "automerge_keep_normals verts=%hv dist=%f", BM_ELEM_SELECT, fmd->autohide_dist * 10, false); /*need to merge larger cracks*/
+	             "automerge_keep_normals verts=%hv dist=%f", BM_ELEM_SELECT,
+	             fmd->autohide_dist * 10); /*need to merge larger cracks*/
+
+	//BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
+	BM_mesh_elem_hflag_enable_all(bm, BM_EDGE, BM_ELEM_SELECT, false);
+	BM_mesh_elem_hflag_disable_test(bm, BM_EDGE, BM_ELEM_SELECT, false, false, BM_ELEM_SMOOTH);
 
-#if 0
 	//dissolve sharp edges
-	BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), "dissolve_edges_keep_normals edges=%he use_verts=%b use_face_split=%b",
-	             BM_ELEM_SELECT, true, false);
-#endif
+	//BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), "dissolve_edges_keep_normals edges=%he use_verts=%b use_face_split=%b",
+	//             BM_ELEM_SELECT, true, false);
 
-	BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_SELECT, false);
+	//dissolve sharp edges with limit dissolve
+	BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), "dissolve_limit_keep_normals "
+	             "angle_limit=%f use_dissolve_boundaries=%b verts=%av edges=%ae delimit=%i",
+	             DEG2RADF(1.0f), false, 0);
+
+	BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
 
 	result = CDDM_from_bmesh(bm, true);
 	BM_mesh_free(bm);




More information about the Bf-blender-cvs mailing list